Appearance
cx
Appearance
采用数据劫持结合发布订阅模式(PubSub 模式)的方式,通过 Object.defineProperty 来劫持各个属性的 setter、getter,在数据变动时发布消息给订阅者,触发相应的监听回调。 当把一个普通 js 对象传给 Vue 实例来作为它的 data 选项时,Vue 将遍历它的属性,用 Object.defineProperty 将它们转为 getter/setter。用户看不到 getter/setter,但是在内部它们让 Vue 追踪依赖,在属性被访问和修改时通知变化。 Vue 的数据双向绑定整合了 Observer,Compile 和 Watcher 三者,通过 Observer 来监听自己的 model 的数据变化,通过 Compile 来解析编译模板指令,最终利用 Watcher 搭起Observer 和 Compile 之间的通信桥梁,达到数据变化->视图更新,视图交互变化(例如 input 操作)-> 数据 model 变更的双向绑定效果。
vue 是在原型链中将数组给重写了。
vue3放弃了Object.defineProperty的方式采用了proxy来实现数据的响应式。
v-model的本质其实就是 :value + input方法的语法糖
实现过程
组件中的 data 写成一个函数,数据以函数返回值形式定义。这样每复用一次组件,就会返回一份新的 data,类似于给每个组件实例创建一个私有的数据空间,让各个组件实例维护各自的数据。而单纯的写成对象形式,就使得所有组件实例共用了一份 data,就会造成一个变了全都会变的结果。
大量的Watcher会导致性能卡顿,少量的Watcher会导致不够精确,所以vue是针对组件的进行Watcher,然后在组件内部再diff监听变化。
React中是不知道哪里发生变化了的,是通过diff比较,然后变化,在这个时候可能很多组件是不知道发生变化的,所以需要shouldComponentUpdate来优化,而vue是知道变化的,考虑手动优化的价值有限,所以没有引入shouldComponentUpdate