vue.js 更新数组后不更新 DOM

Posted

技术标签:

【中文标题】vue.js 更新数组后不更新 DOM【英文标题】:vue.js is not updating the DOM after updating the array 【发布时间】:2017-02-09 05:10:31 【问题描述】:

我通过 AJAX 读取项目列表并将其推送到数据数组中:

loadSparepartFiles: function() 
    var vm = this;
    vm.activeSparepart.attachments = [];
    ajaxApi.loadJson('spareparts/sparepart/getFiles/'+vm.activeSparepartId, function(data) 
        for (var i = 0; i < data.files.length; i++) 
            vm.activeSparepart.attachments.push(
                filename: data.files[i]
            );
        
    );
,

在 Chrome 的 Vue devTools 中,我可以看到更新后的数据数组,但 DOM 列表仍然是空的。

模板:

<div v-for="file in activeSparepart.attachments" class="uk-width-1-2 uk-margin-bottom">
    <a href=" baseUrl /download/sparepart/ activeSparepartId / file.filename " target="hidden-frame" class="block-link">
        <i class="delete uk-icon-remove"></i>
        <i class="icon uk-icon-image"></i>
        <span class="title">
             file.filename 
        </span>
    </a>
</div>

activeSparepart 对象在这里初始化:

resetSparepart: function() 
    this.activeSparepart = 
        alternates: [],
        locations: [],
        logs: [],
        usages: [],
        vendors: [],
        sparepart: ,
        attachments: []
    ;
    this.activeSparepartId = 'new';
,

Vue devTools 显示如下:

【问题讨论】:

提供 jsFiddle 因为不可能知道你在模板中做什么 我将模板添加到问题中。 你的activeSparepart是如何在组件中定义的? 我在 vue ready 上调用了 resetSparepart 方法 我不明白的一点是,vue devtools 在 activeSparepart.attachments 中显示正确的内容 【参考方案1】:

我认为问题在于您的activeSparepart.attachments 没有反应。

了解Change Detection Caveats in Vue: For Arrays 以获得简短答案,或了解Vue Reactivity in Depth。

如果activeSparepart 是一个对象并且您添加属性attachments,则无法识别附件...

Vue 不允许将新的根级反应属性动态添加到已创建的实例中。但是,可以使用 Vue.set(object, key, value) 方法向嵌套对象添加响应式属性:

Vue.set(vm.activeSparepart, 'attachments', [])

【讨论】:

完美!太感谢了! +1【参考方案2】:

请记住,您将 Vue.js 组件数据定义为函数 返回一个全新的对象以防止数据与其他组件共享。如果你想修改一个数组,你需要先得到整个东西,做出改变,然后把整个东西放回去。

var list = vm.activeSparepart.attachments;
for (var i=0; i < data.files.length; i++) 
    list.push( filename: data.files[i] );

vm.activeSparepart.attachments = list;

【讨论】:

array.push() 将检测更改并提供响应 还是一样的结果:( 哎呀……对不起我的坏事

以上是关于vue.js 更新数组后不更新 DOM的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js- Vuex 更新数组中的对象,内部状态未反映在组件 DOM 中

尽管通过赋值更改了数组,但 Vue.js 列表没有更新

Vue.js 数组在突变更新后消失

Vue.js - 更新和渲染数组的性能成本

vue.js组件改变了数据,但是dom并没有刷新

VueJS 和 Vuetify - 用于 v-select 的数组项在数据更新后不刷新