Bootstrap

03 【响应式原理 ref和reactive总结 setup注意点】

6.Vue3.0中的响应式原理

6.1 vue2.x的响应式

  • 实现原理:

    • 对象类型:通过Object.defineProperty()对属性的读取、修改进行拦截(数据劫持)。

    • 数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹)。

      Object.defineProperty(data, 'count', {
             
          get () {
             }, 
          set () {
             }
      })
      
  • 存在问题:

    • 新增属性、删除属性, 界面不会更新。
    • 直接通过下标修改数组, 界面不会自动更新。
      const person = {
   
        name: 'ds',
        age: 18,
      };

      // vue2
       let p = {
   };
      Object.defineProperty(p, 'name', {
   
        get() {
   
          console.log('有人读取了name');
          return person.name;
        },
        set(value) {
   
          console.log('有人修改了name');
          person.name = value;
        },
      }); 

6.2 Vue3.0的响应式

  • 实现原理:

    • 通过Proxy(代理): 拦截对象中任意属性的变化, 包括:属性值的读写、属性的添加、属性的删除等。

    • 通过Reflect(反射): 对源对象的属性进行操作。

    • MDN文档中描述的Proxy与Reflect:

      • Proxy:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy

              //源数据
        	const person = {
                 
                name
;