vue中页面刷新后如何显示加载的数据?
How to display loaded data after page refresh in vue?
我有一个包含一些项目的组件,这些项目是使用 get request
方法从 api 加载的。当我点击一个项目时,我使用动态路由被重定向到它自己的页面:{ path: '/:id', component: Item }
。使用 currentItem()
方法识别单击的项目:currentItem() { this.items.find(item => item.code === this.$route.params.id) }
其中 item.code
是我从 api 获得的 属性。
我的问题是,当我用当前项目刷新页面时,它不再加载了。我尝试使用 beforeCreate()
在它们自己的组件中再次加载项目。也许我可以使用 watch
来根据项目更改状态?
beforeCreate() {
this.$http.get(url).then(response => {
this.items = response.body;
}
},
watch: {
'$route' (to, from) {
this.currentItem()
}
}
这里是 demo。
您应该为 $route
添加 watch
,以便在页面之间导航时对 id
更改做出反应。但在这种情况下,currentItem
return 有可能为空,因为您的请求将在 监视处理程序已调用 后结束。
第一个解决方案是监视 Item
组件中的 items
集合并在此监视处理程序中调用 this.currentItem()
。是的,您必须像示例中那样在 Item
组件中加载 items
。
第二个是使用 computed
属性 currentItem
代替方法,如果可能的话:
computed: {
currentItem() {
return this.items.find(item => item.code === this.$route.params.id)
}
}
这将是被动的,您不再需要观看。但是不要忘记默认使 this.items
为空数组以避免空错误。
第三个解决方案是结合第二个解决方案,使用 Vuex 存储在所有组件之间共享项目集合并执行如下操作:
beforeCreate() {
// you should check in this action that items already loaded earlier as well
this.$store.dispatch('loadItems');
},
computed: {
currentItem() {
return this.items.find(item => item.code === this.$route.params.id)
},
items() {
return this.$store.state.items
}
}
商店:
state: {
items: [],
itemsLoaded: false,
}
actions: {
loadItems({state, commit}) {
// avoid unnecessary loading between navigations
if (itemsLoaded) return
Vue.http.get('some url').then(response => {
commit('setItems', response.body);
commit('itemsLoaded');
}
}
},
mutations: {
setItems: (state, items) => state.items = items
itemsLoaded: (state) => state.itemsLoaded = true
}
例如,您不需要在 Item 和 Items 组件中存储项目。
很抱歉post。
我有一个包含一些项目的组件,这些项目是使用 get request
方法从 api 加载的。当我点击一个项目时,我使用动态路由被重定向到它自己的页面:{ path: '/:id', component: Item }
。使用 currentItem()
方法识别单击的项目:currentItem() { this.items.find(item => item.code === this.$route.params.id) }
其中 item.code
是我从 api 获得的 属性。
我的问题是,当我用当前项目刷新页面时,它不再加载了。我尝试使用 beforeCreate()
在它们自己的组件中再次加载项目。也许我可以使用 watch
来根据项目更改状态?
beforeCreate() {
this.$http.get(url).then(response => {
this.items = response.body;
}
},
watch: {
'$route' (to, from) {
this.currentItem()
}
}
这里是 demo。
您应该为 $route
添加 watch
,以便在页面之间导航时对 id
更改做出反应。但在这种情况下,currentItem
return 有可能为空,因为您的请求将在 监视处理程序已调用 后结束。
第一个解决方案是监视 Item
组件中的 items
集合并在此监视处理程序中调用 this.currentItem()
。是的,您必须像示例中那样在 Item
组件中加载 items
。
第二个是使用 computed
属性 currentItem
代替方法,如果可能的话:
computed: {
currentItem() {
return this.items.find(item => item.code === this.$route.params.id)
}
}
这将是被动的,您不再需要观看。但是不要忘记默认使 this.items
为空数组以避免空错误。
第三个解决方案是结合第二个解决方案,使用 Vuex 存储在所有组件之间共享项目集合并执行如下操作:
beforeCreate() {
// you should check in this action that items already loaded earlier as well
this.$store.dispatch('loadItems');
},
computed: {
currentItem() {
return this.items.find(item => item.code === this.$route.params.id)
},
items() {
return this.$store.state.items
}
}
商店:
state: {
items: [],
itemsLoaded: false,
}
actions: {
loadItems({state, commit}) {
// avoid unnecessary loading between navigations
if (itemsLoaded) return
Vue.http.get('some url').then(response => {
commit('setItems', response.body);
commit('itemsLoaded');
}
}
},
mutations: {
setItems: (state, items) => state.items = items
itemsLoaded: (state) => state.itemsLoaded = true
}
例如,您不需要在 Item 和 Items 组件中存储项目。
很抱歉post。