当前位置: 首页 > news >正文

reactive 解构赋值给 ref

在 Vue 3 中,当你执行以下操作时:

javascript

const applyBasicInfo = ref();
applyBasicInfo.value = { ...props.applyBasicInfo };

最终的 applyBasicInfo.value 是响应式对象,但与原对象 props.applyBasicInfo 的响应性完全独立,且解构过程本身会丢失原对象的响应性连接


关键分析

1. 解构操作 { ...props.applyBasicInfo } 的行为
  • 这会创建一个全新的普通对象,属性值会被复制到新对象中。

  • 如果 props.applyBasicInfo 是响应式对象(如 reactive 生成),其属性的响应性会丢失(解构后的值是原始值,而非响应式引用)。

2. 赋值给 ref 的行为
  • 当你将普通对象赋值给 ref.value 时,Vue 会自动用 reactive() 包裹它,使其成为响应式对象。

  • 因此,applyBasicInfo.value 最终会是一个独立的响应式对象,但与原对象 props.applyBasicInfo 无关联。


示例验证

javascript

import { reactive, ref, isReactive } from 'vue';// 原对象是响应式的
const props = reactive({applyBasicInfo: { name: 'John', age: 25 }
});// 创建 ref
const applyBasicInfo = ref();// 解构并赋值
applyBasicInfo.value = { ...props.applyBasicInfo };// 验证结果
console.log(isReactive(applyBasicInfo.value)); // 输出: true ✅
console.log(applyBasicInfo.value === props.applyBasicInfo); // 输出: false ❌

结果总结

操作结果响应性与原对象关联性
{ ...props.applyBasicInfo }创建新普通对象❌ 丢失原响应性无关联
applyBasicInfo.value = 新对象Vue 自动用 reactive() 包裹✅ 新对象独立响应式无关联

需要注意的陷阱

  1. 响应性独立
    修改 applyBasicInfo.value 的属性会触发响应式更新,但不会影响原对象 props.applyBasicInfo,反之亦然。

  2. 解构的响应性丢失
    如果 props.applyBasicInfo 的某些属性是响应式引用(如 ref),解构会直接获取其值(例如 ref.value),导致响应性丢失。例如:

    javascript

    props.applyBasicInfo = reactive({ count: ref(0) });
    applyBasicInfo.value = { ...props.applyBasicInfo };
    // applyBasicInfo.value.count 是 0(普通值,非响应式)

如何保持与原对象的响应性连接?

方案 1:直接引用原对象

javascript

// ✅ 直接使用原响应式对象
applyBasicInfo.value = props.applyBasicInfo;
方案 2:深拷贝为响应式对象(独立响应性)

javascript

import { reactive } from 'vue';// ✅ 深拷贝并保持独立响应性
applyBasicInfo.value = reactive({ ...props.applyBasicInfo });
方案 3:使用 toRef 保持响应性连接

javascript

import { toRef } from 'vue';// ✅ 将原对象的属性转为响应式引用
applyBasicInfo.value = {name: toRef(props.applyBasicInfo, 'name'),age: toRef(props.applyBasicInfo, 'age')
};

核心结论

  • 解构会丢失响应性,但赋值给 ref 时会自动转为响应式对象。

  • 新旧对象完全独立:修改 applyBasicInfo.value 不会影响原对象 props.applyBasicInfo

  • 如果需要保持与原对象的响应性连接,避免解构,直接操作原对象

相关文章:

  • MVCC详细介绍及面试题
  • 1.Framer Motion 中 motion/react 和 motion/react-client 的用法和区别
  • A009-基于pytest的网易云自动化测试
  • react-07React提交表单数据调用同一方法(高阶函数,函数柯里化概念)
  • 浅析基于单片机的数字时钟与温度显示系统的设计
  • 50kN载重汽车轮胎高速耐久试验机
  • 【Linux】基础 IO(文件描述符、重定向、缓冲区)
  • Rust泛型与特性
  • 【数据结构】之散列
  • Xtuner微调大模型
  • 同济大学轻量化低成本具身导航!COSMO:基于选择性记忆组合的低开销视觉语言导航
  • Ubuntu系统18.04更新驱动解决方法
  • [CMake] CMakePresets.json简单使用
  • 不同编译器ARM MCU的指令与伪指令相同吗?
  • Unity 一些小功能(屏幕画画,)
  • 【网络编程】网络编程基础和Socket套接字
  • AF3 generate_chain_data_cache脚本解读
  • TDengine 与其他时序数据库对比:InfluxDB/TimescaleDB 选型指南(一)
  • AI智能体小结
  • 主流Embedding模型优劣势解析与技术选型指南(2025年4月)
  • 五一假期首日,多地党政主官暗访督查节日安全和值班值守工作
  • 微博:严厉打击对肖某董某事件蹭炒热点、编造故事博流量等行为
  • 空调+零食助顶级赛马备战,上海环球马术冠军赛将焕新登场
  • 200枚篆刻聚焦北京中轴线,“印记”申遗往事
  • 中国海油总裁:低油价短期影响利润,但也催生资产并购机会
  • 违规行为屡禁不止、责任边界模糊不清,法治日报:洞穴探险,谁为安全事故买单?