为什么推荐使用ref而不是reactive

为什么推荐使用ref而不是reactive

  • 局限性问题: reactive本身存在一些局限性,可能会在开发过程中引发一些问题。这需要额外的注意力和处理,否则可能对开发造成麻烦。
  • 数据类型限制: reactive声明的数据类型仅限于对象,而ref则更加灵活,可以容纳任何数据类型。这使得ref更适合一般的响应式状态的声明。
  • 官方推荐: 官方文档强烈建议使用ref()作为声明响应式状态的首选。这是因为ref更简单、更直观,同时避免了reactive可能引发的一些问题。

使用方法上的对比

reactive的局限性

1. 只能声明引用数据类型(对象)ref() 可以声明任意类型

js 复制代码
let obj = reactive({  
  name: '小明',  
  age: 18  
})

// 对象  
const state = ref({})  
// 数组  
const state2 = ref([])

2. reactive 使用不当会失去响应

  • 赋值给 reactive 一个整个对象或 reactive 对象
js 复制代码
let state = reactive({ count: 0 })  
// 这个赋值将导致 state 失去响应  
state = { count: 1 }
// 并不会触发修改 DOM ,说明失去响应了  
state = reactive({ count: 11 });

解决方法

  1. 不要直接整个对象替换,一个个属性赋值
  2. 使用 Object.assign
  3. 使用 ref 定义对象
  4. 使用数组的 push 方法
js 复制代码
let state = reactive({ count: 0 })  
// state = { count: 1 }  ×
state.count = 1   
state = Object.assign(state, { count: 1 }) 

let state = ref({ count: 0 })  
state.value = { count: 1 } 
  • reactive 对象解构会失去响应,ref定义对象解构也会失去响应式
js 复制代码
let state = reactive({ count: 0 })  
// 普通解构,count 和 state.count 失去了响应性连接  
let { count } = state  
count++ // state.count 值依旧是 0

解决方案:

  1. 使用 toRefs 解构,解构后的属性是 ref 的响应式变量
  2. ref定义对象解构也需要toRefs
js 复制代码
const state = reactive({ count: 0 })  
// 使用 toRefs 解构,后的属性为 ref 的响应式变量  
let { count } = toRefs(state)  
count.value++ // state.count 值改变为 1
  • reactive 对象的属性赋值给变量(断开连接/深拷贝) ,对该变量的赋值不会影响原来对象的属性值。
js 复制代码
let state = reactive({ count: 0 })  
// 赋值给 n,n 和 state.count 不再共享响应性连接  
let n = state.count  
// 不影响原始的 state  
n++  
console.log(state.count) // 0
相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万2 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋2 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁2 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95272 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大2 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师2 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学2 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端