关于Vue中数组更新问题

v-for指令把数组和一组<li>元素绑定了。在<li>元素内部,用循环变量t引用某个属性,例如,{{ t.name }}。这样,我们只关心如何更新Model,不关心如何增删DOM节点,大大简化了整个页面的逻辑。

我们可以在浏览器console中用window.vm.todos[0].name='计划有变'查看View的变化,或者通过window.vm.todos.push({name:'新计划',description:'blabla...'})来增加一个数组元素,从而自动添加一个<li>元素。

需要注意的是,Vue之所以能够监听Model状态的变化,是因为JavaScript语言本身提供了Proxy或者Object.observe()机制来监听对象状态的变化。但是,对于数组元素的赋值,却没有办法直接监听,因此,如果我们直接对数组元素赋值:

vm.todos[0] = {
    name: 'New name',
    description: 'New description'
};

会导致Vue无法更新View。

正确的方法是不要对数组元素赋值,而是更新:

vm.todos[0].name = 'New name';
vm.todos[0].description = 'New description';

或者,通过splice()方法,删除某个元素后,再添加一个元素,达到“赋值”的效果:

var index = 0;
var newElement = {...};
vm.todos.splice(index, 1, newElement);

Vue可以监听数组的splicepushunshift等方法调用,所以,上述代码可以正确更新View。

 

原文地址:https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/0014757513445737513d7d65cd64333b5b6ba772839e401000

Vue 2中,由于JavaScript本身机制的限制,直接对数组元素赋值或修改数组长度等操作,Vue无法检测到变化并新页面。以下是一些常见的解决办法: ### 使用变异方法 Vue 2对数组的一些变异方法进行了拦截,使用这些方法操作数组会触发响应式新。常见的变异方法有 `push()`、`pop()`、`shift()`、`unshift()`、`splice()`、`sort()` 和 `reverse()`。 示例代码: ```vue <template> <div> <ul> <li v-for="item in list" :key="item">{{ item }}</li> </ul> <button @click="addItem">添加元素</button> </div> </template> <script> export default { data() { return { list: [1, 2, 3] }; }, methods: { addItem() { this.list.push(4); // 使用push方法添加元素 } } }; </script> ``` ### 使用Vue.set() 如果需要通过索引修改数组元素,可以使用 `Vue.set()` 方法。 示例代码: ```vue <template> <div> <ul> <li v-for="item in list" :key="item">{{ item }}</li> </ul> <button @click="updateItem">新元素</button> </div> </template> <script> import Vue from 'vue'; export default { data() { return { list: [1, 2, 3] }; }, methods: { updateItem() { Vue.set(this.list, 1, 5); // 使用Vue.set新索引为1的元素 } } }; </script> ``` ### 替换整个数组 直接用一个新的数组替换原数组也能触发页面新。 示例代码: ```vue <template> <div> <ul> <li v-for="item in list" :key="item">{{ item }}</li> </ul> <button @click="replaceList">替换数组</button> </div> </template> <script> export default { data() { return { list: [1, 2, 3] }; }, methods: { replaceList() { this.list = [4, 5, 6]; // 替换整个数组 } } }; </script> ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值