Vue用v-for重渲染

本文探讨了Vue.js中使用v-for指令时遇到的动态数据更改不触发重新渲染的问题。通过对比直接赋值与Vue.set及splice方法的区别,详细解释了如何正确更新数组内的元素以确保视图能够响应变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当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重渲染了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值