【发布时间】:2023-04-04 20:28:01
【问题描述】:
我遇到了计算 getter 在更新之前访问状态的问题,从而呈现旧状态。我已经尝试了一些事情,例如将突变与动作合并以及将状态更改为许多不同的值,但在调度完成之前仍会调用 getter。
问题
在异步操作(api 调用)完成之前访问状态。
代码结构
- 组件 A 加载 API 数据。
- 用户点击了 1 条数据。
- 组件 A 将点击的数据(对象)分派给组件 B。
- 组件 B 加载接收到的对象。
注意
DOM 渲染得很好。这是一个控制台错误。 Vue 一直在关注 DOM 的变化并立即重新渲染。然而,控制台会接收所有内容。
目标
防止组件 B(仅称为 AFTER 组件)在组件 A 的分派完成之前运行其计算的 getter 方法。
Store.js
import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios';
Vue.use(Vuex);
export const store = new Vuex.Store({
state: {
searchResult: {},
selected: null,
},
getters: {
searchResult: state => {
return state.searchResult;
},
selected: state => {
return state.selected;
},
},
mutations:{
search: (state, payload) => {
state.searchResult = payload;
},
selected: (state, payload) => {
state.selected = payload;
},
},
actions: {
search: ({commit}) => {
axios.get('http://api.tvmaze.com/search/shows?q=batman')
.then(response => {
commit('search', response.data);
}, error => {
console.log(error);
});
},
selected: ({commit}, payload) => {
commit('selected', payload);
},
},
});
SearchResult.vue
<template>
<div>
//looped
<router-link to="ShowDetails" @click.native="selected(Object)">
<p>{{Object}}</p>
</router-link>
</div>
</template>
<script>
export default {
methods: {
selected(show){
this.$store.dispatch('selected', show);
},
},
}
</script>
ShowDetails.vue
<template>
<div>
<p>{{Object.name}}</p>
<p>{{Object.genres}}</p>
</div>
</template>
<script>
export default {
computed:{
show(){
return this.$store.getters.selected;
},
},
}
</script>
问题
Vuex 是关于状态监视和管理的,那么我该如何防止这个控制台错误呢?
提前致谢。
【问题讨论】:
标签: vue.js state vuejs2 vue-component vuex