Nuxt 等待异步 + vuex

Posted

技术标签:

【中文标题】Nuxt 等待异步 + vuex【英文标题】:Nuxt await async + vuex 【发布时间】:2021-11-01 04:22:47 【问题描述】:

我正在使用 nuxt 和 vuex。在 vuex 中获取数据:

actions: 
    get_posts(ctx) 
      axios.get("http://vengdef.com/wp-json/wp/v2/posts").then(post => 
        let posts = post.data;


        if (!posts.length) return;

        let medias_list = "";
        posts.forEach(md => 
          medias_list += md.featured_media + ","
        );
        medias_list = medias_list.slice(0, -1);


        let author_list = "";
        posts.forEach(md => 
          author_list += md.author + ","
        );
        author_list = author_list.slice(0, -1);


        axios.all([
          axios.get("http://vengdef.com/wp-json/wp/v2/media?include=" + medias_list),
          axios.get("http://vengdef.com/wp-json/wp/v2/users?include=" + author_list),
          axios.get("http://vengdef.com/wp-json/wp/v2/categories"),
        ]).then(axios.spread((medias, authors, categories) => 

          ctx.commit("set_postlist", medias, authors, categories );

        )).catch((err) => 
          console.log(err)
        );


      )
    
  ,

在 vuex 状态下,我有来自下面的 exaple 的动态 postlist。 我如何在 Nuxt 中使用它?

在 nuxt 我知道 async fetch 和 asyncData。

async fetch () 
    this.$store.dispatch("posts/get_posts");

那不行。

在 vuex 操作加载所有数据之前,我如何对 nuxt 说,等待加载页面?

【问题讨论】:

等待这个。$store.dispatch("posts/get_posts");也许就足够了 【参考方案1】:

正如你已经提到的,有:

获取挂钩 异步数据

并且差异已经很好地描述了here

您的代码不起作用的原因可能在于您的商店操作。 它应该返回一个promise,尝试在axios get方法之前添加return ->

get_posts(ctx) 
      return axios.get(...
    // ...

然后,在您的页面上:

async fetch () 
    await this.$store.dispatch("posts/get_posts");

另外,在上面的评论中你说你不想在存储中提交数据:

...仅在 vuex 之后加载页面,我不需要在 vuex 中传递数据

但是你用这一行来做:

ctx.commit("set_postlist", medias, authors, categories );

如果您不想保存数据,只需将上面的行替换为:

return Promise.resolve( medias, authors, categories )

并在您的页面上获取它:

async fetch () 
    this.posts = await this.$store.dispatch("posts/get_posts");
    // now you can use posts in template 

【讨论】:

【参考方案2】:

误读了实际问题,因此更新

使用 Nuxt,您可以使用 asyncData(),但语法会有所改变,并且渲染将完全阻塞,直到所有调用完成。

或者使用fetch() 和一些skeletons 的组合来实现平滑过渡(也就是不阻塞渲染),或者使用带有$fetchState.pending 助手的加载器。

更多信息可以在这里找到:https://nuxtjs.org/docs/2.x/features/data-fetching#the-fetch-hook


旧的(不相关的)答案

如果你想将参数传递给你的 Vuex 动作,你可以这样调用它

async fetch () 
  await this.$store.dispatch('posts/get_posts', variableHere)

在 Vuex 中,访问它就像

get_posts(ctx, variableHere) 

你可以在下面使用。


PS:尝试在任何地方使用async/await

PS2:另外,你可以直接用类似这样的方式 destructure 上下文

get_posts( commit , variableHere) 
  ...
  commit('set_postlist', medias, authors, categories)

【讨论】:

这不是我需要的原因,请阅读帖子。在 vuex 获取数据之前,我需要说 nuxt wait。并且只在 vuex 之后加载页面,我不需要在 vuex 中传递数据 @ЕвгенийВенеград 如果你想拥有fetch() 和阻塞的东西,你需要将你的获取逻辑导出到middleware。这应该可以正常工作。

以上是关于Nuxt 等待异步 + vuex的主要内容,如果未能解决你的问题,请参考以下文章

如何等待从 Vuex 上传的数据?

使用异步操作时,来自 Vuex 的 NUXT 属性不会在 DOM 中更新

了解Vue和返回以及异步等待

VueJS Vuex - 解决状态变化的承诺?

VueX 等待突变执行

如何等待视图组件的 Vuex 状态初始化?