Vue.js Vue Vuex:旧数据在计算属性更改之前保留一段时间
我是vuex的新手,但我还是过度使用了它。比如说,我的商店状态中有一个产品列表。当我查看一个产品时,我使用该product.id调用axios并将产品数据提交到当前产品状态。然后,如果我查看另一个产品,则该页面将呈现当前产品状态,即old 首先是数据,然后是我的操作提交后。。然后将其更新为新获取的currentProduct,然后vue将我的视图数据更改为新数据。用户可以清楚地看到旧数据被新数据替换。 但我只想在新数据提交到我的状态后加载页面 我的渲染页面: 此页面显示我的产品列表Vue.js Vue Vuex:旧数据在计算属性更改之前保留一段时间,vue.js,vuejs2,vue-component,vuex,Vue.js,Vuejs2,Vue Component,Vuex,我是vuex的新手,但我还是过度使用了它。比如说,我的商店状态中有一个产品列表。当我查看一个产品时,我使用该product.id调用axios并将产品数据提交到当前产品状态。然后,如果我查看另一个产品,则该页面将呈现当前产品状态,即old 首先是数据,然后是我的操作提交后。。然后将其更新为新获取的currentProduct,然后vue将我的视图数据更改为新数据。用户可以清楚地看到旧数据被新数据替换。 但我只想在新数据提交到我的状态后加载页面 我的渲染页面: 此页面显示我的产品列表 'produ
'productList.vue'
<div v-for="product in productList" @click="viewProduct(product.id)">
<p>{{product.name}}</p>
</div>
computed(){
...mapState(['productList'])
},
methods:{
viewProduct(product_id){
this.$store.state.dispatch('fetchProducts', product_id);
}
}
此页面呈现该特定产品的视图
`product.vue`
<div>
<p>{{currentProduct.name}}</p>
</div>
computed(){
...mapState(['currentProduct'])
}
在my product.vue中,首先显示旧数据,然后在一段时间后新数据将替换它。。。有东西不见了。。我希望直接看到新数据,而不希望看到旧数据被新数据替换。vuex是否有解决方法?为此,您应该使用async await,以便只有在检索到新数据后才能更新组件
async fetchProducts(){
await const response = fetch...... // logic to fetch product
commit('UPDATE_CURRENT_PRODUCT', response.data);
}
在viewProduct方法中也是如此。
请参阅下面的llink以了解更多详细信息页面上的SLAST示例
为此,您应该使用async await,以便只有在检索到新数据后才能更新组件
async fetchProducts(){
await const response = fetch...... // logic to fetch product
commit('UPDATE_CURRENT_PRODUCT', response.data);
}
在viewProduct方法中也是如此。
请参阅下面的llink以了解更多详细信息页面上的SLAST示例
关键部分是:
我只想在新数据提交到我的状态后加载页面
您希望使异步方法相互遵循。有一种很酷的方法可以做到这一点
我猜在fetchProducts中,axios可以获取/发布数据。因为axios是基于承诺的,所以您可以带着它回来
fetchProducts() {
return axios.get('/get/some/data')
.then(r => { // commit and stuff
})
.catch(e => { // error handling
})
}
然后您可以轻松地执行以下操作:
this.$store.state.dispatch('fetchProducts', product_id)
.then(r=> {if(r){ // get the data from vuex
} else { // error
})
.catch(e => {});
调度的then在轴的then之后运行。e、 g:如果有两个axios调用必须顺序运行的东西,可以使用first的then方法调用第二个,这样就解决了问题
我希望你能理解这一点 关键部分是:
我只想在新数据提交到我的状态后加载页面
您希望使异步方法相互遵循。有一种很酷的方法可以做到这一点
我猜在fetchProducts中,axios可以获取/发布数据。因为axios是基于承诺的,所以您可以带着它回来
fetchProducts() {
return axios.get('/get/some/data')
.then(r => { // commit and stuff
})
.catch(e => { // error handling
})
}
然后您可以轻松地执行以下操作:
this.$store.state.dispatch('fetchProducts', product_id)
.then(r=> {if(r){ // get the data from vuex
} else { // error
})
.catch(e => {});
调度的then在轴的then之后运行。e、 g:如果有两个axios调用必须顺序运行的东西,可以使用first的then方法调用第二个,这样就解决了问题
我希望你能理解这一点 简单的解决方案是在加载/调度操作时将数据重置为初始值
因此,请尝试从以下位置编辑代码:
actions:{
fetchProducts(){
const response = fetch...... // logic to fetch product
commit('UPDATE_CURRENT_PRODUCT', response.data);
}
}
为此:
actions:{
fetchProducts(){
// Add below line to reset the state when loading.
commit('UPDATE_CURRENT_PRODUCT', null);
/***********************************************/
const response = fetch...... // logic to fetch product
commit('UPDATE_CURRENT_PRODUCT', response.data);
}
}
上述解决方案对我有效。希望这也适用于您或其他人。简单的解决方案是在加载/调度操作时将数据重置为初始值
因此,请尝试从以下位置编辑代码:
actions:{
fetchProducts(){
const response = fetch...... // logic to fetch product
commit('UPDATE_CURRENT_PRODUCT', response.data);
}
}
为此:
actions:{
fetchProducts(){
// Add below line to reset the state when loading.
commit('UPDATE_CURRENT_PRODUCT', null);
/***********************************************/
const response = fetch...... // logic to fetch product
commit('UPDATE_CURRENT_PRODUCT', response.data);
}
}
上述解决方案对我有效。希望这对你或其他人也有用。这里不是这样的。。我已经在我的“currentProduct”上有了一些数据,即以前获取的数据,所以即使它的async Wait也会获取旧的currentProduct数据,并在Wait解决后更新它。您可以设置state.productList={}在变异中,并在单击div标记时调用它。是的,您可以尝试,但这里不是这样。。我已经在我的“currentProduct”上有一些数据,即以前获取的数据,因此即使它的async Wait也会获取旧的currentProduct数据,并在Wait解决后更新。您可以在变异中设置state.productList={}并在单击div标记时调用它。是的,如果您使用的是Vue Router,在打开组件之前,您可以使用beforeRouteEnter/beforeRouteUpdate挂钩更新数据文件。如果您使用的是Vue路由器,则可以使用beforeRouteEnter/beforeRouteUpdate挂钩在打开组件之前更新数据文件。