Vue 3 第五章:reactive全家桶

news/2024/4/20 19:33:24/文章来源:https://blog.csdn.net/to_the_Future/article/details/129259955

文章目录

  • 1. reactive
    • 1.1. `reactive`函数创建一个响应式对象
    • 1.2. 修改`reactive`创建的响应式对象的属性
  • 2. readOnly
    • 2.1. 使用 `readonly` 函数创建一个只读的响应式对象
    • 2.2. 如何修改嵌套在只读响应式对象中的对象?
  • 3. shallowReactive
    • 3.1. 使用 `shallowReactive` 函数创建一个浅层响应式对象
    • 3.2. 如何修改嵌套在浅层响应式对象中的对象?

1. reactive

  • 实现引用类型数据的响应式,如数组、对象
  • 上一章说到的ref去创建引用类型的响应式,其实内部也是调用了reactive
  • reactive创建的响应式对象,调用时不用.value

在Vue3中,reactive函数是用于创建响应式对象的函数。它接收一个普通对象作为参数,返回一个代理对象。这个代理对象可以拦截对象的getset操作,并在其中实现响应式的逻辑。当我们读取代理对象的属性时,会触发依赖收集;当我们修改代理对象的属性时,会触发相应的依赖更新。在调用reactive函数时,Vue3会使用Proxy对象对传入的对象进行代理,从而实现响应式的特性。

1.1. reactive函数创建一个响应式对象

import { reactive } from 'vue'const state = reactive({count: 0,name: 'Tom'
})console.log(state.count) // 输出 0state.count++console.log(state.count) // 输出 1

在这个例子中,我们使用reactive函数创建了一个响应式对象state,它包含两个属性countname。我们可以直接读取和修改state的属性,不需要使用.value。当我们读取或修改state的属性时,会触发相应的依赖更新。

1.2. 修改reactive创建的响应式对象的属性

import { reactive } from 'vue'const state = reactive({user: {name: 'Tom',age: 18}
})console.log(state.user.name) // 输出 Tomstate.user.name = 'Jerry'console.log(state.user.name) // 输出 Jerry

在这个例子中,我们修改了state对象中嵌套的user对象的name属性。这个修改会触发相应的依赖更新,从而实现了响应式的特性。

2. readOnly

在 Vue 3 中,可以使用 readonly 函数创建一个只读的响应式对象。它接收一个普通对象作为参数,返回一个只读的代理对象。这个代理对象只能读取属性的值,不能修改属性的值。当我们读取代理对象的属性时,会触发依赖收集;当我们尝试修改代理对象的属性时,会输出警告信息,不会触发相应的依赖更新。在调用 readonly 函数时,Vue 3 会使用 Proxy 对象对传入的对象进行代理,从而实现只读的响应式特性。

2.1. 使用 readonly 函数创建一个只读的响应式对象

import { readonly, reactive } from 'vue'const state = readonly(reactive({count: 0,name: 'Tom'
}))console.log(state.count) // 输出 0state.count++ // 输出警告信息,不会触发依赖更新console.log(state.count) // 输出 0

注意:使用 readonly 函数创建的只读响应式对象是深层只读的。也就是说,当我们尝试修改嵌套在只读响应式对象中的对象时,会输出警告信息,不会触发相应的依赖更新。

2.2. 如何修改嵌套在只读响应式对象中的对象?

  • 使用readOnly函数创建的只读对象,内部的属性无法修改
import { readonly, reactive } from 'vue'const state = readonly(reactive({user: {name: 'Tom',age: 18}
}))console.log(state.user.name) // 输出 Tomstate.user.name = 'Jerry' // 输出警告信息,不会触发依赖更新console.log(state.user.name) // 输出 Tom

在这个例子中,我们尝试修改只读响应式对象 state 中嵌套的 user 对象的 name 属性。这个修改会输出警告信息,不会触发相应的依赖更新,从而实现了只读响应式的特性。在实际开发中,readonly 函数是非常有用的一个函数,可以帮助我们创建只读的响应式数据。

3. shallowReactive

  • 创建浅层响应式对象
  • 修改内部属性时,只改变值不更新视图

在 Vue 3 中,可以使用 shallowReactive 函数创建一个浅层响应式对象。它接收一个普通对象作为参数,返回一个浅层响应式代理对象。这个代理对象只能处理对象的一级属性,不能处理嵌套在对象中的属性的响应式更新。当我们读取代理对象的属性时,会触发依赖收集;当我们修改代理对象的属性时,会触发相应的依赖更新。在调用 shallowReactive 函数时,Vue 3 会使用 Proxy 对象对传入的对象进行代理,从而实现浅层响应式特性。

