一篇文章搞定Vue3响应式数据最常用的ref、reactive、computed、watch方法

前言 

Vue3 中可以通过响应式 API 来创建响应式对象,相较于 Vue2 中使用 Object.definProperty 来劫持 get 和 set 不同,Vue3 中使用的是 Proxy 来创建响应式对象,使用Proxy有以下几点优势:

1. 对象新增属性不再需要手动 $set 添加响应式,Proxy 默认会监听动态添加属性和属性的删除等操作。

2. 消除无法监听数组索引,length 属性等等,不再需要在数组原型对象上重写数组的方法。

3. Object.defineproperty 是劫持所有对象属性的 get/set 方法,需要遍历递归去实现,Proxy 是代理整个对象。

4. Vue2 只能拦截对象属性的 get 和 set 操作,而 Proxy 拥有 13 种拦截方法。

下面介绍了Vue3中最常用搞定几个响应式函数ref、reactive、computed、watch

1. ref响应式数据

ref,接受一个内部值,返回一个响应式的、可更改的 ref 对象,此对象只有一个指向其内部值的属性 .value

ref中可以是基本数据类型也可以是引用数据类型

// 基本类型
let username = ref('xujingliang');
// 引用类型
let submitForm = ref({'username':'xujingliang','password':'123456'})// 访问值
console.log(username.value);
console.log(submitForm.value.username);// 修改值
username.value = "liudehua";
submitForm.value.username = "liudehua";

* 在template模版中使用ref响应式数据直接写名字即可

* 但是在js中如果想引用或者修改ref的值则需要加上.value属性来访问和修改值

2. reactive响应式函数

reactive ,返回一个对象的响应式代理。

reactive中的值只能是引用类型,即对象、数组

let userInfo = reactive({'username':'xujingliang','password':'123456'});let userList = reactive([{'username':'xujingliang','password':'123456'},{'username':'xujingliang','password':'123456'}]);// 访问userInfo中的值
console.log(userInfo.username);// 修改userInfo中的值
userInfo.username = 'liudehua';

* 在template模版中使用reactive响应式数据直接写名字即可

* 与ref不同,在js中访问和修改reactive的值只需要访问变量名即可

总结:ref和reactive学完了,二者都是实现响应式数据,那么什么时候用ref?什么时候用reactive你知道吗?

 下面我就总结了常见的几种情况

变量类型使用方式
对象当变量为Object时适合使用reactive来定义
数组                                                        

1、如果数组内容赋值后不变动,很适合用reactive,比如从接口请求到的下拉选项,字典;
2、如果数组内容会根据某些情况变动,就适合用ref,比如分页表格。用reactive也可以,但是会想要修改渲染后的数据稍显麻烦;

数字、字符、布尔值

reactive不支持基本数据类型,只能用ref了

3. computed计算函数

computed,计算属性computed是依赖于使用它的数据,当数据发生变化时,自定义方法重新调用执行一次计算属性,监测的是依赖值,依赖变化的情况下才会重新计算。

<script setup>
import { ref,computed } from 'vue'// 数量
const count = ref(10);// 单价
const price = ref(9.99);// 根据响应式数据count和price计算后的总价
const sum = computed(()=>{return count.value*price.value;  //基于响应式数据做计算之后的值
})</script><template><p>请输入数量:<input type="number" v-model="count" /></p><p>请输入单价:<input type="number" v-model="price" /></p><p>数量:{{count}},单价:{{price}},总共{{sum}}</p>
</template>

在实例代码中我们定义了响应式变量 商品数量:count 和 响应式变量 商品单价price,通过计算数量和单价之后,获取响应式数据商品总价的值sum;

4. watch侦听函数

watch,当需要在数据变化时执行异步或开销较大的操作时,computed是无法操作异步数据的,所以需要使用watch进行侦听。

4.1 watch侦听单个数据

侦听器watch作用是侦听一个或多个数据的变化,数据变化时执行的回调函数,两个额外参数:immediate(立即执行)和deep(深度侦听) 

<script setup>
import { ref,watch } from 'vue'// 存放响应式数据count
const  count = ref(10);// 存放状态的响应式数据 state
const state = ref("");// 监听count数据的变化
watch(count,(newValue,oldValue)=>{state.value = "count发生了变化,当前值为"+count.value;
},{deep:true})</script><template><p><button @click="count++">点击+1</button></p><p>状态:{{state}}</p>
</template>

