【发布时间】:2021-05-12 14:27:36
【问题描述】:
这是我在 pages 目录,文件夹“blogs”中名为“index.vue”的页面。
<template>
<blog-grid :v-if="blogsList.length>0" :v-for="item in blogsList" :item="item"></blog-grid>
</template>
<script>
export default {
async asyncData(context) {
let $axios=context['$axios']
let res = await $axios.$get('http://localhost:3001/blogs')
return {
blogsList: res.blog_items,
}
},
created() {
console.log(this.blogsList)
}
}
</script>
我在控制台中获得了 blogsList,一切都很好。现在我希望该组件得到它的道具“项目”,但没有。 这是 components 文件夹中的 blog-grid.vue
<template>
<div :id="item.id"></div>
</template>
<script>
export default {
props: ['item'],
data(){
console.log(this.item)
},
mounted(){
console.log(this.item)
}
}
</script>
我在这里得到两个 undefined 和 nuxt 错误,“item”没有正确注册。
这是一个正常的 Vue 组件行为,可以在浏览器中工作,但不能在 Nuxtjs 中工作。我通过了道具,有什么问题?
更让我烦恼的是,同样的结构也适用于另一个页面文件夹“产品”,只是不明白。
我在这里做错了什么?为什么 prop 没有通过?
UPD:如果我在 index.vue 中将变量“item”更改为“index”,则会失败并出现错误“index”未定义但在渲染期间被引用。什么鬼???
UPD:如果我将 asyncData 更改为以下内容:
return {
blogsList: res.blog_items[0],
}
并摆脱循环,只需传递项目然后一切顺利,没有错误。所以麻烦在于数组循环。 Typeof 显示 Object, Array 很好,我认为这里没有问题。完全被绊倒了。
UPD:我犯了最愚蠢的错误。我找到了,它就在这里
<blog-grid :v-if="blogsList.length>0" :v-for="item in blogsList" :item="item"></blog-grid>
v-if 和 v-for 是 v-bounded,不应该是。我的天哪,真是令人畏缩。
【问题讨论】:
-
调试
blogsList,这很可能不是您所期望的。同时从data中删除console。那条线没有任何意义。 -
这可能是因为您的组件
blog-grid.vue在您仍在从后端获取数据时已挂载,这就是它未定义的原因。另外,不要使用v-for+v-if: vuejs.org/v2/guide/conditional.html#v-if-with-v-for 你也可以使用 Nuxt 的新fetch钩子:它确实有方便的助手,如$fetchState.pending: nuxtjs.org/docs/2.x/components-glossary/pages-fetch
标签: javascript node.js vue.js nuxt.js