Vue3中的响应式原理与setup
创始人
2025-06-01 01:06:50

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

vue2.x的响应式

  • 实现原理:

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

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

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

    • 新增属性、删除属性, 界面不会更新。
    • 直接通过下标修改数组, 界面不会自动更新。

在使用vue2时,我们需要注意,在赋值后再访问 this.someObject,此值已经是原来的 newObject 的一个响应式代理

Vue3.0的响应式

  • 实现原理:

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

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

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

      • Proxy

      • Reflect

与 Vue 2 不同的是,这里原始的 newObject 不会变为响应式:请确保始终通过 this 来访问响应式状态。

  ```jsnew Proxy(data, {// 拦截读取属性值get (target, prop) {return Reflect.get(target, prop)},// 拦截设置属性值或添加新属性set (target, prop, value) {return Reflect.set(target, prop, value)},// 拦截删除属性deleteProperty (target, prop) {return Reflect.deleteProperty(target, prop)}})proxy.name = 'tom'   ```

5.reactive对比ref

  • 从定义数据角度对比:
    • ref用来定义:基本类型数据。对象可以更改
    • reactive用来定义:对象(或数组)类型数据
    • 备注:ref也可以用来定义对象(或数组)类型数据, 它内部会自动通过reactive转为代理对象
  • 从原理角度对比:
    • ref通过Object.defineProperty()getset来实现响应式(数据劫持)。
    • reactive通过使用Proxy来实现响应式(数据劫持), 并通过Reflect操作源对象内部的数据。
  • 从使用角度对比:
    • ref定义的数据:操作数据需要.value,读取数据时模板中直接读取不需要.value
    • reactive定义的数据:操作数据与读取数据:均不需要.value

6.setup的两个注意点

  • setup执行的时机

    • 在beforeCreate之前执行一次,this是undefined。
  • setup的参数

    • props:值为对象,包含:组件外部传递过来,且组件内部声明接收了的属性。
    • context:上下文对象
      • attrs: 值为对象,包含:组件外部传递过来,但没有在props配置中声明的属性, 相当于 this.$attrs
      • slots: 收到的插槽内容, 相当于 this.$slots
      • emit: 分发自定义事件的函数, 相当于 this.$emit

相关内容

热门资讯

透视脚本(aapoker线上)... 1、超多福利:超高返利,海量正版游戏,aapoker线上系统规律,上线aapoker线上黑科技等满足...
玩家必看“微信牛牛h5房卡找谁... 【要素一】(KK)微信链接各大厅/房卡介绍微/44858861微信牛牛h5是一款非常火爆的游戏应用,...
透视脚本(AAPoKer俱乐部... 亲,AAPoKer俱乐部这款游戏可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的...
实测讲解“新青鸟大厅拼三张.辅... 实测讲解“新青鸟大厅拼三张.辅助挂工具”外卦神器下载亲,新青鸟大厅拼三张这个游戏其实有挂的,确实是有...
透视脚本(aa poker)透... 亲,aa poker这款游戏可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌特...