ref 和 reactive的区别

🔄 ref 与 reactive 的对比

为了更清晰地理解 ref的定位,可以将其与 reactive进行简单对比:

特性 ref reactive
​目标数据类型​ ​基础类型​​和对象类型 ​仅对象类型​​(如 Object, Array, Map, Set 等)
​返回值​ 一个 RefImpl实例(响应式引用对象) 一个 Proxy实例(代理对象)
​访问值(JS中)​ 需要通过 .value属性 ​直接​​访问属性
​模板中使用​ 自动解包,通常无需 .value 直接访问属性

简单来说,reactiveProxy的直接应用,而 ref是为了弥补 Proxy对基础类型无能为力而设计的​​一个更上层的封装​ ​。当 ref接收一个对象时,其内部实际上会调用 reactive来深度转换这个对象。

🚫 Proxy 的运作对象

Proxy的核心功能是​​代理一个对象​ ​,并拦截针对该对象的某些操作(比如属性读取、设置、删除等)。它的目标必须是对象,因为代理操作依赖于对象的属性描述机制。而 JavaScript 中的​​基础类型(Primitive Values)​ ​,例如 StringNumberBooleannullundefined等,本身​​不是对象​ ​。它们是不可变的,并且不具备可供 Proxy拦截的属性和方法(尽管在运算时,JavaScript 引擎会临时将部分基础类型包装成对象,但这个过程是瞬时的,并非一个可被长期代理的稳定对象)。如果您尝试直接用 Proxy去包装一个基础类型,JavaScript 引擎会抛出错误:

ini 复制代码
const primitiveValue = 42;
const proxy = new Proxy(primitiveValue, {}); // 抛出 TypeError: Cannot create proxy with a non-object as target or handler

💡 Vue 3 的解决方案:ref

为了解决这个问题,Vue 3 引入了 ​ref ​ API。它的思路非常巧妙:​​将基础类型值"包装"在一个对象里面​​,然后去代理这个包装对象。

  1. ​包装过程​ ​:当您调用 ref(42)时,Vue 3 在内部实际上创建了一个类似这样的结构:

    ini 复制代码
    const countRef = {
      value: 42
    };
  2. ​响应式实现​ ​:Vue 3 使用 Proxy来代理这个包含 value属性的包装对象。这样,所有对 countRef.value的读取和设置操作都能被 Proxy精确拦截,从而实现响应式。

  3. .value的由来​ ​:正因为 ref返回的是一个响应式的包装对象,所以在 JavaScript 中访问或修改其值时,需要通过 .value属性来操作。

    ini 复制代码
    const count = ref(0);
    console.log(count.value); // 读取,触发 Proxy 的 get 拦截
    count.value = 1;          // 设置,触发 Proxy 的 set 拦截

    (不过在 Vue 模板中,ref会被自动解包,通常无需书写 .value

💎 简单来说

Vue 3 的 Proxy无法直接监听基础类型,是因为 Proxy的工作机制要求其目标必须是一个对象。Vue 3 通过 refAPI 巧妙地规避了这一限制,将基础类型值包装成对象后再进行代理,从而实现了对基础类型的响应式跟踪。

相关推荐
_OP_CHEN1 分钟前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化
啊哈一半醒3 分钟前
CSS 主流布局
前端·css·css布局·标准流 浮动 定位·flex grid 响应式布局
PHP武器库6 分钟前
ULUI:不止于按钮和菜单,一个专注于“业务组件”的纯 CSS 框架
前端·css
电商API_1800790524714 分钟前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫
晓晓莺歌16 分钟前
vue3某一个路由切换,导致所有路由页面均变成空白页
前端·vue.js
Up九五小庞1 小时前
开源埋点分析平台 ClkLog 本地部署 + Web JS 埋点测试实战--九五小庞
前端·javascript·开源
qq_177767371 小时前
React Native鸿蒙跨平台数据使用监控应用技术,通过setInterval每5秒更新一次数据使用情况和套餐使用情况,模拟了真实应用中的数据监控场景
开发语言·前端·javascript·react native·react.js·ecmascript·harmonyos
烬头88212 小时前
React Native鸿蒙跨平台应用实现了onCategoryPress等核心函数,用于处理用户交互和状态更新,通过计算已支出和剩余预算
前端·javascript·react native·react.js·ecmascript·交互·harmonyos
天人合一peng4 小时前
Unity中button 和toggle监听事件函数有无参数
前端·unity·游戏引擎
方也_arkling5 小时前
别名路径联想提示。@/统一文件路径的配置
前端·javascript