简述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.set
或 this.$set
)来确保视图能够正确更新。
以上就是 Vue.js 检测数组变化的基本机制。