Vue3 中为什么需要 ref?

大家好,我是哈默。今天我们来说一下为什么在 Vue3 中我们需要 ref

reactive 的使用

我们知道,在使用 reactive 的时候,我们可以给 reactive 传入对象:

js 复制代码
<script setup>
import { reactive } from "vue";

const info = reactive({
  name: "hamo",
  age: 20,
});
</script>

此时,运行正常。

给 reactive 传入原始类型的数据

但如果我们给 reactive 传入原始类型的数据:

js 复制代码
<script setup>
import { reactive } from "vue";

const name = reactive("hamo");
</script>

这个时候,就会报错:

js 复制代码
⚠ value cannot be made reactive: hamo

报错的原因

以上报错的原因是因为,reactive 内部是用 Proxy 实现的:

Proxy 的语法是这样子的:

js 复制代码
// obj 被代理对象
const obj = {
  name: "hamo",
  age: 20,
};

// proxyObj 代理对象
// obj 被代理对象
const proxyObj = new Proxy(obj, {
  set() {
    // 触发依赖
    console.log("触发了 set,设置了值");
  },
  get() {
    // 收集依赖
    console.log("触发了 get,读取了值");
  },
});

也就是说,我们在 new Proxy 的时候,第一个参数,obj,被代理对象,它只能够传引用类型,如果我们传原始类型,就会报错:

而我们的 reactive 它又是基于 Proxy 的,也就是说,reactive 的第一个参数,也只能传递 引用类型,无法处理 原始类型,所以就报错了。

ref 可以接收原始类型

ref 的第一个参数,是可以接收 原始类型 的,因为 ref 并不是由 Proxy 实现的,它是一个 RefImpl 类的对象:

而这个 RefImpl 类,第一个参数,是可以接收原始类型的,也可以接收引用类型:

js 复制代码
class RefImpl<T> {
  private _value: T
  ...

  // constructor 的第一个参数 value 可以是原始类型的,也可以是引用类型
  constructor(value: T, public readonly __v_isShallow: boolean) {
    this._rawValue = __v_isShallow ? value : toRaw(value)
    this._value = __v_isShallow ? value : toReactive(value)
  }

  get value() {
    ...
  }

  set value(newVal) {
    ...
  }
}

总结

因为我们存在需要定义 原始类型的响应性数据 的需求,所以我们就需要有 ref 这个东西,来处理 原始类型数据 的响应性。

相关推荐
benbenAItalk2 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
2601_962885722 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
西瓜太郎12343 小时前
Claude Code、Codex CLI、Gemini CLI 能否共用一枚 Key?先看协议选择矩阵
前端·api 网关·claude code·gemini cli·codex cli
陈随易5 小时前
在Finch用了62亿词元,我认为这是新一代Agent工具之神
前端·人工智能·后端
水域安全老周5 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
计算机魔术师6 小时前
Anthropic CEO突然喊踩刹车,OpenAI罕见力挺:AI这辆车不能只踩油门了
前端
wing986 小时前
从codex转战workbuddy使用一周的感受
前端·人工智能·后端
EatFan6 小时前
Java接入支付宝 JSAPI 支付保姆教程(二):流程讲解与前后端代码讲解
前端·spring boot·后端·微信小程序·小程序·uni-app
梦想平凡6 小时前
百游棋牌源代码开发搭建教程(五):房间创建、座位分配与请求幂等实现
前端·javascript·数据库·源代码管理
IT_陈寒7 小时前
Redis的Set操作居然能把我的服务整挂了?
前端·人工智能·后端