ref和reactive用哪个?

ref和reactive用哪个?

1.🤖GPT🤖:ref和reactive用哪个根据数据类型而定

ref 用于将基本类型的数据(如字符串、数字,布尔值等)转换为响应式数据。使用 ref 定义的数据可以通过 .value 属性访问和修改。
reactive 用于将对象转换为响应式数据,包括复杂的嵌套对象和数组。使用 reactive 定义的数据可以直接访问和修改属性。
因此,根据使用场景的不同,选择使用 ref 还是 reactive 是有区别的:

  • 如果你只需要处理基础类型的数据,例如字符串、数字、布尔值等,可以使用 ref。
  • 如果你需要处理复杂的嵌套对象或数组,可以使用reactive。

当然,在实际开发中,你也可以同时使用 ref 和 reactive,根据需要选择相应的 API 进行操作。例如,可以使用 ref 来处理单个数据,而使用 reactive 来处理包含多个数据的对象或数组。

2.👉我👈:推荐ref一把梭

reactive 和 ref 对比
在这里插入图片描述

2.1前提知识:

2.1.1. ref既能声明基本数据类型,也能声明对象和数组;

Vue 提供了一个 ref() 方法来允许我们创建可以使用任何值类型的响应式 ref

//对象
const state = ref({})
//数组
const state2 = ref([])
2.1.2. reactive失去响应的情况:

reactive一时爽,使用不恰当的时候失去响应泪两行,开开心心敲代码过程中,会感叹!!咦?怎么不行?为什么这么赋值失去响应了? 辣鸡reactive!!! 我要用 ref 👉👉yyds

1. 给响应式对象的字面量赋一整个普通对象/reactive对象

通常在页面数据回显时,需要将AJAX请求获取的对象直接赋值给响应式对象,如果操作不当就导致reactive声明的对象失去响应

赋值一个普通对象

let state = reactive({ count: 0 })
//这个赋值将导致state失去响应
state = {count: 1}

赋值一个reactive对象

如果给reactive的响应式对象赋值普通对象会失去响应,那么给它赋值一个reactive的响应式对象不就行了吗?下面试试看

<template>{{state}}
</template>    <stcirpt setup>const state = reactive({ count: 0 })//nextTick异步方法中修改state的值nextTick(() => {//并不会触发修改DOM  ,说明失去响应了state = reactive({ count: 11 });});
</stcirpt>

在nexTick中给state赋值一个reactive的响应式对象,但是DOM并没有更新!
解决方法:

不要直接整个对象替换,对象属性一个个赋值

let state = reactive({ count: 0 })
//state={count:1}
state.conut = 1 

使用ref定义对象

个人推荐,非必要不用reactive

let state = ref({ count: 0 })
state.value={count:1}
2.将响应式对象的属性-赋值给变量(断开连接/深拷贝)

这种类似深拷贝不共享同一内存地址了,只是字面量的赋值;对该变量赋值也不会影响原来对象的属性值

let state = reactive({ count: 0 })
//赋值
// n 是一个局部变量,同 state.count
// 失去响应性连接
let n = state.count
// 不影响原始的 state
n++
console.log(state.count) //0 

有人就说了,既然赋值对象的属性,那我赋值一整个对象不就是浅拷贝了吗?那不就是上面说的给响应式对象的字面量赋一整个普通对象/reactive对象这种情况吗?这种是会失去响应的

3.直接解构时

直接解构会失去响应

解构ref声明的响应式对象也会失去响应

let state = reactive({ count: 0 })
//普通解构count 和 state.count 失去了响应性连接
let { count } = state 
count++ // state.count值依旧是0

使用toRefs解构不会失去响应

const state = reactive({ count: 0 })
//使用toRefs解构
let { count } = toRefs(state)
count++ // state.count值改变为1
4.传入一个函数时

将reactive声明的响应式对象的参数传入一个函数时,会失去响应

let state = reactive({ count: 0 })const fn = (count) => {// ⚠️ 这里的 count 是一个普通的 number (不是)console.log(count)// 不能跟踪 state.count 的改变
}//调用该函数,传入响应式对象的参数
fn(state.count)

2.2. ref一把梭

当使用reactive时,如果不了解reactive失去响应的情况,那么使用reactive会造成很多困扰!

推荐使用ref总结原因如下:

reactive只能声明引用数据类型(对象/数组)

  1. reactive在一些情况下会失去响应,这个情况会导致数据回显失去响应(数据改了,dom没更新)
    给响应式对象的字面量赋一整个普通对象,将会导致reactive声明的响应式数据失去响应
<template>{{state.a}}{{state.b}}{{state.c}}
</template>      
<script>
let state = reactive({ a:1,b:2,c:3 })
onMounted(()=>{//通AJAX请求获取的数据,回显到reactive,如果处理不好将导致变量失去响应,//回显失败,给响应式数据赋值一个普通对象state =  { a:11,b:22,c:333 }//回显成功,一个个属性赋值  state.a = 11state.b = 22state.c = 33 
})
</script>

上面这个例子如果是使用ref进行声明,直接赋值即可,不需要将属性拆分一个个赋值

使用ref替代reactive:

