【发布时间】:2022-01-17 20:13:22
【问题描述】:
我有一个加载产品详细信息的动态页面,但是 html 是在数据之前加载的。
因此,当我尝试使用像图像这样的静态元素时,我收到一条错误消息,指出对象“产品”不存在。
为了解决这个问题,我给了每个动态元素 v-if="product != undefined",它确实有效,但似乎不是解决这个问题的好方法。
我正在像这样通过商店初始化我的数据
在我的页面中:
async mounted() {
await this.fetchProducts()
},
computed: {
product() {
return this.$store.state.products.producten.filter(product => product.id == this.$route.params.id)[0]
}
}
然后在我的商店:
export const state = () => ({
producten: []
})
export const mutations = {
setProducts(state, data) {
state.producten = data
}
}
export const actions = {
async fetchProducts({ commit }) {
await axios.get('/api/products')
.then(res => {
var data = res.data
commit('setProducts', data)
})
.catch(err => console.log(err));
}
}
我尝试将mounted() 替换为:
beforeMount(),
created(),
fetch()
但似乎没有一个工作。
我也试过了:
fetch() {return this.$store.dispatch('fetchProducts')}
Loader(v-if="$fetchState.pending")
Error(v-if="$fetchState.pending")
.product(v-else)
// Product details...
【问题讨论】:
-
如果你尝试
v-if="product.length"会怎样(检查你是否有一个填充的数组)。如果您有一个空数组,v-if中的条件将是虚假的,并且不会显示任何内容。此外,更喜欢在您的商店中使用async/await,而不是.then(已弃用)。最后,您需要等待数据被填充,而您的模板是同步的,并且不会在空的内容上循环。 $fetchState.pending 是一个非常好的解决方案。还有asyncData. -
为什么我会使用
v-if="product.length"而不是v-if="product != undefined"更好?因为他们都工作。我只是觉得这是解决这个问题的一种非常丑陋的方式。 -
因为产品永远不会是
undefined查看filter method 返回的内容。另一种解决方案是使用来自 lodash 的isEmpty。通常,有一个基本的虚假条件就足够了。这很丑陋,因为 JavaScript 中的类型强制很糟糕,而且我们缺乏真正的核心库来处理这类事情。 -
如果您认为我在这里以某种方式提供了帮助,请随时对第一条评论中链接的答案投赞成票。
标签: javascript vue.js nuxt.js pug store