为什么在vuex存储更新后计算值未更新?

时间:2016-08-07 22:54:04

标签: vue.js computed-properties vuex

我有一个printerList计算属性,应该在getPrinters()解析后重新评估,但看起来不是。

sources are onlineoptbox.component.vuevuexoptboxes.service.js

组件

<template>
    <div v-for="printer in printersList">
        <printer :printer="printer" :optbox="optbox"></printer>
    </div>
</template>
<script>
…
created() { this.getPrinters(this.optbox.id); },
    computed: {
        printersList() {
            var index = optboxesService.getIndex(this.optboxesList, this.optbox.id);
            return this.optboxesList[index].printers
        }
    },
    vuex: {
        actions: { getPrinters: actions.getPrinters,},
        getters: { optboxesList: getters.retrieveOptboxes}
    }
<script>

操作

getPrinters({dispatch}, optboxId) {
    printers.get({optbox_id: optboxId}).then(response => {
        dispatch('setPrinters', response.data.optbox, response.data.output.channels);
    }).catch((err) => {
        console.error(err);
        logging.error(this.$t('printers.get.failed'))
    });
},

的突变

setPrinters(optboxes, optboxId, printers) {
    var index = this.getIndex(optboxes, optboxId);
    optboxes[index] = {...optboxes[index], printers: printers }
},

问题

为什么printerList计算的属性没有被重新评估(即v-for为空)

3 个答案:

答案 0 :(得分:18)

这是由于这一行: optboxes[index] = {...optboxes[index], printers: printers }

您正在使用索引直接设置项目,can't be observed by Vue

尝试从数组中拼接旧项目并推送新项目。

答案 1 :(得分:7)

你可以这样做:

Vue.set(optboxesList[index], 'printers', printers )

答案 2 :(得分:1)

您需要强制更新

setPrinters(optboxes, optboxId, printers) {
    const index = this.getIndex(optboxes, optboxId);
    const newVal = {...optboxes[index], printers: printers }
    Vue.set(optboxes, index, newVal);
},