<template>
{{state.a}}
{{state.b}}
{{state.c}}
</template><script>
let state = ref({ a:1,b:2,c:3 })
onMounted(()=>{//回显成功state.value =  { a:11,b:22,c:333 }
})
</script>
  1. ref适用范围更大,声明的数据类型.基本数据类型和引用数据类型都行

虽然使用ref声明的变量,在读取和修改时都需要加.value小尾巴,但是正因为是这个小尾巴,我们review代码的时候就很清楚知道这是一个ref声明的响应式数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/499780.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二、TensorFlow结构分析(1)

目录 1、TF数据流图 1.1 TensorFlow结构分析 1.2 案例 2、图与TensorBoard 2.1 图结构 2.2 图相关操作 2.2.1 默认图 2.2.2 创建图 2.3 TensorBoard&#xff1a;可视化学习 2.3.1 数据序列化 - events文件 2.3.2 启动TensorBoard 2.4 OP 2.4.1 常见OP 2.4.2 指令…

HTML5:七天学会基础动画网页4

backgorund-size 值与说明 length(单位像素):设置背景图片高度和宽度&#xff0c;第一个值设置宽度&#xff0c;第二个值设置高度&#xff0c;如果只给出一个值&#xff0c;第二个是设置为auto。 percentage(百分比):以父元素的百分比来设置背景图像的宽度和高度&#xff0c…

NLP(一)——概述

参考书: 《speech and language processing》《统计自然语言处理》 宗成庆 语言是思维的载体&#xff0c;自然语言处理相比其他信号较为特别 word2vec用到c语言 Question 预训练语言模型和其他模型的区别? 预训练模型是指在大规模数据上进行预训练的模型&#xff0c;通常…

计算机网络——21拥塞控制原理

拥塞控制原理 概述 拥塞 非正式的定义&#xff1a;“太多的数据需要网络传输&#xff0c;超过了网络的处理能力”与流量控制不同拥塞的表现 分组丢失&#xff08;路由器缓冲区溢出&#xff09;分组经历比较长时间的延迟&#xff08;在路由器的队列中排队&#xff09; 网络中…

如何解决机器视觉高速图像处理软件的加密需求?

高速图像处理在机器视觉中的应用重要性 在机器视觉行业中&#xff0c;高速图像处理软件的作用至关重要&#xff0c;它使得机器能够迅速分析和处理成千上万的图像数据。这种能力在制造业、安防系统、交通监控等多个领域发挥着核心作用&#xff0c;如在制造业中&#xff0c;高速…

ROS 2基础概念#2:节点(Node)| ROS 2学习笔记

ROS 2节点简介 节点是执行计算的进程。节点组合在一起形成一个图&#xff08;graph&#xff09;&#xff0c;并使用主题&#xff08;topic&#xff09;、服务&#xff08;service&#xff09;和参数服务器&#xff08;paramter server&#xff09;相互通信。这些节点旨在以细粒…

防御安全(第六次作业)笔记整理

攻击可能只是一个点&#xff0c; 防御需要全方面进行 IAE引擎 DFI和DPI技术 --- 深度检测技术 DPI --- 深度包检测技术 --- 主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#xff09; &#xff0c;之后对 数据包的内容进行识别。&#xff08;应用层&am…

Django学习笔记-查询及修改MySQL数据库表的所有信息

1.在index中添加一个按钮,用于查询数据 2.urls配置find 3.views定义find,获取PopulationModel模型所有数据渲染到show.html页面上 4.创建show.html,遍历modellist的数据渲染到表格中显示 5.点击查询后页面显示如下 6.添加修改按钮,点击按钮,执行update,urls配置update …

在实训云平台上配置云主机

文章目录 零、学习目标一、实训云升级二、实训云登录&#xff08;一&#xff09;登录实训云&#xff08;二&#xff09;切换界面语言&#xff08;三&#xff09;规划云主机实例 三、创建网络三、创建路由器2024-2-29更新到此四、添加接口五、创建端口六、添加安全组规则七、创建…

风速预测(七)VMD-CNN-BiLSTM预测模型

目录 往期精彩内容&#xff1a; 前言 1 风速 VMD 分解与可视化 1.1 导入数据 1.2 VMD分解 2 数据集制作与预处理 3 基于Pytorch的VMD CNN-BiLSTM 预测模型 3.1 定义VMD CNN-BiLSTM预测模型 3.2 设置参数&#xff0c;训练模型 4 模型评估与可视化 4.1 结果可视化 4.2…

【无监督学习之聚类】

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 简述概要知识图谱1. K-Means聚类2. 层次聚类&#xff08;Hierarchical Clustering&#xff09;3. DBSCAN&#xff08;Density-Based Spatial Clustering of Applications with Noise&#xff09;4. 谱聚类&#xff08;Spect…

Java设计模式—— 模板方法模式

模板方法模式 1.什么是模板方法 模板方法模式&#xff1a;定义一个操作中的算法骨架&#xff08;父类&#xff09;&#xff0c;而将一些步骤延迟到子类中。 模板方法使得子类可以不改变一个算法的结构来重定义该算法的 2.什么时候使用模板方法 实现一些操作时&#xff0c;整…