VueJS:检索到的数据未捕获(在承诺中)TypeError:刷新时数组[0]未定义
我正在开发一个
vuejs
/
(vuex)
用于帖子的状态管理/firebase 项目。
所以我有一个 firestore 帖子集合(具有名称 id 所有者内容和创建时间戳的对象数组...),当用户想要访问单个帖子时,它会将他重定向到单个帖子的路线(..../view-post/postid)。
所有帖子均使用 getDocs 方法从 firestore 中检索,并将其存储在 blogPosts 变量中...
我正在使用一个数据及其数组,当已安装的生命周期钩子启动时称为
currentBlog: null
(当组件已安装时)我使用该数组并通过将所有帖子过滤到帖子 id,然后开始使用数组[0] 填充组件上的数据,如下所示:
async mounted() {
this.currentBlog = await this.blogPosts.filter((post) => {
return post.blogID == this.$route.params.blogid;
});
}
我的 html 标记(模板):
<section class="preview" v-if="currentBlog">
<h2>{{ currentBlog[0].blogTitle }}</h2>
<p>Posted on: <span>{{ dateFormat() }}</span> <span v-if="currentBlog[0].editTime">(Last edit:
{{ editFormat() }})</span></p>
<img class="blogCover" :src="currentBlog[0].blogCoverFileURL" :alt="currentBlog[0].blogCoverPhoto">
<div class="html-blog" v-html="currentBlog[0].blogHTML"></div>
<hr />
<div class="tags">
<h4>Tags:</h4>
<div class="tag" v-for="(tag,index) in currentBlog[0].blogTags" @click="filterPosts(tag)" :key="index">
{{ tag }}
</div>
</div>
<hr />
</section>
我使用第一个条件只是为了确保帖子在过滤完成时出现,但是……
现在我收到了帖子,我遇到的问题是当我从帖子刷新页面时,有时当我直接打开帖子时,会出现此错误:
Uncaught (in promise) TypeError: this.currentBlog[0] is undefined
有什么方法可以解决这些问题,甚至有任何建议的其他方法吗?
我首先想到的是,您在哪里运行使用 getDocs 获取 blogPosts 的函数。可能发生的情况是,获取博客文章的函数可以在您访问应用程序主页时运行并完成,但当您尝试直接查看帖子时,该函数尚未运行。
我建议在您的 v-if 上设置一个 v-if,它仅在获取博客文章数据后才解析为 true。
另一种方法是,您可以在查看博客文章组件中检查 Vuex 存储中的博客文章,如果它们不在那里,那么您可以从所述组件中获取它们。这可能并不理想,因为我认为您的整个应用程序都依赖于博客文章的数据。
这里 是一个例子
我还要注意,您不必等待过滤功能,如果您只想获取单个博客文章,那么在您的 Vuex 存储中创建一个执行此操作的 getter 可能会有所帮助。
currentBlog 的初始值是什么?
在您的模板中,您正在检查它是否为空,但如果数组为空,则它将进入
v-if
条件。
您的 v-if 应该是;
v-if="currentBlog && currentBlog.length"
这将确保
[0]
存在且可访问。
好吧,我发现的唯一解决方案是从路线(this。$route.params.blogid)获取博客的ID,并使用它直接从firebase检索单个数据!