结合《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 中正确替换数组某项并触发视图更新。这正是尚硅谷这一节想演示的核心点。
