结合《033_更新时的一个问题》,this.persons.splice(0,1,{...})JavaScript 原生数组方法 Array.prototype.splice(),Vue 只是在此基础上做了”响应式包装”。

splice 基本语法

array.splice(startIndex, deleteCount, ...itemsToAdd)
参数 含义
startIndex 从哪个下标开始操作(0 表示第一项)
deleteCount 删除几个元素(1 = 删 1 个)
...itemsToAdd 可选,要插入/替换的新元素

代码

this.persons.splice(0, 1, {id:'001',name:'马老师',age:50,sex:'男'})

意思是:

persons 数组下标 0 开始,删除 1 个元素,并在该位置插入新的对象

等价于:把马冬梅那条数据替换成新对象

为什么用 splice 而不用下标赋值?

// ❌ Vue2 无法监测——视图不更新
this.persons[0] = {id:'001',name:'马老师',age:50,sex:'男'}

// ✅ splice 被 Vue2 重写过——能触发响应式更新
this.persons.splice(0, 1, {...})

原因(笔记下一节会讲原理):

  • Vue2 通过 Object.defineProperty 只劫持了数组的 7 个变更方法push/pop/shift/unshift/splice/sort/reverse
  • 直接通过索引赋值或修改 length 不会被 Vue 监测到
  • splice 恰好在被重写的 7 个方法中,调用它会自动触发 依赖通知 → 虚拟 DOM 重新渲染

对比总结

操作方式 Vue2 是否响应 说明
this.persons[0] = {...} ❌ 不响应 索引赋值未被劫持
Vue.set(this.persons, 0, {...}) Vue2 官方推荐替代方案之一
this.persons.splice(0, 1, {...}) 利用重写的变异方法,最常用

简单说:this.persons.splice(0,1,newObj) 就是用”删除再插入”的方式,在 Vue2 中正确替换数组某项并触发视图更新。这正是尚硅谷这一节想演示的核心点。