Vuex Mutation正在运行,但组件不会更新,直到在vue dev工具中手动提交

时间:2018-10-18 01:18:04

标签: javascript vue.js vuex

我有一个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时,我的组件会更新。

我在这里想念什么?

Vue Dev tools

3 个答案:

答案 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
   }
}

但这是一个临时解决方案,它可以帮助您强制更新状态并发现真正的问题。