vue的双向数据绑定实现原理?

    互联网/前端 95次点击 · 1218天前 · 李依依
金钻怎么养殖?牛仔裤怎么洗不掉色 李依依

1条回答我要回复

    铛铛1218天前

      vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的,那么vue是如果进行数据劫持的,我们可以先来看一下通过控制台输出一个定义在vue初始化数据上的对象是个什么东西。var vm = new Vue({
      data: {
      obj: {
      a: 1
      }
      },
      created: function () {
      console.log(this.obj);
      }
      });
      结果:

      我们可以看到属性a有两个相对应的get和set方法,为什么会多出这两个方法呢?因为vue是通过Object.defineProperty()来实现数据劫持的。
      Object.defineProperty( )是用来做什么的?它可以来控制一个对象属性的一些特有操作,比如读写权、是否可以枚举,这里我们主要先来研究下它对应的两个描述属性get和set,如果还不熟悉其用法,。
      在平常,我们很容易就可以打印出一个对象的属性数据var Book = {
      name: 'vue权威指南'
      };
      console.log(Book.name); // vue权威指南
      如果想要在执行console.log(book.name)的同时,直接给书名加个书名号,那要怎么处理呢?或者说要通过什么监听对象 Book 的属性值。这时候Object.defineProperty( )就派上用场了,代码如下:var Book = {}
      var name = '';
      Object.defineProperty(Book, 'name', {
      set: function (value) {
      name = value;
      console.log('你取了一个书名叫做' + value);
      },
      get: function () {
      return '《' + name + '》'
      }
      })

      Book.name = 'vue权威指南'; // 你取了一个书名叫做vue权威指南
      console.log(Book.name); // 《vue权威指南》
      我们通过Object.defineProperty( )设置了对象Book的name属性,对其get和set进行重写操作,顾名思义,get就是在读取name属性这个值触发的函数,set就是在设置name属性这个值触发的函数,所以当执行 Book.name = 'vue权威指南' 这个语句时,控制台会打印出 "你取了一个书名叫做vue权威指南",紧接着,当读取这个属性时,就会输出 "《vue权威指南》",因为我们在get函数里面对该值做了加工了。如果这个时候我们执行下下面的语句,控制台会输出什么?
      console.log(Book);
      结果:

      乍一看,是不是跟我们在上面打印vue数据长得有点类似,说明vue确实是通过这种方法来进行数据劫持的。接下来我们通过其原理来实现一个简单版的mvvm双向绑定代码。
      思路分析
      实现mvvm主要包含两个方面,数据变化更新视图,视图变化更新数据:

      关键点在于data如何更新view,因为view更新data其实可以通过事件监听即可,比如input标签监听 'input' 事件就可以实现了。所以我们着重来分析下,当数据改变,如何更新视图的。
      数据更新视图的重点是如何知道数据变了,只要知道数据变了,那么接下去的事都好处理。如何知道数据变了,其实上文我们已经给出答案了,就是通过Object.defineProperty( )对属性设置一个set函数,当数据改变了就会来触发这个函数,所以我们只要将一些需要更新的方法放在这里面就可以实现data更新view了。

       

    请先登录后,再回复