vue3 响应式 API 之 reactive

news/2024/4/16 17:39:55/文章来源:https://blog.csdn.net/m0_49515138/article/details/128040057

reactive 是继 ref 之后最常用的一个响应式 API 了,相对于 ref ,它的局限性在于只适合对象、数组。

TIP使用 reactive 的好处就是写法跟平时的对象、数组几乎一模一样,但它也带来了一些特殊注意点,请留意赋值部分的特殊说明。

类型声明与定义
reactive 变量的声明方式没有 ref 的变化那么大,基本上和普通变量一样,它的 TS 类型如下:

function reactive<T extends object>(target: T): UnwrapNestedRefs<T>

可以看到其用法还是比较简单的,下面是一个 Reactive 对象的声明方式:

//声明对象的类型
interface Member{id:numbername:string
}
//定义一个对象
const userInfo:Member=reactive({id:1,name:'Tom'
})

下面是 Reactive 数组的声明方式:

const uids: number[] = reactive([1, 2, 3])

还可以声明一个 Reactive 对象数组:

// 对象数组也是先声明其中的对象类型
interface Member {id: numbername: string
}// 再定义一个为对象数组
const userList: Member[] = reactive([{id: 1,name: 'Tom',},{id: 2,name: 'Petter',},{id: 3,name: 'Andy',},
])

变量的读取与赋值
虽然 reactive API 在使用上没有像 ref API 一样有 .value 的心智负担,但也有一些注意事项要留意。

处理对象
Reactive 对象在读取字段的值,或者修改值的时候,与普通对象是一样的,这部分没有太多问题。

// 声明对象的类型
interface Member {id: numbername: string
}// 定义一个对象
const userInfo: Member = reactive({id: 1,name: 'Tom',
})// 读取用户名
console.log(userInfo.name)// 修改用户名
userInfo.name = 'Petter'

处理数组#
但是对于 Reactive 数组,和普通数组会有一些区别。

普通数组在 “重置” 或者 “修改值” 时都是可以直接操作:

// 定义一个普通数组
let uids: number[] = [1, 2, 3]// 从另外一个对象数组里提取数据过来
uids = api.data.map((item: any) => item.id)// 合并另外一个数组
let newUids: number[] = [4, 5, 6]
uids = [...uids, ...newUids]// 重置数组
uids = []

Vue 2 在操作数组的时候,也可以和普通数组这样处理数据的变化,依然能够保持响应性,但在 Vue 3 ,如果使用 reactive 定义数组,则不能这么处理,必须只使用那些不会改变引用地址的操作。

笔者刚开始接触时,按照原来的思维去处理 reactive 数组,于是遇到了 “数据变了,但模板不会更新的问题” ,如果开发者在学习的过程中也遇到了类似的情况,可以从这里去入手排查问题所在。

举个例子,比如要从服务端 API 接口获取翻页数据时,通常要先重置数组,再异步添加数据,如果使用常规的重置,会导致这个变量失去响应性:

let uids: number[] = reactive([1, 2, 3])/*** 不推荐使用这种方式,会丢失响应性* 异步添加数据后,模板不会响应更新*/
uids = []// 异步获取数据后,模板依然是空数组
setTimeout(() => {uids.push(1)
}, 1000)

要让数据依然保持响应性,则必须在关键操作时,不破坏响应性 API ,以下是推荐的操作方式,通过重置数组的 length 长度来实现数据的重置:

const uids: number[] = reactive([1, 2, 3])/*** 推荐使用这种方式,不会破坏响应性*/
uids.length = 0// 异步获取数据后,模板可以正确的展示
setTimeout(() => {uids.push(1)
}, 1000)

特别注意
不要对 Reactive 数据进行 ES6 的解构 操作,因为解构后得到的变量会失去响应性。

比如这些情况,在 2s 后都得不到新的 name 信息:

