zhuanghaixin / Interview

8 stars 0 forks source link

[vue]双向绑定原理 #192

Open zhuanghaixin opened 3 years ago

zhuanghaixin commented 3 years ago

vue.js 是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性 的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。 具体步骤: 第一步:需要observe 的数据对象进行递归遍历,包括子属性对象的属性,都加上setter 和getter,这样 的 话,给这个对象的某个值赋值,就会触发setter,那么就能监听到了数据变化。 第二步:compile 解析模板指令,将模板中的变量替换成数据,然后初始化渲染页面视图,并将每个指令对应的 节点绑定更新函数,添加监听数据的订阅者,一旦数据有变动,收到通知,更新视图。 第三步:Watcher 订阅者是Observer 和Compile 之间通信的桥梁,主要做的事情是:1、在自身实例化时往属性订 阅器(dep)里面添加自己2、自身必须有一个update()方法3、待属性变动dep.notice()通知时,能调用自身的 update()方法,并触发Compile 中绑定的回调,则功成身退。第四步:MVVM 作为数据绑定的入口,整合Observer、 Compile 和Watcher 三者,通过Observer 来监听自己的model 数据变化,通过Compile 来解析编译模板指令,最 终利用Watcher 搭起Observer 和Compile 之间的通信桥梁,达到数据变化-> 视图更新;视图交互变化(input) -> 数据model 变更的双向绑定效果。

zhuanghaixin commented 3 years ago

三种方式: 发布者-订阅者模式(backbone.js,比较low),脏值检测(angular.js),数 据劫持(vue.js) vue采用数据劫持配合“发布者-订阅者”模式来实现数据双向绑定。 数据变化更新视图,视图变化更新数据,通过数据劫持监听来实现。

  1. 设置监听器对view层数据进行劫持监听,发生变化时,通知订阅者们(watcher) 更新数据
  2. 订阅者收到变化通知并执行相应函数,对数据重新赋值,改变model层
  3. 指令解析器对元素节点进行扫描和解析,根据指令模板替换数据
zhuanghaixin commented 3 years ago

vue.js 是采用数据劫持结合发布者- 订阅者模式的方式, 通过 Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息 给订阅者,触发相应的监听回调。 具体步骤: 第一步:需要observe的数据对象进行递归遍历,包括子属性对象的属性,都加上 setter和getter 这样的话,给这个对象的某个值赋值,就会触发setter,那么就能监听到了数据 变化 第二步:compile解析模板指令,将模板中的变量替换成数据,然后初始化渲染页 面视图,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者,一旦 数据有变动,收到通知,更新视图 第三步:Watcher订阅者是Observer和Compile之间通信的桥梁,主要做的事情是: 1、在自身实例化时往属性订阅器(dep)里面添加自己 2、自身必须有一个update()方法 3、待属性变动dep.notice()通知时,能调用自身的update()方法,并触发Compile 中绑定的回调,则功成身退。 第四步:MVVM作为数据绑定的入口,整合Observer、Compile和Watcher三者, 通过Observer来监听自己的model数据变化,通过Compile来解析编译模板指令, 最终利用Watcher搭起Observer和Compile之间的通信桥梁,达到数据变化-> 视 图更新;视图交互变化(input) -> 数据model变更的双向绑定效果。