让同位素等待 api 数据加载 - nuxt js
Make isotope wait till api data is loaded - nuxt js
我是 运行 一个显示来自 wordpress 数据的 nuxtjs 应用程序。在我的项目概览页面上,我希望将不同项目的图像显示为具有同位素和过滤功能的砌体。当我在 root 上打开网站并导航到项目页面 (/project) 时,一切都正确显示。当我重新加载页面或手动输入 URL 时,布局崩溃了。经过一些错误处理后,我发现在页面上重新加载同位素想要对卸载的项目数据进行布局。
在页面上输入 - “projekte geladen”。
重新加载/手动 - “keine projekte”。
代码:
<script>
/* eslint-disable */
let Isotope;
let imagesLoaded;
if (process.client) {
Isotope = require('isotope-layout');
imagesLoaded = require('imagesloaded')
}
export default {
mounted() {
this.isCaseStudy();
this.isotope();
},
computed: {
page(){
//return this.$store.getters.filterProject;
return this.pages.find(page => page.id === 110)
},
pages(){
return this.$store.state.pages;
},
projects(){
return this.$store.state.projects;
},
},
created(){
this.$store.dispatch("getPages");
this.$store.dispatch("getProjects");
},
methods: {
isCaseStudy(){
$(".item").each(function(){
$(this).has('img.case-studyImg').addClass('case-study');
});
},
isotope() {
console.log("isotope wird ausgeführt");
if(this.projects.length != 0){
console.log("projekte geladen!")
let iso = new Isotope('.items', {
itemSelector: '.item',
masonry: {
columnWidth: '.grid-sizer'
}
});
imagesLoaded(".items").on( 'progress', function() {
// layout Isotope after each image loads
console.log("each image loaded");
iso.layout();
});
}else{
console.log("keine projekte");
}
},
filterItems(selector) {
let oldActive = $(".filters .btn-primary").first();
console.log(oldActive);
if(oldActive.hasClass(selector)){
return;
}
let currentActive = $(".filters a." + selector).first();
console.log(currentActive);
currentActive.removeClass("btn-default").addClass("btn-primary");
oldActive.removeClass("btn-primary").addClass("btn-default");
iso.arrange({filter: `.${selector}`});
}
}
}
</script>
所以在重新加载函数 this.isotope() 之前,我相信从计算加载的 projects() 加载。
如果这是真正的问题,我如何在加载项目时完成同位素加载...
在您的情况下,当在 created()
挂钩中调度操作时,操作刚刚开始,但您不知道它们何时完成,其余代码继续执行。换句话说,在调用 this.isotope() 时,您的项目还没有在商店中。
由于您使用的是 Nuxt,最好的方法可能是使用 asyncData 挂钩。使用它,在第一次加载(刷新页面,或手动输入 url )时,asyncData 中的代码将在服务器上执行,因此您确定组件之前将具有 API 数据渲染。这也是一种更快的方法,因为您正在利用内置的 nuxt SSR。
另一种选择是使用 async/await。您可以看看 会是什么样子。你可能会得到这样的结果:
beforeMount() {
this.$store.dispatch('getPages');
this.$store.dispatch('getProjects');
},
商店中的 getPages 和 getProjects 函数使用 async/await
async getProjects(vuexContext) {
const projects = await this.$axios.$get('http://yourapi.com/projects')
commit('SET_PROJECTS', projects)
}
我是 运行 一个显示来自 wordpress 数据的 nuxtjs 应用程序。在我的项目概览页面上,我希望将不同项目的图像显示为具有同位素和过滤功能的砌体。当我在 root 上打开网站并导航到项目页面 (/project) 时,一切都正确显示。当我重新加载页面或手动输入 URL 时,布局崩溃了。经过一些错误处理后,我发现在页面上重新加载同位素想要对卸载的项目数据进行布局。 在页面上输入 - “projekte geladen”。 重新加载/手动 - “keine projekte”。
代码:
<script>
/* eslint-disable */
let Isotope;
let imagesLoaded;
if (process.client) {
Isotope = require('isotope-layout');
imagesLoaded = require('imagesloaded')
}
export default {
mounted() {
this.isCaseStudy();
this.isotope();
},
computed: {
page(){
//return this.$store.getters.filterProject;
return this.pages.find(page => page.id === 110)
},
pages(){
return this.$store.state.pages;
},
projects(){
return this.$store.state.projects;
},
},
created(){
this.$store.dispatch("getPages");
this.$store.dispatch("getProjects");
},
methods: {
isCaseStudy(){
$(".item").each(function(){
$(this).has('img.case-studyImg').addClass('case-study');
});
},
isotope() {
console.log("isotope wird ausgeführt");
if(this.projects.length != 0){
console.log("projekte geladen!")
let iso = new Isotope('.items', {
itemSelector: '.item',
masonry: {
columnWidth: '.grid-sizer'
}
});
imagesLoaded(".items").on( 'progress', function() {
// layout Isotope after each image loads
console.log("each image loaded");
iso.layout();
});
}else{
console.log("keine projekte");
}
},
filterItems(selector) {
let oldActive = $(".filters .btn-primary").first();
console.log(oldActive);
if(oldActive.hasClass(selector)){
return;
}
let currentActive = $(".filters a." + selector).first();
console.log(currentActive);
currentActive.removeClass("btn-default").addClass("btn-primary");
oldActive.removeClass("btn-primary").addClass("btn-default");
iso.arrange({filter: `.${selector}`});
}
}
}
</script>
所以在重新加载函数 this.isotope() 之前,我相信从计算加载的 projects() 加载。 如果这是真正的问题,我如何在加载项目时完成同位素加载...
在您的情况下,当在 created()
挂钩中调度操作时,操作刚刚开始,但您不知道它们何时完成,其余代码继续执行。换句话说,在调用 this.isotope() 时,您的项目还没有在商店中。
由于您使用的是 Nuxt,最好的方法可能是使用 asyncData 挂钩。使用它,在第一次加载(刷新页面,或手动输入 url )时,asyncData 中的代码将在服务器上执行,因此您确定组件之前将具有 API 数据渲染。这也是一种更快的方法,因为您正在利用内置的 nuxt SSR。
另一种选择是使用 async/await。您可以看看
beforeMount() {
this.$store.dispatch('getPages');
this.$store.dispatch('getProjects');
},
商店中的 getPages 和 getProjects 函数使用 async/await
async getProjects(vuexContext) {
const projects = await this.$axios.$get('http://yourapi.com/projects')
commit('SET_PROJECTS', projects)
}