Vue.js Vue Vuex:旧数据在计算属性更改之前保留一段时间

Vue.js Vue Vuex:旧数据在计算属性更改之前保留一段时间,vue.js,vuejs2,vue-component,vuex,Vue.js,Vuejs2,Vue Component,Vuex,我是vuex的新手,但我还是过度使用了它。比如说,我的商店状态中有一个产品列表。当我查看一个产品时,我使用该product.id调用axios并将产品数据提交到当前产品状态。然后,如果我查看另一个产品,则该页面将呈现当前产品状态,即old 首先是数据,然后是我的操作提交后。。然后将其更新为新获取的currentProduct,然后vue将我的视图数据更改为新数据。用户可以清楚地看到旧数据被新数据替换。 但我只想在新数据提交到我的状态后加载页面 我的渲染页面: 此页面显示我的产品列表 'produ

我是vuex的新手,但我还是过度使用了它。比如说,我的商店状态中有一个产品列表。当我查看一个产品时,我使用该product.id调用axios并将产品数据提交到当前产品状态。然后,如果我查看另一个产品,则该页面将呈现当前产品状态,即old 首先是数据,然后是我的操作提交后。。然后将其更新为新获取的currentProduct,然后vue将我的视图数据更改为新数据。用户可以清楚地看到旧数据被新数据替换。 但我只想在新数据提交到我的状态后加载页面

我的渲染页面:

此页面显示我的产品列表

'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挂钩在打开组件之前更新数据文件。