我有一个Vue组件,无法从服务调用中填充的计算属性中进行更新。
Feed.vue
<template>
<div class="animated fadeIn">
<h1 v-if="!loading">Stats for {{ feed.name}}</h1>
<h2 v-if="loading">loading {{ feedID }}</h2>
</div>
</template>
<script>
export default {
data: () => {
return {
feedID: false
}
},
computed: {
feed(){
return this.$store.state.feed.currentFeed
},
loading(){
return this.$store.state.feed.status.loading;
}
},
created: function(){
this.feedID = this.$route.params.id;
var fid = this.$route.params.id;
const { dispatch } = this.$store;
dispatch('feed/getFeed', {fid});
}
}
</script>
这将从feed模块中分派“ feed / getFeed” ...
feed.module.js
import { feedStatsService } from '../_services';
import { router } from '../_helpers';
export const feed = {
namespaced: true,
actions: {
getFeed({ dispatch, commit }, { fid }) {
commit('FeedRequest', {fid});
feedStatsService.getFeed(fid)
.then(
feed => {
commit('FeedSuccess', feed);
},
error => {
commit('FeedFailure', error);
dispatch('alert/error', error, { root: true });
}
)
}
},
mutations: {
FeedRequest(state, feed) {
state.status = {loading: true};
state.currentFeed = feed;
},
FeedSuccess(state, feed) {
state.currentFeed = feed;
state.status = {loading: false};
},
FeedFailure(state) {
state.status = {};
state.feed = null;
}
}
}
feedStatsService.getFeed调用该服务,该服务仅运行获取并返回结果。然后调用commit('FeedSuccess',feed),运行该突变,将state.currentFeed = feed设置为state.status.loading为false。
我可以说它已存储,因为该对象显示在Vue开发工具中。 state.feed.currentFeed是服务的结果。但是,我的组件并没有改变以反映这一点。而且在dev工具中的突变下也有一个有效载荷。在开发工具中手动提交feed / feedSuccess时,我的组件会更新。
我在这里想念什么?
答案 0 :(得分:2)
与需要初始化组件data
属性的方式相同,商店的状态也需要初始化。如果Vue不了解初始数据,则无法对更改做出反应。
您似乎缺少类似...
state: {
status: { loading: true },
currentFeed: {}
}
另一种选择是使用Vue.set
。参见https://vuex.vuejs.org/guide/mutations.html#mutations-follow-vue-s-reactivity-rules ...
由于Vue使Vuex存储的状态具有反应性,因此当我们更改状态时,观察状态的Vue组件将自动更新。这也意味着在使用普通Vue时,Vuex突变会受到相同的反应性警告
答案 1 :(得分:0)
为所有无法解决此问题的人提供帮助。以下是对我有用的东西:
声明基本状态:
seek()
然后我采取了行动,这就是现在固定的突变:
import mmap
import sys
with open(sys.argv[1], 'rb') as f:
mm = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ)
target = b'TIME_DATA'
tl = len(target)
idx = -tl
counter = 0
while True:
idx = mm.find(target, idx + tl)
if idx < 0:
break
counter += 1
print(counter)
mm.close()
现在,我的变异正在调用此updateState()函数,该函数全部为state: {
mainNavData: [],
}
actions : {
async fetchMainNavData({ commit }) {
var response = await axios.get();
commit('setMainNavData', response));
},
};
这就是updateState函数正在解决的问题。
key
添加updateState()后,我的数据会反应性地显示在前端,而我不再需要在Vue工具中手动提交数据。
请注意,我的商店在不同的文件中,因此有点不同。希望这对其他人有帮助!
答案 2 :(得分:0)
有时候不直接处于状态中的更新属性是问题
{
directprop: "noProblem",
indirectParent: {
"test": 5 // this one has a problem but works if we clone the whole object indirectParent
}
}
但这是一个临时解决方案,它可以帮助您强制更新状态并发现真正的问题。