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

embedded/2025/1/12 5:46:36/

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.ppmy.cn/embedded/153220.html

相关文章

Qt 智能指针

Qt 智能指针 文章目录 Qt 智能指针QScopedPointer1. 自动删除对象2. 转移所有权3. 管理私有数据 QSharedPointer关键特性注意事项 QWeakPointer注意事项 QPointer QScopedPointer QScopedPointer 是 Qt 提供的一个智能指针,主要用于简化资源管理,防止内…

ETL的工作原理

ETL的工作原理 什么是ETL_云计算主题库-阿里云 ETL的工作原理可以分为三个主要的步骤:Extract(提取)、Transform(转换)、Load(加载)。 工作步骤 描述 Extract (提取)…

doris:手动分区

分区列​ 分区列可以指定一列或多列,分区列必须为 KEY 列。PARTITION 列默认必须为 NOT NULL 列,如果需要使用 NULL 列,应设置 session variable allow_partition_column_nullable true。对于 LIST PARTITION,支持真正的 NULL 分…

Table-Augmented Generation(TAG):Text2SQL与RAG的升级与超越

当下AI与数据库的融合已成为推动数据管理和分析领域发展的重要力量。传统的数据库查询方式,如结构化查询语言(SQL),要求用户具备专业的数据库知识,这无疑限制了非专业人士对数据的访问和利用。为了打破这一壁垒&#x…

学习虚幻C++开发日志——创建Selection Widget及其应用

教程视频:脚本冒险 - YouTube 前提:此代码运用到Common UI插件,需将其开启,以免后序编写产生未定义结构体的报错信息! 用C进行UI绑定 创建继承于CommonUserWidget的类,此处命名为SelectionBase Select…

【C++开源库】tinyxml2解析库使用介绍

TinyXML-2是一个在C中使用的轻量级、简单且高效的XML解析库。它由Lee Thomason开发,旨在提供快速解析和生成XML数据的功能,同时保持代码的简洁性和易于使用。TinyXML-2支持多种编译器和平台,包括Windows、Linux和macOS。 特点与优势 简单易用…

VUE3 VITE项目在 npm 中,关于 Vue 的常用命令有一些基础命令

如果你正在使用 Vite 构建的 Vue 3 项目,并且想要使用相关的 Vue 和 Vite 工具,下面是一些常用的命令和步骤来创建和管理 Vue 项目。 1. 使用 npm create 创建 Vue 3 项目(Vite) 如果你还没有创建项目,可以使用以下命…

UE5 打包要点

------------------------- 1、需要环境 win sdk ,大约3G VS,大约10G 不安装就无法打包,就是这么简单。 ----------------------- 2、打包设置 编译类型,开发、调试、发行 项目设置-地图和模式,默认地图 项目…