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

Vue3的reactive、ref、toRefs、toRef、toRaw 和 markRaw处理响应式数据区别

reactive

reactive 用于创建一个响应式对象。它接受一个普通对象,并返回一个响应式对象(Proxy实例)。

import { reactive } from 'vue';

// 创建一个reactive类型的响应式对象
const person = reactive({
    name: 'panda',
    age: 18
});

console.log(person.name); // panda

// 修改reactive对象的属性
person.age++;
console.log(person.age); // 19

ref

ref 用于创建一个响应式的引用对象,它接受一个值作为参数,并返回一个包含value属性的对象。这个value属性是响应式的。

import { ref } from 'vue';

// 创建一个ref类型的响应式数据
const count = ref(0);
console.log(count.value); // 0

// 修改ref的值
count.value++;
console.log(count.value); // 1

toRefs

toRefs 用于将一个响应式对象转换为一个包含响应式引用的普通对象,每个ref与原对象的属性一一对应,方便在需要解构响应式对象时保持响应式。

import { reactive, toRefs } from 'vue';

// 创建一个reactive对象
const person = reactive({
    name: 'panda',
    age: 18
});

// 将reactive对象转换为包含ref的普通对象
const { name, age } = toRefs(person);

console.log(name.value); // panda
console.log(age.value); // 18

// 通过ref修改值,会影响到原始的reactive对象
name.value = 'Sam';
age.value++;

console.log(person.name); // Sam
console.log(person.age); // 19

toRef

toRef用于创建一个ref,它与响应式对象的属性建立关联,使得对ref的操作会反映到原始对象的属性上,反之亦然。

import { reactive, toRef } from 'vue';

// 创建一个reactive对象
const person = reactive({
    name: 'panda',
    age: 18
});

// 创建一个与person.age关联的ref
const ageRef = toRef(person, 'age');

console.log(ageRef.value); // 18

// 通过ageRef修改值,会影响到person.age
ageRef.value++;
console.log(person.age); // 19

toRaw

toRaw 用于获取响应式对象背后的原始对象。如果对象不是响应式的,则返回它本身。

import { reactive, toRaw } from 'vue';

// 创建一个reactive对象
const reactiveObj = reactive({
    name: 'panda',
    age: 20
});

// 获取原始对象
const rawObj = toRaw(reactiveObj);

console.log(rawObj === reactiveObj); // false

// 修改原始对象的属性,会影响到响应式对象
rawObj.age = 21;
console.log(reactiveObj.age); // 21

markRaw

markRaw标记一个对象,使其在被转换为响应式对象时被忽略,Vue 会跳过对其进行响应式处理

import { reactive, markRaw } from 'vue';

// 创建一个普通对象
const normalObj = {
    name: '李四',
    age: 30
};

// 标记为原始对象
const markedObj = markRaw(normalObj);

// 创建响应式对象,包含被标记的原始对象
const reactiveObj = reactive({
    info: markedObj
});

// 修改原始对象属性,不会触发响应式更新
markedObj.age = 31;
console.log(reactiveObj.info.age); // 30

// 直接修改响应式对象中的被标记对象,也不会触发响应式更新
reactiveObj.info = { name: '王五', age: 32 };
console.log(reactiveObj.info.age); // 30

总结

名称描述数据类型响应式与原始数据关系更新视图时机Vue版本
ref为数据添加响应式状态,返回一个具有响应式状态的副本基本类型(string、number、boolean、symbol等)及对象拷贝(对于基本类型);若传入对象,则自动转为reactive处理数据改变后立即更新Vue 3
reactive为对象数据添加响应式状态,返回一个具有响应式状态的副本对象引用关系,修改响应式数据会影响原始数据数据改变后立即更新Vue 3
toRef将某个对象中的属性变成响应式数据,保持与源对象属性的响应式连接对象属性引用关系,修改响应式数据会影响原始数据数据改变后等待下次更新Vue 3
toRefs将响应式对象转换为普通对象,其中每个属性都是指向原始对象相应属性的ref响应式对象引用关系,改变结果数据的值也会同时改变原始数据数据改变后等待下次更新Vue 3
toRaw将响应式对象转换为其原始数据格式响应式对象返回原始数据,断开响应式连接不适用Vue 3
markRaw将一个对象标记为非响应式,使其不再被Vue的响应式系统追踪普通对象标记为非响应式,Vue不再追踪其变化不适用Vue 3


http://www.kler.cn/a/488905.html

相关文章:

  • 深度学习的加速器:Horovod,让分布式训练更简单高效!
  • 【YOLOv8杂草作物目标检测】
  • 使用Keil创建FreeRTOS工程
  • 安卓投屏电脑最详细教程
  • 慧集通(DataLinkX)iPaaS集成平台-数据流程之流程透明化调试功能简介
  • Linux 下信号的保存和处理
  • 科技盛宴CES Asia 2025,企业创新活力尽显
  • uniapp路由跳转+二级页面详情跳转保留当前页方法教程
  • Win11远程桌面怎么设置?
  • CAS操作的底层原理(总线锁定机制和缓存锁定机制 )
  • SpringBoot 原理篇(day14)
  • 【python自写包模块的标准化方法】
  • 「sql之窗口函数」
  • MongoDB中的索引是提高查询效率的重要工具
  • win32汇编环境,窗口程序中对按钮控件常用操作的示例
  • Redis:持久化机制
  • Golang 并发之 Goroutine
  • Django管理后台实现ECS服务管理:权限控制与重启功能
  • (vue)el-table-column type=“selection“表格选框怎么根据条件添加禁选
  • 【PyCharm】PyCharm CE免费版下载
  • ubuntu22.04 gcc,g++从10.5切换到低版本9.5
  • openwrt 常见编译问题及编译提速
  • 多台PC共用同一套鼠标键盘
  • STM32U575按键转换及设备驱动
  • 【2025 Rust学习 --- 12 实用工具特型02】
  • ubuntu安装ssh9.2