vue watch mapState不工作

时间:2017-07-03 14:42:45

标签: vue.js vuex

我在我的组件中使用商店值并尝试更新它。当我点击按钮时,商店值会发生变化,但更改不会反映在组件输出中(即{{query}})

    <template>
         span {{query}}
         button(@click='updateQuery')
    </template>

    <script>
    export default {
        computed: mapState('map', [
            'query'
        ]),
        methods: {
            ...mapMutations('map', [
                'setStart'
            ]),
            updateQuery() {
                this.setStart(new Date());
            }
       }
   }
   </script>

存储

export default {
    namespaced: true,
    state: {
        query: {},
        start: null,
        end: null
    },
    mutations: {
        setQuery(state, value) { state.query = value },
        setStart(state, value) {
            state.start = value;
            state.query.timestamp = state.query.timestamp ? state.query.timestamp : {};
            state.query.timestamp.$gte = value;
        },
        setEnd(state, value) {
            state.end = value;
            state.query.timestamp = state.query.timestamp ? state.query.timestamp : {};
            state.query.timestamp.$lte = value;
        },
    }
}

1 个答案:

答案 0 :(得分:2)

此处的问题是Vue cannot detect,您要动态地向query对象添加新属性。

在此代码中:

state.query.timestamp = state.query.timestamp ? state.query.timestamp : {};

您正在向timestamp添加query属性,之前不存在。因此,它不会被动反应。为了正确使用Vue,您需要使用Vue.set

Vue.set(state.query, `timestamp`, state.query.timestamp ? state.query.timestamp : {})

注意,您还需要在$gte属性的下一行执行此操作。

或者,您可以初始化查询对象。

state: {
    query: {
      timestamp:{
        $gte: null,
        $lte: null
      }
    },
    start: null,
    end: null
},