vue2/vue3 双向数据绑定

  • vue2的双向数据绑定原理

首先利用ES5 的 defineProperty的get、set来定义获取属性,然后调用Ovserve方法,启用观察者模式,当数据发生变化时,会通知watcher重新计算(每个组件实例都会对应一个watcher实例),通过compile模版指令更新视图(组件重新渲染)。

Vue的DOM更新是异步执行的,详见:vue2和vue3中nextTick的对比

Object.defineProperty(obj, key, {
      enumerable: true,
      configurable: true,
      get: function reactiveGetter () {
        var value = getter ? getter.call(obj) : val;
        if (Dep.target) {
          dep.depend();
          if (childOb) {
            childOb.dep.depend();
            if (Array.isArray(value)) {
              dependArray(value);
            }
          }
        }
        return value
      },
      set: function reactiveSetter (newVal) {
        var value = getter ? getter.call(obj) : val;
        /* eslint-disable no-self-compare */
        if (newVal === value || (newVal !== newVal && value !== value)) {
          return
        }
        /* eslint-enable no-self-compare */
        if (customSetter) {
          customSetter();
        }
        // #7981: for accessor properties without setter
        if (getter && !setter) { return }
        if (setter) {
          setter.call(obj, newVal);
        } else {
          val = newVal;
        }
        childOb = !shallow && observe(newVal);
        dep.notify();
      }
    });
  • vue3的双向数据绑定原理

利用ES6 的 Proxy 代理对象

二者的对比可见:Vue3/Vue3新特性(优点)

React 单向数据流

React 不是双向数据绑定,而是单向数据流

但 React 可以通过受控组件实现类似双向绑定的效果,这只是模式上的相似,原理和 Vue 的双向绑定有本质区别。

react是如何数据驱动视图改变的?

每次渲染形成虚拟dom,然后diff虚拟dom是否发生变化,如果有变化就更新真正的dom

results matching ""

    No results matching ""