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

【Vue】将响应式对象转为非响应式对象

一、使用 toRaw 函数获取原始对象

作用:获取由 reactive()ref() 创建的代理对象的原始数据副本,解除响应式追踪。 实现

import { reactive, toRaw } from 'vue';
const proxy = reactive({ name: '张三' });
const rawData = toRaw(proxy); // 获取原始对象
rawData.name = '李四'; // 修改不会触发视图更新
console.log(proxy.name); // '李四'(数据同步变化,但无响应式触发)

特点

  • 引用关系保留rawData 是原响应式对象的引用,修改会影响原对象数据,但不会触发视图更新。
  • 适用场景:序列化数据(如提交给后端)、传递到非响应式第三方库时使用。

二、通过 markRaw 永久标记非响应式

作用:标记对象或属性,使其即使被嵌套在响应式对象中也不会转换为 Proxy。 实现

import { reactive, markRaw } from 'vue';
const obj = markRaw({ price: 100 }); // 标记为非响应式
const state = reactive({product: obj // 嵌套后仍为非响应式
});
state.product.price = 200; // 修改有效,但不会触发响应式更新

特点

  • 深度阻断:被标记对象的所有层级属性均不会成为响应式。
  • 适用场景:静态配置数据、复杂类实例或大型列表性能优化。

三、直接解构(Vue3.4以及之前)或赋值导致响应性丢失

原理:响应式依赖通过属性访问触发追踪,直接解构或赋值会破坏引用链。 示例

const proxy = reactive({ count: 0 });
let { count } = proxy; // 解构基本类型
count++; // 不影响原对象
const localObj = proxy.obj; // 解构引用类型
localObj.name = 'test'; // 修改会影响原对象,但无响应式更新

注意

  • 深层次对象:若解构的是对象,修改其属性仍会影响原数据,但不会触发视图更新(需配合 toRawmarkRaw 彻底解除)。

四、替换整个响应式对象

场景:通过重新赋值整个对象来“重置”响应式状态。 实现

let state = reactive({ list: [] });
// 直接替换为新对象(需注意引用丢失问题)
state = { list: [1, 2, 3] }; // 新对象无响应式

局限性

  • 响应式覆盖问题:需重新调用 reactive()ref() 才能使新对象恢复响应式。

方法对比与选型建议

方法响应式影响范围数据引用关系适用场景
​​toRaw​​解除单次代理保持引用临时数据导出、避免副作用
​​markRaw​​永久阻断嵌套响应式保持引用静态数据、性能优化
​​解构/赋值​​局部属性失去响应式可能断开简单数据操作

扩展:源码视角下的响应式解除

从 Vue3 源码看,reactive() 基于 Proxy 实现,而 ref() 通过 RefImpl 包装对象。toRaw 通过访问代理对象的 __v_raw 属性获取原始数据,而 markRaw 会给对象添加 __v_skip 标记,跳过响应式转换。因此,合理使用这些 API 能精准控制响应式边界。

相关文章:

  • (37)服务器增加ipv6配置方法
  • 浪潮Inspur服务器产品线概述
  • van-picker实现日期时间选择器
  • fatal error: uuid/uuid.h: No such file or directory 编译问题修复。
  • linux杀死进程自身
  • 准备好,开始构建:由 Elasticsearch 向量数据库驱动的 Red Hat OpenShift AI 应用程序
  • linux二进制安装mysql:
  • STM32之模数转换器(ADC)
  • 第三次中医知识问答模型微调
  • FFmpeg解码器配置指南:为什么--enable-decoders不能单独使用?
  • 【CSS】九宫格布局
  • Windos11家庭版安装本地安全策略
  • 线程池线程数配置
  • LeRobot的机器人控制系统(上)
  • Python 响应报文提取方式
  • 完整改进RIME算法,基于修正多项式微分学习算子Rime-ice增长优化器,完整MATLAB代码获取
  • [Linux]Linux多线程编程技术探讨(代码示例)
  • Metal入门,使用Metal实现灯光效果和噪点效果
  • Linux LVM管理
  • 怎么把https://github.com项目拉到自己的github
  • wordpress制作关于页面/长沙seo关键词
  • 口碑好的邯郸网站建设/浙江疫情最新消息
  • 电子商务网站建设与运营/推广普通话的意义50字
  • 动态网站开发 PHP/杭州网站建设方案优化
  • 湖南张家界建设厅网站/站内推广方式有哪些
  • 李宁网站建设的可行性/网络推广的方式有哪些