3.1. 使用 shallowReactive 函数创建一个浅层响应式对象

import { shallowReactive } from 'vue'const state = shallowReactive({user: {name: 'Tom',age: 18}
})console.log(state.user.name) // 输出 Tomstate.user.name = 'Jerry'console.log(state.user.name) // 输出 Jerrystate.user = {name: 'Lucy',age: 20
}console.log(state.user.name) // 输出 Lucystate.user.name = 'Lily'console.log(state.user.name) // 输出 Lily

在这个例子中,我们使用 shallowReactive 函数创建了一个浅层响应式对象 state,包含一个属性 user,它是一个普通对象。当我们修改 stateuser 属性时,会触发相应的依赖更新;当我们修改 user 对象的属性时,不会触发相应的依赖更新。

3.2. 如何修改嵌套在浅层响应式对象中的对象?

  • 可以直接修改,但是只更新值,不更新视图
import { shallowReactive } from 'vue'const state = shallowReactive({user: {profile: {name: 'Tom',age: 18}}
})console.log(state.user.profile.name) // 输出 Tomstate.user.profile.name = 'Jerry'console.log(state.user.profile.name) // 输出 Jerry

在这个例子中,我们尝试修改浅层响应式对象 state 中嵌套的 user 对象的 profile 属性中的 name 属性。这个修改不会触发相应的依赖更新,从而实现了浅层响应式的特性。

总结:这篇文章介绍了Vue3中用于创建响应式对象的三个函数:reactivereadonlyshallowReactivereactive函数用于创建深层响应式对象,readonly函数用于创建深层只读响应式对象,shallowReactive函数用于创建浅层响应式对象。这些函数可以帮助我们快速创建响应式数据,实现数据的自动更新。

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

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

相关文章

C++ string类(二)及深浅拷贝

一、string类方法使用举例1.迭代器迭代器本质:指针(理解)迭代器:正向迭代器: begin() | end() 反向迭代器: rbegin() | rend()2.find使用//找到s中某个字符 void TestString3() {string s("AAADEFNUIE…

携程面经1

面经 HDFS读写流程 1.读流程 客户端向NameNode发起读请求(如果存在)NameNode返回一批block地址客户端与第一个block的拓扑距离最近的节点建立连接以packet(64kb)的单位读取数据块。一个block读取完成后客户端会断开与该DataNod…

5个开源的Java项目快速开发脚手架

概览 : GunspigRuoYiJeecg-bootiBase4J 一、Guns 推荐指数 :⭐⭐⭐⭐⭐ 简介 采用主流框架 : 基于 Spring Boot2.0版本开发,并且支持 Spring Cloud Alibaba 微服务。功能齐全 :包含系统管理,代码生成&a…

这么强才给我28k,我头都不回,转身拿下40k~

时间真的过得很快,眨眼就从校园刚出来的帅气小伙变成了油腻大叔,给各位刚入道的测试朋友一点小建议,希望你们直通罗马吧! 如何选择自己合适的方向 关于选择测试管理: 第一,你一定不会是一个喜欢技术&…

Vue的组件(注册、局部、组件复用、props、emit、生命周期)全解

文章目录前言知识点组件注册局部组件组件复用组件间通信props 类型检测子父组件通信之 emit动态组件生命周期函数前言 Vue 支持模块化和组件化开发,可以将整个页面进行模块化分割,低耦合高内聚,使得代码可以在各个地方使用。 知识点 组件注册…

accent-color一行代码,让你的表单组件变好看

不做切图仔,从关注本专栏开始 文章目录 不做切图仔,从关注本专栏开始前言兼容性语法继承性智能前言 在之前的网站开发中,我们是很难去更改的你某些控件的颜色。我们可能要使用各种技巧来自定义我们的控件。好消息是,今天如果我们想要去改变控件的颜色,css为我们提供了一些…

心系区域发展,高德用一体化出行服务平台“聚”力区域未来

交通,是城市的血脉。通过对人、资源、产业的连接,交通建设往往是城市和区域经济发展的前提。不过,在度过了“要想富,先修路”的初级建设阶段后,交通产业内部也出现了挑战,诸如城市秩序、发展成本、用户使用…

【目标检测】Dynamic Head Unifying Object Detection Heads with Attentions

文章目录一、背景二、方法2.1 scale-aware attention2.2 spatial-aware attention2.3 task-aware attention2.4 总体过程2.5 和现有的检测器适配2.6 和其他注意力机制的关联三、效果四、代码论文链接: https://arxiv.org/pdf/2106.08322.pdf代码链接:htt…