import { defineComponent, reactive } from 'vue'interface Member {id: numbername: string
}export default defineComponent({setup() {// 定义一个带有响应性的对象const userInfo: Member = reactive({id: 1,name: 'Petter',})// 在 2s 后更新 `userInfo`setTimeout(() => {userInfo.name = 'Tom'}, 2000)// 这个变量在 2s 后不会同步更新const newUserInfo: Member = { ...userInfo }// 这个变量在 2s 后不会再同步更新const { name } = userInfo// 这样 `return` 出去给模板用,在 2s 后也不会同步更新return {...userInfo,}},
})

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

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

相关文章

Flutter 实现局部刷新 StreamBuilder 实例详解

一、前言 在flutter项目中&#xff0c;页面内直接调用setState方法会使得页面重新执行build方法&#xff0c;导致内部组件被全量刷新&#xff0c;造成不必要的性能消耗。出于性能和用户体验方面的考虑我们经常会使用局部刷新代替全量刷新进行页面更新的操作。包括Provider、Va…

Vuex 笔记

文章目录1 Vuex 简介2 Vuex 用法2.1 安装 vuex2.2 修改 main.js,2.3 使用 mutation 改变 Store&#xff1a;2.4 带参数的 mutations:2.5 使用 getters 读取 store 数据2.6 使用 actions 执行异步代码2.7 总结2.8 使用 mapper 简化代码2.9 使用模块组织 store2.10 模块名字空间2…

如何将草料二维码收集到的表单信息同步至腾讯文档

在进行工业巡检场景如消防栓检查时&#xff0c;需要到达巡检地点后&#xff0c;扫描草料二维码&#xff0c;然后填写巡检的结果。事后&#xff0c;还需要有一个工作人员将草料二维码中的信息手动复制粘贴至腾讯文档中。那么能不能将我们信息填写后&#xff0c;自动就汇总至腾讯…

微客云升级会员制度

会员制度 会员制度是一种人与人或组织与组织之间进行沟通的媒介&#xff0c;它是由某个组织发起并在该组织的管理运作下&#xff0c;吸引客户自愿加入&#xff0c;目的是定期与会员联系&#xff0c;为他们提供具有较高感知价值的利益包。 Part 1 会员制度 建立长期稳定的客…

CameraMetadata 知识学习整理

一、涉及的相关代码路径 system/media/camera/src/camera_metadata.c // metadata的核心内容&#xff0c;包含metadata内存分配&#xff0c;扩容规则&#xff0c;update, find等 system/media/camera/src/camera_metadata_tag_info.c // 所有android原生tag的在内存里面sect…

GitHub 下载量过百万,阿里 P8 秘密分享的「亿级并发系统设计」

随着互联网的不断发展&#xff0c;CPU 硬件的核心数也在不断进步&#xff0c;并发编程越来越普及&#xff0c;但是并发编程并不像其他业务那样直接了当。在编写并发程序时&#xff0c;我们常常都会出现各种漏洞&#xff0c;这些问题往往都突然出现&#xff0c;然后又迅速消失&a…

龙格-库塔法(Runge-Kutta methods)

非线性的常微分方程通常是难以求出解析解的&#xff0c;只能通过多次迭代求近似的数值解。 龙格&#xff0d;库塔法&#xff08;Runge-Kutta methods&#xff09;是用于非线性常微分方程的解的重要的一类隐式或显式迭代法。简写做RK法。 对于任意的Yf(X),假设某点(Xi,Yi)的斜…

阿里云安装软件:jdk11

命令下载 1. 安装准备 检查系统jdk版本 java -version检查jdk自带安装包 rpm -qa | grep java卸载jdk yum -y remove tzdata-java.noarch如果有就卸载&#xff0c;卸载的包名通过&#xff08;rpm -qa | grep java&#xff09;获取&#xff0c;包名要全部输入 rpm -e --nodeps …

计算机网络——TCP连接管理

本文将会介绍如何建立和拆除一条TCP连接&#xff0c;TCP的连接会显著的增加人们感受到的时延&#xff08;尤其是在Web冲浪时&#xff09;。同时一些常见的网络攻击SYN洪范攻击利用了TCP连接管理的弱点。 假定运行一台主机&#xff08;客户&#xff09;上的一个进程想和另一台主…

流程编排、如此简单-通用流程编排组件JDEasyFlow介绍

作者&#xff1a;李玉亮 JDEasyFlow是企业金融研发部自研的通用流程编排技术组件&#xff0c;适用于服务编排、工作流、审批流等场景&#xff0c;该组件已开源(https://github.com/JDEasyFlow/jd-easyflow)&#xff0c;目前在部门的内部业务系统和科技输出系统中广泛应用&…

通过PreparedStatement预防SQL注入

通过PreparedStatement预防SQL注入 简介&#xff1a;本文只讲PreparedStatement预防SQL注入的写法&#xff0c;大家学会就好。 推荐学习路线&#xff1a;JDBC数据库的连接->Connection&#xff08;数据库连接对象&#xff09;->Statement->ResultSet->通过Prepare…

Spring Boot 简介及快速搭建

Spring Boot 简介及快速搭建 springboot的优点&#xff1a; –快速构建一个独立的 Spring 应用程序 &#xff1b; –嵌入的 Tomcat 、 Jetty 或者 Undertow&#xff0c;无须部署 WAR 文件&#xff1b; –提供starter POMs来简化Maven配置和减少版本冲突所带来的问题&#xff1…

【云原生 | Kubernetes 系列】--Gitops持续交付 Argo Rollouts Analysis

1. Argo Rollouts 由一个控制器和一组CRD组成,可为K8s提供高级部署功能 - blue-green - canary - canary analysis 结合外部指标系统金丝雀 - experimentation 实验性的结果 - progressive delivery 渐进式交付,精准管控外部流量策略,不用关心后端部署机制支持Ingress Contro…

深度学习 Day 20——优化器对比实验

深度学习 Day 20——优化器对比实验 文章目录深度学习 Day 20——优化器对比实验一、前言二、我的环境三、前期工作1、设置GPU2、导入数据3、配置数据集4、数据可视化三、构建模型四、训练模型五、模型评估1、Accuracy与Loss图2、评估模型六、最后我想说一、前言 &#x1f368;…

2022 谷歌出海创业加速器展示日: 见证入营企业成长收获

经历三个月的沉淀&#xff0c;迎来了展示日的大放异彩。10 家入营企业的路演分享&#xff0c;带来诸多启发 ——企业出海有什么挑战和难点&#xff1f;加入谷歌出海创业加速器&#xff0c;团队有哪些收获&#xff1f;三个月的培训和交流&#xff0c;带来了怎样的感受&#xff1…

【车间调度】遗传算法求解车间调度问题(含甘特图)【含Matlab源码 2216期】

⛄一、车间调度简介 1 车间调度定义 车间调度是指根据产品制造的合理需求分配加工车间顺序&#xff0c;从而达到合理利用产品制造资源、提高企业经济效益的目的。车间调度问题从数学上可以描述为有n个待加工的零件要在m台机器上加工。问题需要满足的条件包括每个零件的各道工序…

arduino 复习题

名词解释 中断 计算机运行过程中&#xff0c;出现某些意外情况需主机干预时&#xff0c;机器能自动停止正在运行的程序并转入处理新情况的程序&#xff0c;处理完毕后又返回原被暂停的程序继续运行 中断服务程序 用于 CPU 处理中断的程序 中断源 引起中断的原因&#xff0c;或…

柯桥成人英语培训机构哪家好,新陈代谢到底是什么?

新陈代谢到底是什么? Metabolism is a combination of biochemical processes that your body uses to convert food into energy. These metabolic processes include breathing, eating and digesting food, the delivery of nutrients to your cells through the blood, th…

软件被人后台篡改了收款码属于入侵吗?

最近很多做平台的小伙伴&#xff0c;碰到了同样的问题&#xff0c;就是软件程序后台被恶意篡改收款二维码 这个问题出现在平台主身上无疑是雪上加霜&#xff0c;第一时间找到了小蚁君&#xff0c;分析了一下当时的情况&#xff0c;先安装了小蚁的入侵检测系统&#xff0c;显示…

华为机试 - TLV解析Ⅰ

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 TLV编码是按[Tag Length Value]格式进行编码的&#xff0c;一段码流中的信元用Tag标识&#xff0c;Tag在码流中唯一不重复&#xff0c;Length表示信元Value的长度&#xff0c;Value表示信元的值。 码…