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。

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

相关推荐
迅猛龙办公室4 分钟前
python实现简单进度条
java·前端·python
斯内普吖9 分钟前
(开源)宠物饲养系统实战指南 基于 Java + SSM + Vue + MySQL
java·vue.js·mysql·开源·宠物
Rosanci15 分钟前
Codex 下载与本地部署实战:从安装到运行全流程指南
开发语言·前端·算法·chatgpt·codex
zhangzeyuaaa19 分钟前
深入 Ruby:Block、Proc、Lambda 核心区别与最佳实践
开发语言·前端·ruby
liangshanbo12151 小时前
前端高级面试题:WebSocket 双向流式通信怎么设计?
前端·websocket·网络协议
可乐鸡翅yeah_1 小时前
新手梳理:HLS 线上问题,哪些该提给 CDN,哪些该找后端切片服务
开发语言·前端·javascript·vue.js·网络协议·http·m3u8在线
zwd20051 小时前
Manim arrange 和 arrange_in_grid 用法详解:buff、aligned_edge、rows/cols(0.21.0 实测)
前端·python·edge
Q26433650231 小时前
【有源码】基于SpringBoot+Vue的博物馆展览与服务一体化平台-java博物馆数字化展品展示与交互平台设计
java·vue.js·spring boot·spring·毕业设计·javaweb·课程设计
小小龙学IT1 小时前
Go 语言 reflect 反射包深度解析:从 Type/Value 到三大定律与工业实践
前端·golang
小溪学编程1 小时前
C语言篇:枚举类型
java·c语言·前端