在 Vue 2 中,哪些数组方法被修改了?这种修改背后的原因是什么?
考察说明
考察对 Vue 2 响应式原理的掌握,特别是对数组变异方法的理解。
回答思路
- 【回答框架 1】Vue 2 修改了七个数组方法,包括 push、pop、shift、unshift、splice、sort、reverse。这些方法都被重写,以在调用时能够触发视图更新。原因在于 Vue 2 的响应式系统基于 Object.defineProperty,该方法无法侦测数组索引和长度的变化,因此需要劫持这些常用变异方法。
- 【回答框架 2】具体实现是,Vue 2 创建了一个拦截器对象,它覆盖了数组的原型方法。当使用这些方法时,会先调用原始方法,然后触发依赖更新。对于新增元素,还会对新元素进行响应式处理。例如,当调用 push 新增对象时,该对象也会被转换为响应式。
- 【回答框架 3】相比之下,Vue 3 使用 Proxy 可以原生监听数组的变化,不需要重写方法,这也是 Vue 2 与 Vue 3 在响应式实现上的一个重要区别。
- 【关键点 1】Vue 2 重写了七个数组方法:push、pop、shift、unshift、splice、sort、reverse。
- 【关键点 2】原因是 Object.defineProperty 无法侦测数组索引和长度变化。
- 【关键点 3】通过拦截器调用原始方法并触发更新,同时对新元素进行响应式处理。
- 【易错点 1】不能直接通过索引修改数组元素(如 arr[0] = newValue),因为该方法无法侦测到索引变化。
- 【易错点 2】使用 length 属性修改数组长度也无法触发更新。
- 【易错点 3】Vue 2 的数组变异方法不是异步的,但触发更新是异步的,需注意数据更新后 DOM 更新是异步的。