很多开发者在使用Vue的时候都会遇到一个问题:Vue中数组push方法会覆盖之前的值,这是因为Vue对数据进行了劫持。在Vue中,如果要对数组进行操作,不能使用原有的方法,必须使用Vue提供的方法。
var data = { items: ['蛋糕', '果汁'] } //定义一个数组
var vm = new Vue({
el: '#app',
data: data
})
//使用Vue提供的方法向数组添加新元素
vm.$set(vm.items, 2, '面包')
console.log(vm.items) //['蛋糕', '果汁', '面包']
假如我们直接使用push方法向数组中添加新元素:
vm.items.push('面包')
console.log(vm.items) //['蛋糕', '果汁', '面包']
可以看到,我们使用push方法添加了一个新元素,但是它却覆盖了之前的值。这是因为Vue在劫持数据时,重写了数组的原型方法push和pop,使得它们不再像原生的方法那样对数据进行直接修改。而使用Vue提供的方法,实际上是通过Vue的$set方法向数组中添加新元素,并触发了视图的重新渲染。
除了$set方法之外,Vue提供了一些其他的方法供我们对数组进行操作,如splice和unshift方法。splice方法可以删除原数组中一个或多个元素,并可以向数组中插入新元素。unshift方法可以向数组的开头添加一个或多个元素。
//使用splice方法删除元素
vm.items.splice(1, 1, '可乐')
console.log(vm.items) //['蛋糕', '可乐', '面包']
//使用unshift方法添加元素
vm.items.unshift('酸奶')
console.log(vm.items) //['酸奶', '蛋糕', '可乐', '面包']
除了使用Vue提供的方法操作数组之外,我们还可以使用Object.assign或展开运算符(...)来实现对数组的操作。
//使用Object.assign方法向数组中添加元素
vm.items = Object.assign([], vm.items, ['冰激凌'])
console.log(vm.items) //['酸奶', '蛋糕', '可乐', '面包', '冰激凌']
//使用展开运算符向数组中添加元素
vm.items = [...vm.items, '布丁']
console.log(vm.items) //['酸奶', '蛋糕', '可乐', '面包', '冰激凌', '布丁']
使用Vue提供的方法可以避免因为数组刷新导致性能的损失,但是在一些简单的场景下,使用原生的方法或Object.assign和展开运算符也可以实现对数组的操作。