Firestore + Vue:刷新页面时,如何避免数据显示延迟?

Posted

技术标签:

【中文标题】Firestore + Vue:刷新页面时,如何避免数据显示延迟?【英文标题】:Firestore + Vue: When refreshing the page, how to avoid delay in data display? 【发布时间】:2021-11-09 01:44:24 【问题描述】:

每次我刷新页面时,都会在 Firestore 数据库中进行一个新查询,以向用户显示(有时)相同的数据。

这是一个书柜。下面的代码只读取已经添加的数据:

export default 
  name: "Shelf",
  date: () => ( shelfName: "", books: [] ),
  async mounted() 
    const auth = getAuth();
    const db = getFirestore();
    const userID = auth.currentUser.uid;
    const userRef = doc(db, "users", userID);
    const userSnap = await getDoc(userRef);

    userSnap.exists()
      ? (this.shelfName = "Shelf: " + userSnap.data().name)
      : (this.shelfName = "Your Shelf");

    const userBooksRef = query(collection(db, "users", userID, "addedBooks"));
    const querySnapshot = await getDocs(userBooksRef);
    querySnapshot.forEach((doc) => 
      this.books.push(
        id: doc.id,
        addedIn: doc.data().addedIn,
        readIn: doc.data().readIn,
      );
    );

    this.books.map(async (book) => 
      const booksRef = doc(db, "books", book.id);
      const bookSnap = await getDoc(booksRef);

      book.authors = bookSnap.data().authors;
      book.title = bookSnap.data().title;
      book.thumbnail = bookSnap.data().thumbnail;
    );
  ,
;

我不确定是否应该寻找缓存解决方案,或者是否有其他类型的解决方案。 下面我展示了books 集合。重要的是要说在 users 集合中有一个名为 addedBooks 的集合,它引用了下面每本书的 id:

【问题讨论】:

这就是全局存储 (Vuex) 的用途。 【参考方案1】:

刷新页面时,您正在销毁应用程序的前一个实例并加载一个新实例。因此,您的应用将像第一次打开应用一样重新执行所有查询。

正如 Estus 在 cmets 中提到的,这个问题通常通过将数据存储在 state 中,然后将该 state 放入 localstorage 来解决。当您的页面刷新时,您首先从 localstorage 加载状态(无延迟),然后在查询可用时使用查询中的当前数据更新状态。您也可以手动实现此过程,而无需使用状态管理库。

在本地存储中存储数据时,请确保每次数据更改时都更新它,并在不再需要时将其清除。

【讨论】:

你的解释很好!!我使用 Vue.js 已经有一段时间了,但我仍然不知道这些库。我正在研究更多关于 Vuex 的信息,并确保它的实现简单易懂。 @Arnon 如果这个答案有帮助,记得点赞并接受它以结束问题:) 是的,当然,伙计。我只是将我正在学习的有关 Vuex 的概念应用到我的项目中。如果我可以毫无疑问地将这个文件“迁移”到 Vuex,我会接受你的回答。如果没有,我会用更具体的内容编辑我的问题。

以上是关于Firestore + Vue:刷新页面时,如何避免数据显示延迟?的主要内容,如果未能解决你的问题,请参考以下文章

Vuejs 和 Firestore - 如何在 Firestore 中的数据更改时进行更新

vue常见问题处理 -- 页面刷新时,如何保持原有vuex中的state信息

如何防止 Vue.js 中的子路由在页面刷新时丢失样式

在Vue中重新加载或刷新页面时如何显示正确的嵌套子选项卡

vue选择性刷新组件&如何实现优雅的刷新页面

vue如何只刷新当前页面