示例代码中,我们通过点击按钮使响应式数据count自增,通过watch监听count的值变化进行操作。

 4.2 侦听多个数据
<script setup>
import { ref,watch } from 'vue'// 存放响应式数据count
const  count = ref(10);// 存放响应式数据price
const price= ref(9.9);// 存放状态的响应式数据 state
const state = ref("");// 监听count数据的变化
watch([count,price],([newCont,oldCount],[newPrice,oldPrice])=>{state.value = "count发生了变化,当前count值为:"+count.value+",当前price值为:"+price.value;
},{deep:true})</script><template><p><button @click="count++">点击cont+1</button>&nbsp;<button @click="price++">点击price+1</button></p><p>状态:{{state}}</p>
</template>

示例代码中,我们通过点击按钮分别使响应式数据count和price自增,通过watch监听count和price的值变化进行操作。

4.3 精准的监听对象的某个值
<script setup>
import { ref,watch } from 'vue'// 存放响应式数据userInfo
const  userInfo = ref({username:"admin",password:"123456"
});// 触发password修改
setTimeout(()=>{userInfo.value.password = "123123";
},3000)// 监听userInfo中的值变化
watch(()=>userInfo.value.password,(newValue,oldValue)=>{alert("密码发生改变")},{immediate:true,deep:true}
)</script><template></template>

在上述代码示例中,我添加了两个参数,一个是immediate,一个是deep

immediate:在侦听器创建时立即触发回调,响应式数据变化之后继续执行回调,其语法格式如下。

 deep:通过watch监听的ref对象默认是浅层侦听的,直接修改嵌套的对象属性不会触发回调执行。

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

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

相关文章

创建型模式 | 原型模式

一、原型模式 1、原理 原型模式&#xff0c;用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象&#xff0c;而且不需要知道任何创建的细节。原型像是一个模板&#xff0c;可以基于它复制好多…

LeetCode Hot100 215.数组中的第k个最大元素

题目&#xff1a; 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 方法一&#xff…

HTML输出特殊字符详细方法

以下是部分特殊字符代码表&#xff0c;它们的完整应用代码格式为&#xff1a;&#;用下面的四位数字替换&#xff0c;将得到对应的符号。&#xff08;注意&#xff1a;应用这些代码&#xff0c;编辑器应该切换到HTML模式&#xff09; ☏260f ☎260e ☺263a ☻263b ☼263c ☽…

Leetcode—73.矩阵置零【中等】

2023每日刷题&#xff08;六十六&#xff09; Leetcode—73.矩阵置零 空间复杂度为O(mn)版实现代码 class Solution { public:void setZeroes(vector<vector<int>>& matrix) {int rowLen matrix.size();int colLen matrix[0].size();vector<int> row…

阿赵UE学习笔记——3、常用界面窗口

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。继续学习虚幻引擎&#xff0c;这次介绍的是编辑器的常用界面窗口。 一、视口 这个视口的概念&#xff0c;可以体现出UE对于多屏幕同时显示是多么的友好。我们开发游戏的时候&#xff0c;一般都会同一台电脑用2个或者以上显示器…

Spring Security登录的简单解析

Spring Security登录的简单解析 1.自己写的登录2.进入authenticationManager.authenticate(authenticationToken);3 进入result provider.authenticate(authentication);4 进入 user retrieveUser(username, (UsernamePasswordAuthenticationToken) authentication);5 进入 U…

算法基础之约数之和

约数之和 核心思想&#xff1a; #include<iostream>#include<algorithm>#include<vector>#include<unordered_map>using namespace std;typedef long long LL;const int N 110 , mod 1e97;int main(){int n;cin>>n;unordered_map<int,int&…

需求:通过按钮的点击事件控制另一个输出框/按钮的点击

目录 第一章 接到需求 第二章 了解需求 第三章 解决需求 第四章 优化代码 第五章 解决问题 第一章 接到需求 最近开发的时候遇到这么一个事&#xff0c;技术经理是个全栈&#xff0c;已经把接口生成了&#xff0c;而且前端页面也写好了一个初稿&#xff0c;操作什么的功…

【已解决】taos时序数据库3.0版本,怎么按照时间分组?

taos数据库中按照时间分组&#xff0c;在2.4版本时候可以直接使用INTERVAL(time_unit)来查询。例如 前面可以直接添加_ts的。但是在3.0版本之后&#xff0c;如果直接使用的话&#xff0c;只会返回count&#xff1a; 没有前面的时间。那么在3.0版本时候&#xff0c;怎么修改呢&a…

