vue3 ref 和reactive的区别

定义和用法:

ref函数


作用: 定义一个响应式的数据

语法: const xxx = ref(initValue)

创建一个包含响应式数据的引用对象(reference对象,简称ref对象)。

JS中操作数据: xxx.value

模板中读取数据: 不需要.value,直接:<div>{ {xxx}}</div>

备注:

接收的数据可以是:基本类型、也可以是对象类型。

基本类型的数据:响应式依然是靠Object.defineProperty()的get与set完成的。

对象类型的数据:内部 “ 求助 ” 了Vue3.0中的一个新函数—— reactive函数。

reactive函数


作用: 定义一个对象类型的响应式数据(基本类型不要用它,要用ref函数)

语法:const 代理对象= reactive(源对象)接收一个对象(或数组),返回一个代理对象(Proxy的实例对象,简称proxy对象)

reactive定义的响应式数据是“深层次的”。

内部基于 ES6 的 Proxy 实现,通过代理对象操作源对象内部数据进行操作。

区别:

reactive对比ref


从定义数据角度对比:

ref用来定义:基本类型数据。

reactive用来定义:对象(或数组)类型数据。

备注:ref也可以用来定义对象(或数组)类型数据, 它内部会自动通过reactive转为代理对象。

从原理角度对比:

ref通过Object.defineProperty()的get与set来实现响应式(数据劫持)。

reactive通过使用Proxy来实现响应式(数据劫持), 并通过Reflect操作源对象内部的数据。

从使用角度对比:

ref定义的数据:操作数据需要.value,读取数据时模板中直接读取不需要.value。

reactive定义的数据:操作数据与读取数据:均不需要.value。
 

其他:

toRef:


作用:创建一个 ref 对象,其value值指向另一个对象中的某个属性。

语法:const name = toRef(person,'name')

应用: 要将响应式对象中的某个属性单独提供给外部使用时。

扩展:toRefs 与toRef功能一致,但可以批量创建多个 ref 对象,语法:toRefs(person)

toRaw:

  • 作用:将一个由reactive生成的响应式对象转为普通对象

  • 使用场景:用于读取响应式对象对应的普通对象,对这个普通对象的所有操作,不会引起页面更新。

markRaw:

  • 作用:标记一个对象,使其永远不会再成为响应式对象。

  • 应用场景:

    1. 有些值不应被设置为响应式的,例如复杂的第三方类库等。

    2. 当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能。

shallowReactive 与 shallowRef


shallowReactive:只处理对象最外层属性的响应式(浅响应式)。

shallowRef:只处理基本数据类型的响应式, 不进行对象的响应式处理。

什么时候使用?

如果有一个对象数据,结构比较深, 但变化时只是外层属性变化 ===> shallowReactive。

如果有一个对象数据,后续功能不会修改该对象中的属性,而是生新的对象来替换 ===> shallowRef。

更多vue3新特性请看我的另一篇文章:

关于vue3的其他详细资料,欢迎在我的博客列表里搜索关键字:

推荐阅读:

Vue3快速上手资料!手把手带你彻底学会Vue3,超详细讲解!不怕学不会!【建议收藏】【尚硅谷Vue2.0+Vue3.0全套教程丨vuejs从入门到精通vue3笔记资料】_南北极之间的博客-CSDN博客​Vue3快速上手1.Vue3简介2.Vue3带来了什么1.性能的提升2.源码的升级3.拥抱TypeScript4.新的特性一、创建Vue3.0工程1.使用 vue-cli 创建官方文档:创建一个项目 | Vue CLI## 查看@vue/cli版本,确保@vue/cli版本在4.5.0以上vue --version## 安装或者升级你的@vue/clinpm install -g @vue/cli## 创建vue chttps://blog.csdn.net/qq_22182989/article/details/125245889

猜你喜欢

转载自blog.csdn.net/qq_22182989/article/details/125655210