27

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

来源在线optbox.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空)

4

3 回答 3

29

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

您是直接设置带有索引的项目,Vue无法观察到

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

于 2016-08-09T13:31:04.960 回答
18

你可以这样做:

Vue.set(optboxesList[index], 'printers', printers )
于 2017-04-08T12:30:12.400 回答
1

你需要强制更新

setPrinters(optboxes, optboxId, printers) {
    const index = this.getIndex(optboxes, optboxId);
    const newVal = {...optboxes[index], printers: printers }
    Vue.set(optboxes, index, newVal);
},
于 2020-06-18T10:07:56.627 回答