vue3中ref、reactive的理解

        本文主要介绍了vue3中ref、reactive的使用。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
        在讲解这两个api工具之前,我们得先了解下watch和watchEffect这两个函数的使用方法和它的一些惊人的秘籍。

目录

watch和watchEffect的秘籍

watch

watchEffect

ref、reactive的理解

ref

reactive

扩展知识

toRef

toRefs

shallowRef

shallowReactive

总结


watch和watchEffect的秘籍

watch

        其实,watch我们可以简单的理解为vue2中的watch勾子函数。就是监听数据发生变化时所执行的操作。它有三个参数,分别如下。
        参数一:需要监听的数据(可以是任意的数据类型,整型、字符串、布尔值、json对象、数组)
        参数二:数据发生变化时所执行的操作(回调函数有两个参数,发生变化后的新值,和旧值)
        参数三:额外的配置项(它是一个可选的参数)
        参数一和参数二我就不多说,应该都能理解。在这儿我讲解下参数三的使用规则。虽然参数三是一个可选项,但它的配置会引发整个wath函数的使用规则。参数三主要有以下几个配置

const info = reactive({a:5,b:6})
watch(info,(n,o)=>{console.log(n , 'n')},{deep:true, //是否深度监听 immediate:true, //是否在监听时立即触发,我们可以简单理解成页面加截完成时就执行flush:'post' ,//调整回调函数的刷新时机(这个我还没理解透)}
)

watchEffect

        watchEffect 跟 watch 类似,但它也有些不太一样的地方。watchEffect它是立即执行的。也就是说,只要有监听,它就会立即监听,这不同于 watch。watch如果在配置中配置 immediate:false,那它就不会立即监听,只有被监听的数据发生变化时才会执行监听的动作。而在watchEffect中,它的参数有两个

        参数一:副作用函数,也就是说,监听到数据时所需要执行操作。不管是哪个数据,只有有监听,它就会执行。

        参数二:配置项(可选参数)

watchEffect(()=>{//执行的副作用函数
} , {flush:'post'
})

ref、reactive的理解

        在简简理解 watch 和 watchEffect 之后,我们来理解下开发中最最常用的两个函数,ref 、reactive。虽然这两个函数都是响应式的函数,但它还是有一些区别的。

ref

        ref一般用来定义基础的数据类型,整型,字符串、布尔值。虽然它也可以定义复杂的数据类型(数组、json对象)但不建议这样子去弄。按官方文档的来。

const num = ref(5); //定义
console.log(num.value) //注意:取值的时候需要使用 .value 才能取得到值

reactive

        reactive它是用来定义复杂的数据类型。数组、json对象,它取值的时候只需要变量.key就可以了。

const info = reactive({name:'xiaobing' , age:15})
console.log(info.age)
console.log(info.name)

扩展知识

toRef

        toRef的做用就是把 reactive 里面的每一个key抽出来,转换成一个基本的数据类型。而抽离出来的数据仍旧是一个响应式的数据。

const info = reactive({name:'xiaobing' , age:15})
const name = toRef(info , 'name')watch(info,(n,o)=>{console.log(n , 'n')},{deep:true, //是否深度监听 immediate:true, //是否在监听时立即触发,我们可以简单理解成页面加截完成时就执行flush:'post' ,//调整回调函数的刷新时机(这个我还没理解透)}
)//点击按纽的事件
const check = ()=>{name.value = 'hello xiaobing'
}

toRefs

        相应的,toRefs跟 toRef 类似,只是他解出来的是一个数组。也是一个响应式的数据

const info = reactive({name:'xiaobing' , age:15})
const { name , age } = toRefs(info)watch(info,(n,o)=>{console.log(n , 'n')},{deep:true, //是否深度监听 immediate:true, //是否在监听时立即触发,我们可以简单理解成页面加截完成时就执行flush:'post' ,//调整回调函数的刷新时机(这个我还没理解透)}
)//点击按纽的事件
const check = ()=>{name.value = 'hello xiaobing'
}

shallowRef

        对于 shallowRef  中定义的复杂数据类型,如果只是单纯.value.xxx ,它是不会执行响应式数据更新。只有把整个大的对象一起更新,才会执行响应试数据更新。下面的例子我用的是json对象,数组也是一样的道理。或者,我们换一句话来说,shallowRef 它是浅层式更新的。

const info = shallowRef({name:'xiaobing' , age:15})watch(info,(n,o)=>{console.log(n , 'n')},{deep:true, //是否深度监听 immediate:true, //是否在监听时立即触发,我们可以简单理解成页面加截完成时就执行flush:'post' ,//调整回调函数的刷新时机(这个我还没理解透)}
)//点击按纽的事件
const check = ()=>{info.value.name = 'hello xiaobing' //它并不会执行晌应式更新info.value = {name:'hello world' , age:15}; //这个时候它会执行响应式更新
}

shallowReactive

        shallowReactive 它同样是浅层式更新。在上文我们说过 reactive 是用来定义复杂的数据类型。在这儿,我们可以这样来定义 。把 shallowReactive 也定义一个 json 对象的数据类型。但这个json 对象是多层次的。这时,就会发现,只有第一层的数据是响应式的。之后的数据并不会执行响应式的更新。

const userInfo = shallowReactive({id:5,info:{name:'xiaobing',age:15,}
})watch(userInfo,(n,o)=>{console.log(n , 'n')},{deep:true, //是否深度监听 immediate:true, //是否在监听时立即触发,我们可以简单理解成页面加截完成时就执行flush:'post' ,//调整回调函数的刷新时机(这个我还没理解透)}
)//点击按纽的事件
const check = ()=>{userInfo.id = 66; //执行响应式更新userInfo.info.name = 'hello xiaobing' //不执行响应式的更新
}

总结

        从这几个小例子我们可以看出,官方为什么不建议对于复杂的数据类型用 ref 来定义。虽然定义程序也并不会报错。但如果随着功能和程序的迭代。维护也是一个很大的成本。

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

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

相关文章

通过es+ Kibana+ LogStash收集日志

架构 服务产生的日志,通过logstash收集到es中,并通过kibana展示出来,这里不再介绍三者的作用 部署esKibana 这三个的版本尽量要保持一致,我使用的是7.13.4 通过docker部署es 命令: docker run --name elasticsea…

2024.8.12(LVS)

一、LVS 1、描述以及工作原理 1. 什么是LVS linux virtural server的简称,也就是linxu虚拟机服务器,这是一个由章文嵩博士发起的开源项目,官网是http://www.linuxvirtualserver.org,现在lvs已经是linux内核标准的一部分,使用lvs可以达到的技术目标是:通过linux达到负载均衡技…

C#压缩和解压文件

这里用两种方法实现C#压缩和解压文件 1、使用System.IO.Compression名称空间下的相关类(需引用 System.IO.Compression.FileSystem和System.IO.Compression程序集) 创建zip压缩文件 使用ZipFile类CreateFromDirectory()方法来创建zip压缩文件。它有3种重载形式,这…

【Java数据结构】---Queue

乐观学习,乐观生活,才能不断前进啊!!! 我的主页:optimistic_chen 我的专栏:c语言 ,Java 欢迎大家访问~ 创作不易,大佬们点赞鼓励下吧~ 文章目录 前言队列Queue队列的模拟…

机器学习——第十一章 特征选择与稀疏学习

11.1 子集搜索与评价 对一个学习任务来说,给定属性集,其中有些属性可能很关键、很有用,另一些属性则可能没什么用.我们将属性称为"特征" (feature) ,对当前学习任务有用的属性称为"相关特征" (relevant featu…

World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG

World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG 魔兽世界怀旧版,80级,5人副本古达克,科技队伍(BUG队伍) 副本有两个门口 这样看,是不是觉得很怪。是的,和图1刚好相反的。 因此应该翻转180…

Ubuntu视频工具

1. VLC VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影音光…

《学会 SpringBoot · 优雅停机方案》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

深入了解ISO 10012测量管理体系:从认证流程到实施周期

ISO 10012测量管理体系是国际标准化组织(ISO)推出的一项关键标准,旨在帮助企业确保测量过程的精确性和一致性。这个标准对需要精密测量的行业,如制造业、科学研究等领域尤为重要。了解ISO 10012的认证流程和实施周期,对…

Python数据可视化案例——折线图

目录 json介绍: Pyecharts介绍 安装pyecharts包 构建一个基础的折线图 配置全局配置项 综合案例: 使用工具对数据进行查看 : 数据处理 json介绍: json是一种轻量级的数据交互格式,采用完全独立于编程语言的文…

R的行和列命名和类型的转换

下面内容摘录自: 4章8节:用R做数据重塑,行列命名和数据类型转换-CSDN博客 欢迎订阅我们专栏 一、行和列命名 在数据科学和统计分析中,命名是组织和管理数据的一个重要部分。尤其是在处理复杂的多维数据集时,为行和列命…

HAProxy负载均衡详细解释

目录 1、HAProxy的负载均衡 1.1socat工具的使用 1.1.1对于单进程 1.1.2对于多进程处理方法(对haproxy做热处理) 2、Haproxy的算法 2.1静态算法 <1>static-rr <2>first 2.2动态算法 <1>roundrobin <2>leastconn <3>random 2.3其他算…

OpenGL3.3_C++_Windows(35)

PBR_IBL漫反射 IBL图像的光照(Image based lighting&#xff09;&#xff1a;非直接光源&#xff0c;它是一种更精确的环境光照输入格式&#xff0c;甚至也可以说是一种全局光照的粗略近似。环境光照&#xff1a;获取每个wi光源辐射率&#xff0c;求辐照度&#xff1a;将周围环…

手机IP地址:是根据网络还是设备决定的?

在日益数字化的今天&#xff0c;手机已经成为我们日常生活中不可或缺的一部分。它不仅是我们沟通的桥梁&#xff0c;更是我们获取信息、享受娱乐和完成工作的得力助手。然而&#xff0c;在使用手机上网的过程中&#xff0c;你是否曾经好奇过手机的IP地址是如何被分配的&#xf…

浅谈C语言位段

1、位段的定义 百度百科中是这样解释位段的: 位段&#xff0c;C语言允许在一个结构体中以位为单位来指定其成员所占内存长度&#xff0c;这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。 以下&#xff0c;我们均在VS2022的…

Llama 3.1中文微调数据集已上线,超大模型一键部署

7 月的 AI 圈真是卷完小模型卷大模型&#xff0c;精彩不停&#xff01;大多数同学都能体验 GPT-4o、Mistral-Nemo 这样的小模型&#xff0c;但 Llama-3.1-405B 和 Mistral-Large-2 这样的超大模型让很多小伙伴犯了难。 别担心&#xff01;hyper.ai 官网在教程板块为大家提供了…

创建第一个Qt项目

创建第一个QT项目 创建工程名称一般不要有特殊符号&#xff0c;不要有中文 项目工程保存路径可修改&#xff0c;路径不要带中文 Base class中的三个选项 QMainWindow:主窗口类&#xff0c;包括菜单栏、工具栏、状态栏。 QWidget:可以创建一个空白的窗口&#xff0c;是所有界…

SQL Server 2022的索引

《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;》图书介绍-CSDN博客 《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) 10.1 索引的含义…

【C++ 面试 - 基础题】每日 3 题(十)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

C# Winform序列化和反序列化

在NET Framework 4.7.2中不能用Newtonsoft.Json进行序列化和反序列化&#xff0c;为解决此问题&#xff0c;采用System.Text.Json进行序列化&#xff0c;注意要添加System.Memory的引用。 1、创建测试类 using System; using System.Collections.Generic; using System.Linq; …