【发布时间】:2021-11-09 16:06:48
【问题描述】:
我有疑问..
在我的 Nuxt 静态项目页面(Nuxt 版本 => 2.12)中,我需要快速恢复数据。
假设:
使用 asyncData,检查速度目标,因为使用 asyncData 我可以在组件渲染期间获取数据。但是这个项目有 3 种不同的 API 调用,与我设置的语言一样多,当我选择一种语言时,值会保存在 Vuex 存储中。
在这个过程的同时,语言值也保存在本地存储中,所以,如果我只使用asyncData,当页面刷新时API调用将不会正确调用保存的语言(asyncData可以'不访问本地存储)。
这里,fetch钩子进入游戏,将watch设置在store的状态语言值上,它可以触发fetch并获取正确的数据。此外,即使页面被刷新,能够读取本地存储值的 fetch 钩子也能很好地工作。
那么我为什么不只使用 fetch 挂钩呢?因为 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'
}
}
只是为了补充信息,我想进一步说代码运行良好,这是关于最佳实践的问题。
【问题讨论】:
-
asyncData可以读取您的本地存储。您可以通过访问 VUEX 商店访问asyncData中的语言。那么那里是未定义的吗?也许问题出在代码上,它从本地存储填充了 VUEX 存储 -
我从上下文的 asyncData 访问存储:语言:context.store.state.language。但是,当我刷新页面时,我保存在本地存储中并且需要进行正确的 API 调用的存储中语言的状态被初始化,即 context.store.state.language.language = " " 而不是 context.store.state.language.language = "es"。
-
能否添加代码,从本地存储中填充语言存储值?
-
我使用一个库:vuex-persistedstate。我创建了一个 nuxt 插件: import createPersistedState from 'vuex-persistedstate' export default ({ store }) => { createPersistedState({ key: 'vuex', paths: ['language'] })(store) } 所以,在每个刷新我不会失去我的价值npmjs.com/package/vuex-persistedstate
标签: vue.js fetch nuxt.js hook asyncdata