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

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

相关推荐
weixin_382395233 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__3 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.3 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~4 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华5 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子7 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅8 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni8 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学9 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端