跳到主要内容

简述Vue 如何检测数组变化 ?

参考答案:

Vue.js 在检测数组变化时主要依赖其内部的 Observer 机制。这个机制通过遍历数据对象中的所有属性,并使用 Object.defineProperty 把属性全部转为 getter/setter,在数据变动时发布消息给解析器,触发相应的监听回调。

然而,对于数组,由于数组元素的增减和顺序的变动是无法被 Object.defineProperty 捕获的,所以 Vue.js 对数组进行了一些封装和改造,使其能够触发视图更新。具体来说,Vue.js 在初始化时会将数组转换成其自定义的数组方法,这些方法会包裹原生的数组方法,并在执行原生方法的同时触发视图更新。

这些被 Vue.js 改造的数组方法包括:

  • push
  • pop
  • shift
  • unshift
  • splice
  • sort
  • reverse

当你通过这些被改造的方法改变数组时,Vue.js 就能检测到数组的变化,并触发相应的视图更新。

但是,如果你直接修改数组元素的某个属性(例如 arr[indexOfItem] = newValue),或者通过数组索引直接设置元素(例如 arr[newLength] = newValue),那么 Vue.js 是无法检测到这种变化的。这种情况下,你需要使用 Vue.js 提供的方法(如 Vue.setthis.$set)来确保视图能够正确更新。

以上就是 Vue.js 检测数组变化的基本机制。