Vue/Vuex 在创建的钩子中等待异步调度

Posted

技术标签:

【中文标题】Vue/Vuex 在创建的钩子中等待异步调度【英文标题】:Vue/Vuex wait for async dispatch in created hook 【发布时间】:2021-05-06 04:16:12 【问题描述】:

我无法使从 firebase 获取数据的函数异步:

当组件被创建时,我有:

created()
  this.$store.dispatch("fetchSections"); 

Vuex 动作:

actions: 
  async fetchSections( commit ) 
    var sectionsRef = db.collection("sections");
    try 
      await sectionsRef.get().then((querySnapshot) => 
        var collect = querySnapshot.docs.map((doc) => doc.data());
        commit("addToSections", collect);
      );
     catch (error) 
      console.log(error.message + " -- " + error.statusText);
    
  ,

问题:在我们获取数据之前创建了另一个组件。

我也试过这个:

actions: 
  async fetchSections( commit ) 
    var sectionsRef = db.collection("sections");
    try 
      let allSections = await sectionsRef.get();
      for (const doc of allSections.docs) 
        var collect = doc.data();
        commit("addToSections", collect);
      
     catch (error) 
      console.log(error.message + " -- " + error.statusText);
    
  ,
,

【问题讨论】:

【参考方案1】:

组件的created钩子不允许延迟渲染,只提供一些代码在组件生命周期的那个时刻运行。

当使用钩子对数据进行异步调用时,您可以使用v-if 来防止依赖该数据的子元素出错:

<div v-if="someData && someData.length">
  <div v-for="item in someData" :key="item.id">
     item 
  </div>
</div>
<div v-else>
  Loading...
</div>

没有v-ifv-for 将尝试访问可能尚不存在的someData,并且在访问someData 的属性时可能会引发错误。

【讨论】:

以上是关于Vue/Vuex 在创建的钩子中等待异步调度的主要内容,如果未能解决你的问题,请参考以下文章

异步调用和创建线程

Redux thunk:如何等待异步操作的完成

调度操作后获取 vuex 存储状态

Vuejs:如何在创建的钩子中获取计算属性

如何等待异步调度的块完成?

如何在 useReducer 钩子中发出异步服务器请求?