【问题标题】:How to refresh the data obtained by Async Data() in NuxtJs?NuxtJs中如何刷新Async Data()获取的数据?
【发布时间】:2019-05-18 04:38:58
【问题描述】:

在 NuxtJs 应用程序中,我通过 AsyncData() 方法在服务器端获取了 data()。

例如,我需要在不重新启动浏览器的情况下删除一个条目并刷新页面。

在纯 Vue 中,我会编写一个 ajax 方法来在删除后从服务器更新数据。通常此方法与初始加载相同,位于“已安装”中。但是 NuxtJs 我不能再次访问方法 async Data() 。或者我可以吗?

   async asyncData({$axios, params}) {
        const {data} = await $axios.$get(`/topics/${params.id}`)

        return {
            topic: data
        }
    },

  -------------------------

   async deletePost(id) {
            await  this.$axios.$delete(`/topics/${this.topic.id}/posts/${id}`)
                // bad idea - hard reset
                   window.location.reload(true)
                //how refresh by asyncData()?
    },

【问题讨论】:

    标签: vue.js vuejs2 nuxt.js


    【解决方案1】:

    这很容易在任何组件中使用$nuxt 帮助器完成:

    await this.$nuxt.refresh()
    

    见https://nuxtjs.org/docs/internals-glossary/$nuxt/#refreshing-page-data

    【讨论】:

    • 这应该是公认的解决方案。非常优雅和简单!
    • 非常感谢!!!我找了一个多小时来解决存储状态已更新但页面组件未更新的问题。
    【解决方案2】:

    您无法访问 asyncData 方法,因为它在渲染之前由服务器端的 nuxt 调用。但是,您当然可以操作镜像 asyncData 的数据对象。所以我猜你有一个像这样的数据组件:

    data() {
      return {
        topic: [],
      }
    }
    

    它与 asyncData 返回的内容合并,是客户端中显示的内容。因此,无需重新加载页面,您就可以操纵“主题”,它将反映在客户端中。像这样的:

    async deletePost(id) {
      await this.$axios.$delete(`/topics/${this.topic.id}/posts/${id}`)
      this.topic... //change it to reflect what was deleted.
    },
    

    或者然后您可以在删除调用后以相同的方法进行另一个 api 调用。

    await this.$axios.$delete(`/topics/${this.topic.id}/posts/${id}`)
      let {data} = await $axios.$get(`/topics/${this.topic.id}`)
      return this.topic = data
    },
    

    无论哪种方式,您都可以在删除调用后更新“主题”数组,这就是您的客户端中显示的内容。

    【讨论】:

    • 会导致失去nuxt ssr优势吗?因为它只是一个ajax调用
    猜你喜欢
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多