当v-for循环的数据被修改时,我发现没有重新渲染,我的代码如下:

<div id="app">
    <ul class="list-group">
        <li v-for="(list, index) in lists" class="list">
            {{list.title}}
        </li>
    </ul>
</div>
var app = new Vue({
    el: '#app',
    data: {
        lists: [
            {title: '标题1'}, 
            {title: '标题2'}, 
            {title: '标题3'}, 
            {title: '标题4'}, 
            {title: '标题5'}, 
            {title: '标题6'}, 
        ]
    },
    created: function () {
        var info = {};
        info.title= '测试标题';
        app.lists[1] = info;
        //Vue.set(app.lists, i, info);
        //app.lists.splice(i, 1, info);
    }
});

由于时间周期的问题,created在数据被渲染后执行了,但是在把app.lists[1]修改后,并没有发生重新渲染,于是我查了一下官方文档,
在v-for处有一个注意事项,上面是这样写的

注意事项(Caveats)

由于 JavaScript 的限制,Vue 无法检测到以下数组变动:

  1. 当你使用索引直接设置一项时,例如 vm.items[indexOfItem] = newValue
  2. 当你修改数组长度时,例如 vm.items.length = newLength

为了解决第 1 个问题,以下两种方式都可以实现与 vm.items[indexOfItem] = newValue 相同的效果,但是却可以通过响应式系统出发状态更新:

// Vue.set
Vue.set(example1.items, indexOfItem, newValue)
// Array.prototype.splice
example1.items.splice(indexOfItem, 1, newValue)

为了解决第 2 个问题,你可以使用 splice:

example1.items.splice(newLength)

所以我将app.lists[1] = info;这句注释掉,加上

Vue.set(app.lists, i, info);
app.lists.splice(i, 1, info);

就能够使用v-for重渲染了

Logo

前往低代码交流专区

更多推荐