在mt4上怎么查看CHFJPY品种的合约细则?

在MetaTrader 4 (MT4) 上查看CHFJPY品种的合约细则的方法如下&#xff1a; FXCM福汇官方个人注册登录流程 1.打开MT4软件并登录到您的交易账户。 2.在MT4界面的"市场观察"窗格中&#xff0c;找到并右键单击"CHFJPY"货币对。如果您无法找到"市场观察…

时间是如何定义的

每年365天&#xff0c;每天24小时&#xff0c;每小时60分钟&#xff0c;每分钟60s&#xff0c;这是我们习以为常的时间计量单位&#xff0c;那么在继续往下&#xff0c;1s是多少&#xff1f;几时几刻、几点几分是如何确定的&#xff1f;带着这些问题&#xff0c;展开本文。 1、…

常见分布的分布列/概率密度、分布函数、期望、方差、特征函数

0-1分布 二项分布 泊松分布 几何分布 均匀分布 正态分布 指数分布 伽马分布 卡方分布

2023.12.18 关于 CentOS7 安装 Redis5

目录 安装步骤 创建符号连接 修改配置文件 启动 redis 服务器 停止 redis 服务器 安装步骤 CentOS7 的 yum 仓库中&#xff0c;redis 的默认版本为 3 系列为了 能让 CentOS7 安装上 Redis5&#xff0c;此处我们需要安装额外软件源 1、安装额外软件源 yum install cento…

腾讯云消息队列11月产品月报 | RocketMQ 5.x 国际站上线

2023年 11月动态 消息队列 RocketMQ 版 1、5.x 形态国际站上线 国际站上线 5.x 集群全系列&#xff0c;第一批先开放新加坡和硅谷地域。 控制台链接&#xff1a;https://console.tencentcloud.com/trocketmq 2、 无感迁移能力 支持用户白屏化操作&#xff0c;将自建的 Roc…

提前预判和确认再做 现货白银投资的两种思路

在现货白银投资中&#xff0c;对于交易的步骤长期有两种看法。一种是提前预判行情并提前布局。另外一种是等待行情启动再做布局。这种两种方法要怎么选呢&#xff1f;笔者将从自己的角度出发&#xff0c;对这个问题进行讨论。 我们来看一下前一种的投资者&#xff0c;他们喜欢提…

标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”

各位CSDN的uu们好呀&#xff0c;今天&#xff0c;继续小雅兰西嘎嘎的学习&#xff0c;标准库中的string类&#xff0c;下面&#xff0c;让我们一起进入西嘎嘎string的世界吧&#xff01;&#xff01;&#xff01; string类的常用接口说明 Leetcode每日一题 string类的常用接口…

pip 常用指令 pip install 命令用法介绍

pip install 是一个 Python 包管理器命令&#xff0c;用于安装 Python 包。pip 是 Python 的一个重要工具&#xff0c;可以用来安装、升级和卸载 Python 包。 pip install 命令的一些常见参数有 -r&#xff1a;从一个需求文件中安装所有的包。-U 或 --upgrade&#xff1a;升级…

鸿蒙开发基本概念

1、开发准备 1.1、UI框架 HarmonyOS提供了一套UI开发框架&#xff0c;即方舟开发框架&#xff08;ArkUI框架&#xff09;。方舟开发框架可为开发者提供应用UI开发所必需的能力&#xff0c;比如多种组件、布局计算、动画能力、UI交互、绘制等。 方舟开发框架针对不同目的和技术…

基于MLP完成CIFAR-10数据集和UCI wine数据集的分类

基于MLP完成CIFAR-10数据集和UCI wine数据集的分类&#xff0c;使用到了sklearn和tensorflow&#xff0c;并对图片分类进行了数据可视化展示 数据集介绍 UCI wine数据集&#xff1a; http://archive.ics.uci.edu/dataset/109/wine 这些数据是对意大利同一地区种植的葡萄酒进…

[SWPUCTF 2021 新生赛]jicao

首先打开环境 代码审计&#xff0c;他这儿需要进行GET传参和POST传参&#xff0c;需要进行POST请求 变量idwllmNB&#xff0c;进行GET请求变量json里需要含参数x以及jsonwllm 构造 得到flag