为什么推荐使用ref而不是reactive

为什么推荐使用ref而不是reactive

  • 局限性问题: reactive本身存在一些局限性,可能会在开发过程中引发一些问题。这需要额外的注意力和处理,否则可能对开发造成麻烦。
  • 数据类型限制: reactive声明的数据类型仅限于对象,而ref则更加灵活,可以容纳任何数据类型。这使得ref更适合一般的响应式状态的声明。
  • 官方推荐: 官方文档强烈建议使用ref()作为声明响应式状态的首选。这是因为ref更简单、更直观,同时避免了reactive可能引发的一些问题。

使用方法上的对比

image.png

image.png

reactive的局限性

1. 只能声明引用数据类型(对象)ref() 可以声明任意类型

let obj = reactive({  
  name: '小明',  
  age: 18  
})

// 对象  
const state = ref({})  
// 数组  
const state2 = ref([])

2. reactive 使用不当会失去响应

  • 赋值给 reactive 一个整个对象或 reactive 对象
let state = reactive({ count: 0 })  
// 这个赋值将导致 state 失去响应  
state = { count: 1 }
// 并不会触发修改 DOM ,说明失去响应了  
state = reactive({ count: 11 });

解决方法

  1. 不要直接整个对象替换,一个个属性赋值
  2. 使用 Object.assign
  3. 使用 ref 定义对象
  4. 使用数组的 push 方法
let state = reactive({ count: 0 })  
// state = { count: 1 }  ×
state.count = 1   
state = Object.assign(state, { count: 1 }) 

let state = ref({ count: 0 })  
state.value = { count: 1 } 
  • reactive 对象解构会失去响应,ref定义对象解构也会失去响应式
let state = reactive({ count: 0 })  
// 普通解构,count 和 state.count 失去了响应性连接  
let { count } = state  
count++ // state.count 值依旧是 0

解决方案:

  1. 使用 toRefs 解构,解构后的属性是 ref 的响应式变量
  2. ref定义对象解构也需要toRefs
const state = reactive({ count: 0 })  
// 使用 toRefs 解构,后的属性为 ref 的响应式变量  
let { count } = toRefs(state)  
count.value++ // state.count 值改变为 1
  • 将 reactive 对象的属性赋值给变量(断开连接/深拷贝) ,对该变量的赋值不会影响原来对象的属性值。
let state = reactive({ count: 0 })  
// 赋值给 n,n 和 state.count 不再共享响应性连接  
let n = state.count  
// 不影响原始的 state  
n++  
console.log(state.count) // 0

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

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

相关文章

RK3568 android11 调试陀螺仪模块 MPU6500

一,MPU6500功能介绍 1.简介 MPU6500是一款由TDK生产的运动/惯性传感器,属于惯性测量设备(IMU)的一种。MPU6500集成了3轴加速度计、3轴陀螺仪和一个板载数字运动处理器(DMP),能够提供6轴的运动…

【毛毛讲书】【端粒:年轻、健康、长寿的新科学】是什么决定了我们的寿命?

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容&#xff…

es获取某个索引下字段的分词结果

//查看某个索引下字段的分词结果 GET /haha/_analyze { "field": "title", "text":"哈哈。" }

云尚办公-0.1.0

