Vue用v-for重渲染

来源:互联网 发布:linux net snmp安装包 编辑:程序博客网 时间:2024/06/06 04:17

当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.setVue.set(example1.items, indexOfItem, newValue)
// Array.prototype.spliceexample1.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重渲染了

原创粉丝点击