一起使用 fetch 和 asyncData

Use fetch and asyncData together

我有疑问..

在我的Nuxt静态项目页面(Nuxt版本=> 2.12),我需要快速恢复数据。

假设:

使用 asyncData,检查速度 objective,因为使用 asyncData 我可以在组件渲染期间获取数据。但是这个项目有 3 种不同的可能 API 调用,与我设置的语言一样多,当我 select 一种语言时,该值保存在 Vuex 存储中。

在这个过程的同时,语言值也保存在本地存储中,所以,如果我只使用 asyncData,当页面刷新时,API 调用将不是正确的调用保存的语言(asyncData 无法访问本地存储)。

到这里fetch hook进入游戏,watch设置store的state language值,可以触发fetch获取正确的数据。此外,即使页面刷新,fetch hook 也可以读取本地存储的值,可以很好地发挥作用。

那我为什么不只使用 fetch hook?因为 fetch 比 asyncData 慢。

问题:

同时使用 fetch 和 asyncData 是反模式吗?

有没有更好的方法?

这是我的代码:

export default {
  asyncData (context) {
    const slug = (context.route.path === '/' || context.route.path === '') ? '/home' : context.route.path
    return context.app.$storyapi
      .get(`cdn/stories${slug}`, {
        language: context.store.state.language.language
      }).then((res) => {
        return res.data
      }).catch((res) => {
        context.$errorMessage(res.response,
          'Sorry but this content doesn\'t extist', `Sorry, but the content called: "${context.route.name}" has a problem or doesn't exist`
        )
      })
  },
  data () {
    return {
      story: {
        content: {}
      }
    }
  },
  async fetch () {
    const slug = (this.$route.path === '/' || this.$route.path === '') ? '/home' : this.$route.path
    const { data } = await this.$storyapi.get(`cdn/stories${slug}`, {
      language: this.$store.state.language.language
    })
    this.story = data.story
  },
  watch: {
    '$store.state.language.language': '$fetch'
  }
}

为了完善信息,我想进一步说明代码运行良好,这是关于最佳实践的问题。

从什么时候 fetch()asyncData() 慢?
另外,如果你真的需要重新 运行 一些你完全可以 use await this.$nuxt.refresh().
你可能 运行 这两个,但它们可以做同样的事情,所以它有点重复,我建议只选择一个。

我不确定它在 localStorage 中的位置是个问题,但您可以使用其中一个可用的包来通用存储此数据,例如:https://github.com/unjs/unstorage
如果没有,cookie 也应该足够了(在服务器和客户端上都可用)。