Vue用v-for重渲染
当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 = n
·
当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 无法检测到以下数组变动:
- 当你使用索引直接设置一项时,例如 vm.items[indexOfItem] = newValue
- 当你修改数组长度时,例如 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重渲染了
更多推荐
已为社区贡献4条内容
所有评论(0)