Vue响应式系统基本原理

Vue.js 是一款 MVVM 框架,数据模型仅仅是普通的 JavaScript 对象,但是对这些对象进行操作时,却能影响对应视图,它的核心实现就是「响应式系统」。

首先我们定义一个cb函数,这个函数用来模拟视图更新,调用它即代表更新视图。

  function cb (newVal) {
    console.log('视图更新了 ==> '   + newVal);
  }

然后我们定义一个defineReactive,这个方法通过Object.defineProperty来实现对对像的响应式话, 入参是一个obj(需要绑定的对象)、key(obj的某一个属性),val(具体的值)。经过defineReactive处理以后,我们obj的key属性在读的时候会触发reactiveGetter方法,而在该属性被写的时候则会触发reactiveSetter方法。

function defineReactive (obj, key, val) {
  Object.defineProperty(obj, key, {
      enumerable: true,
      configurable: true,
      get: function reactiveGetter () {
          return val;
      },
      set: function reactiveSetter (newVal) {
            if (newVal === val) {
                return;
            }
            cb(newVal);
      }
  });
}

当然这是不够的,我们需要在上面再封装一层observer。这个函数传入一个value(需要响应式的对象),通过遍历所有属性的方式对该对象的每一个属性都通过defineReactive处理。

function observer (value) {
  if (!value || !(typeof value !== 'object')) {
      return;
  }
  Object.keys(value).forEach((key) => {
      defineReactive(value, key, value[key]);
  });
}

最后,封装一个Vue

class  Vue {
    constructor (options) {
        this._data = options.data;
        observer(this._data);
    }
}

这样我们只要new一个Vue对象,就会将data中的数据进行响应式化。我们对data的属性进行下面的操作,就会触发cb方法更新视图。

let o = new Vue({
    data: {
        test: 'I am test~' 
    }
});

o._data.test = 'Hello,world~';
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 observer部分完整的源码注释放在github上了,有兴趣的可以去看看,如果发现有误情不吝赐教!obse...
    Lxylona阅读 4,804评论 0 10
  • 这方面的文章很多,但是我感觉很多写的比较抽象,本文会通过举例更详细的解释。(此文面向的Vue新手们,如果你是个大牛...
    Ivy_2016阅读 15,525评论 8 64
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 30,045评论 8 265
  • “生财有大道:生之这众,食之者寡;为之者疾,用之者舒,则财恒足矣。仁者以财发身,不仁者以身发财。未有上好...
    钱江潮369阅读 3,321评论 0 2
  • 每一个日子都是镶着金边的星星,发着冷冷的熠光。而有的日子是星星上摇摆的风车,旋转着自己的欢快,这样的日子叫做纪念日...
    惠茹姐姐阅读 2,415评论 0 1

友情链接更多精彩内容