Windows 安装RocketMQ

文章目录一、RocketMQ是什么?二、准备工作1.环境要求2.下载与解压3.启动MQ4. 测试是否成功启动三、安装管理端1. 代码下载2. 修改配置文件3. 启动MQ客户端jar包四、rocketMQ代码的使用入门五、问题记录1. 启动mqbroker.cmd没有反应2.消费者重复消费消息一、RocketMQ…

NCRE计算机等级考试Python真题(六)

第六套试题1、算法的时间复杂度是指A.执行算法程序所需要的时间B.算法程序的长度C.算法程序中的指令条数D.算法执行过程中所需要的基本运算次数正确答案: D2、下列关于栈的叙述中正确的是A.在栈中只能插入数据B.在栈中只能删除数据C.栈是先进先出的线性表D.栈是先进…

【Django功能开发】如何正确使用定时任务(启动、停止)

系列文章目录 【Django开发入门】ORM的增删改查和批量操作 【Django功能开发】编写自定义manage命令 文章目录系列文章目录前言一、django定时任务二、django-apscheduler基本使用1.安装django-apscheduler2.配置settings.py的INSTALLED_APPS3.通过命令生成定时记录表3.如何创…

嵌入式 linux 系统开发网络的设置

目录 一、前言 二、linux网络静态地址设置 前言 为什么要对linux系统下的ubuntu进行网络设置呢? 因为我们在嵌入式开发中,我们要保证windows系统、linux系统、开发板的ip要处于同一个网段,而默认ubuntu下的linux系统的ip是动态分配的&#…

如何彻底删除SQL Server 2008中的登录账号

我个人遇到的最烦人的事情之一是 SQL Server Management Studio中“服务器名称和登录名”对话框的下拉列表。 以下是我想从 SSMS 连接屏幕中删除某些内容的两种情况: 键入的服务器名称不正确 服务器将来不需要。当我看到服务器的名称,它已经存在了很长一段时间,我知道我不会…

图像处理实战--Opencv实现人像迁移

前言: Hello大家好,我是Dream。 今天来学习一下如何使用Opencv实现人像迁移,欢迎大家一起参与探讨交流~ 本文目录:一、实验要求二、实验环境三、实验原理及操作1.照片准备2.图像增强3.实现美颜功能4.背景虚化5.图像二值化处理6.人…

Day21【元宇宙的实践构想07】—— 元宇宙与人工智能

💃🏼 本人简介:男 👶🏼 年龄:18 🤞 作者:那就叫我亮亮叭 📕 专栏:元宇宙 0.0 写在前面 “元宇宙”在2021年成为时髦的概念。元宇宙到底是什么?元宇…

【论文笔记】Decoupling Representation and Classifier for Long-Tailed Recognition

这一篇其实并不是提出什么新的东西,而且是做了点类似综述的技术调用实验。省流:T-normalization最好用 摘要 现状:Existing solutions usually involve class-balancing strategies, e.g. by loss re-weighting, data re-sampling, or tran…

高燃!GitHub上标星75k+超牛的Java面试突击版

前言不论是校招还是社招都避免不了各种面试。笔试,如何去准备这些东西就显得格外重要。不论是笔试还是面试都是有章可循的,我这个有章可循‘说的意思只是说应对技术面试是可以提前准备。运筹帷幄之后,决胜千里之外!不打毫无准备的仗,我觉得大…

扒系统CR8记录

目录 终极改造目标 过程记录 参考 为了将一套在线安装的系统,在不了解其架构、各模块细节的基础上,进行扒弄清楚,作以下记录。 终极改造目标 最终的目标,就是只通过CreMedia8_20230207.tar.gz解压 install 就把业务包安装了&…

安装VMWare虚拟机之后,发现网络贼卡,打开网页很慢

事情描述: 最近忙一个项目,需要到虚拟机中部署环境,安装完之后,就开整自己的项目了。 可以过几天,发现本地网络贼卡,打开各网页慢的一批,一开始还以为是路由器的问题,反复折腾之后排…

[12]云计算概念、技术与架构Thomas Erl-第5章 云使能技术

目录 第五章 云使能技术 5.1宽带网络和Internet架构 5.1.1Internet服务提供者(ISP) 5.1.2无连接分组(数据报网络) 5.1.3基于路由器的互联 5.1.4技术和商业考量 总结 5.2数据中心技术 5.2.1虚拟化 5.2.2标准化与模块化 …