Vue 双向绑定原理
Vue 是采用 数据劫持 结合 发布者-订阅者模式 的方式,通过 Object.defineProperty()
来劫持各个属性的 setter
, getter
,在数据变动时发布消息给订阅者,触发响应的监听回调。
具体步骤
第一步: 对需要 observer
的数据对象进行递归遍历,包括子属性对象的属性,都加上 setter
和 getter
这样的话,给这个对象的某个值赋值,就会触发 setter
,那么就能监听到了数据变化
第二步: compile
解析模板指令,将模板中的变量替换成数据。然后初始化渲染页面视图,并将每个指令 对应的节点绑定更新函数,添加监听数据的订阅者,一旦数据有变动,收到通知,更新视图
第三步:
Watcher
订阅者是 Observer
和 Compile
之间通信的桥梁,主要做的事情是:
- 在自身实例化时往属性订阅器(
dep
) 里面添加自己 - 自身必须有一个
update()
方法 - 待属性变动
dep.notice()
通知时,能调用自身的update()
方法,并触发Compile
中绑定的回调,则功成身退。
第四步: MVVM 作为数据绑定的入口,整合 Observer、Compile 和 Watcher 三者,通过 Observer 来监听自己的 model 数据变化,通过 Compile 来解析编译模板指令,最终利用 Watcher 搭起 Observer 和 Compile 之间的通信桥梁,达到数据变化 -> 视图更新;视图交互变化(input) -> 数据 model 变更的双向绑定效果。
vue 双向绑定原理
vue 接收一个模板和 data 参数。1,首先将 data 中的数据进行递归遍历,对每个属性执行 Object.defineProperty,定义 get 和 set 函数。并为每个属性添加一个 dep 数组。当 get 执行时,会为调用的 dom 节点创建一个 watcher 存放在该数组中。当 set 执行时,重新赋值,并调用 dep 数组的 notify 方法,通知所有使用了该属性 watcher,并更新对应 dom 的内容。2,将模板加载到内存中,递归模板中的元素,检测到元素有 v-开头的命令或者双大括号的指令,就会从 data 中取对应的值去修改模板内容,这个时候就将该 dom 元素添加到了该属性的 dep 数组中。这就实现了数据驱动视图。在处理 v-model 指令的时候,为该 dom 添加 input 事件(或 change),输入时就去修改对应的属性的值,实现了页面驱动数据。3,将模板与数据进行绑定后,将模板添加到真实 dom 树中。
Vue3 的双向绑定原理
Vue3
中要用 Proxy
代替 defineProperty
。 proxy
无论是从操作上还是底层功能上远强于 defineProperty
。 Proxy
在目标对象之前架设一层拦截,外界对象对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写
优点 :
- 可以监听数组的变化,这个是
defineProperty
做不到的 - 直接监听对象,而不是对象的属性,而且会生成一个新对象
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: Vuex 状态机
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论