• 1、在Observer类的响应式的数据监听时,会对数组进行特殊的处理
  • 2、对于对象的视图触发,可以让对象的属性,根据dep和watcher 的绑定来实现(通过get 和set的触发),但是数组是没有dep属性的(vue没有对数组的下标进行数据的监听),因此可以给监听对象直接绑定一个dep属性
import { arrayMethods } from "./array";

class Observer {
  constructor(value) {

    Object.defineProperty(data, '__ob__', {
      value: this,
      enumerable:false, // 不能被枚举
    })

    // 在此处,希望数组的变化可以触发更新
    if (Array.isArray(value)) {
      // 这里对数组做了额外判断
      // 通过重写数组原型方法来对数组的七种方法进行拦截
      value.__proto__ = arrayMethods;
      // 如果数组里面还包含数组 需要递归判断
      this.observeArray(value);
    } else {
      this.walk(value);
    }
  }
  ...

  observeArray(items) {
    for (let i = 0; i < items.length; i++) {
      observe(items[i]);
    }
  }
}
  • 1、Vue中嵌套层次不能太深,否则会有大量递归
  • 2、 Vue中对象通过的是defineProprety实现的响应式,拦截了get和set。如果不存在的属性不会拦截。也不会响应。可以使用$set = ,让对象自己去notify,或者赋子一个新对家
  • 3、Vue中的data,如果是单层数组,直接用下标去修改数值,是不会触发视图更新的,只有在数组是多维数组的时候,通过下标索引定位到深层次数组,通过变异方法会响更新的,只有通过变异的7个方法可以更新视图 ,数组中如果是对象类型,修改对象也可以更新视图
上次更新:
作者: sirius.cheng