开发者问题收集

VueJS:检索到的数据未捕获(在承诺中)TypeError:刷新时数组[0]未定义

2022-09-03
515

我正在开发一个 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

有什么方法可以解决这些问题,甚至有任何建议的其他方法吗?

3个回答

我首先想到的是,您在哪里运行使用 getDocs 获取 blogPosts 的函数。可能发生的情况是,获取博客文章的函数可以在您访问应用程序主页时运行并完成,但当您尝试直接查看帖子时,该函数尚未运行。

我建议在您的 v-if 上设置一个 v-if,它仅在获取博客文章数据后才解析为 true。

另一种方法是,您可以在查看博客文章组件中检查 Vuex 存储中的博客文章,如果它们不在那里,那么您可以从所述组件中获取它们。这可能并不理想,因为我认为您的整个应用程序都依赖于博客文章的数据。

这里 是一个例子

我还要注意,您不必等待过滤功能,如果您只想获取单个博客文章,那么在您的 Vuex 存储中创建一个执行此操作的 getter 可能会有所帮助。

Marcus
2022-09-04

currentBlog 的初始值是什么? 在您的模板中,您正在检查它是否为空,但如果数组为空,则它将进入 v-if 条件。

您的 v-if 应该是;

v-if="currentBlog && currentBlog.length"

这将确保 [0] 存在且可访问。

Benjamin James Kippax
2022-09-11

好吧,我发现的唯一解决方案是从路线(this。$route.params.blogid)获取博客的ID,并使用它直接从firebase检索单个数据!

ALLAOUA Okba
2022-09-05