二、用户管理接口 1. 建表 角色与用户是多对多的关系,所以除了角色表和用户表外,还需要第三张表表示这两者间的对应关系。关系表中的用户id和角色id分别以对应表中的id作为外键。 CREATE TABLE sys_user (id BIGINT(20) NOT NULL AUTO_INCREMENT COM…

Vue3切换路由白屏刷新后才显示页面内容

1.首先检查页面路由以及页面路径配置是否配置错误。 在router-view 中给路由添加key标识。 !!注意:有使用layout封装布局的,是在layout下的主页面中的 router-view 添加标识,不是在src根目录下main.vue中修改&#xf…

[云原生] K8s之pod进阶

一、pod的状态说明 (1)Pod 一直处于Pending状态 Pending状态意味着Pod的YAML文件已经提交给Kubernetes,API对象已经被创建并保存在Etcd当中。但是,这个Pod里有些容器因为某种原因而不能被顺利创建。比如,调度不成功(…

【rust】11、所有权

文章目录 一、背景二、Stack 和 Heap2.1 Stack2.2 Heap2.3 性能区别2.4 所有权和堆栈 三、所有权原则3.1 变量作用域3.2 String 类型示例 四、变量绑定背后的数据交互4.1 所有权转移4.1.1 基本类型: 拷贝, 不转移所有权4.1.2 分配在 Heap 的类型: 转移所有权 4.2 Clone(深拷贝)…

linux系统Jenkins的安装

Jenkins安装 安装上传安装包解压包首次登录要去服务器查看密码,更改密码选择需要安装的插件设置Admin用户和密码安装完成 安装 上传安装包 上传 jdk17 tomcat jenkins.war的安装包 . 上传 tomcat安装包解压包 解压jdk tar xf jdk-11.0.18_linux-x64_bin.tar.gz解…

甲级!亚信安全再次荣膺CNCERT国家级网络安全应急服务支撑单位称号

再获认可 近日,国家计算机网络应急技术处理协调中心(CNCERT)正式公布第十届CNCERT网络安全应急服务支撑单位遴选结果,亚信安全凭借创新技术实力,以及重大突发网络安全事件的应对能力,再次荣获CNCERT甲级网…

AI新秀Mistral:“Open AI“ 新时代

最近互联网出现不少类似“下一代openai”、“GPT-4最强竞品”、“法国AI独角兽”、“欧洲的OpenAI”、“微软新宠儿”.... 的文章,都会附带一张图片,就是下面这张: 那么到底发生了什么,出来个什么东西呢?就是本文的主…

深入英伟达盈利中心,反思一个正被“忽视”的Web3.0赛道

出品|欧科云链研究院 作者|Hedy Bi 最近,英伟达(Nvidia)发布了2023年第四季度财报,超出了华尔街预期,并在美国股市的延时交易中表现出色。欧科云链研究院通过分析英伟达的财报,我们…

前端架构: 脚手架包管理工具之lerna的全流程开发教程

Lerna 1 )文档 Lerna 文档 https://www.npmjs.com/package/lernahttps://lerna.js.org [请直达这个链接] 使用 Lerna 帮助我们做包管理,并不复杂,中间常用的命令并不是很多这里是命令直达:https://lerna.js.org/docs/api-referen…

Unity 佳能SDK 及数据获取

1. 填写信息跟官方申请SDK,大概1-2个工作日会邮件回复你 佳能(中国)- 佳定制(佳能影像产品),SDK,EDSDK,CCAPI,软件开发包下载 2. 将SDK这两个文件放到 Unity Plugins文件夹 3. 把CameraControl 下面只要是绿色的 .cs 文件都复制到Unity 中

新闻网站封锁AI爬虫 AI与新闻媒体博弈继续

随着ChatGPT等新兴AI模型的兴起,它们所依赖的网络爬虫正面临来自全球主流新闻网站的大规模封锁。Richard Fletcher博士团队对十个国家主流新闻网站的统计发现,到2023年底,48%的网站屏蔽了OpenAI的爬虫,24%屏蔽了Google的爬虫。那么…

浅析前端的堆栈原理以及深浅拷贝原理

浅析前端的堆栈原理以及深浅拷贝原理 首先来看一个案例 const obj {name:hzw,age:18 } let objName2 obj objName2.age 12 console.log(obj,objName2) // {name: hzw, age: 12} {name: hzw, age: 12}这里是不是很奇怪,为什么,为什么我改变objName2的…

type may not be empty [type-empty]

Git提交失败原因分析 原因是使用了规范commit信息的工具,你的提交信息不符合规范,所以被拒绝了 commit规范工具 commitlinthusky 我这个项目使用husky,提交规范比较严格。 解决方式一: 修改提交信息, 使其符合规范…

代码里没有报错,但是java编译报错找不到符号

问题分析: 最近在尝试maven编译,所以不小心点了mvn clean的命令,将之前编译的工程清除了,导致后边再编译项目上的时候就报了一堆错误。代码没问题,但编译不通过,报找不到符号的错误,搜了下这样解…

Windows安装VNC连接工具并结合cpolar实现远程内网Ubuntu系统桌面

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

Linux测试端口开放

Linux测试端口开放 Linux测试端口是否开放有多种命令,如nc、telnet、ssh、curl、wget nc nc(netcat)可用于创建 TCP 或 UDP 连接、扫描端口、传输文件等 扫描指定端口: nc -zv ip port-z 使用0输入/输出模式,只在…

【C#】SixLabors.ImageSharp和System.Drawing两者知多少

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。…