快速打通 Vue 3(二):响应式对象基础

很激动进入了 Vue 3 的学习,作为一个已经上线了三年多的框架,很多项目都开始使用 Vue 3 来编写了
这一组文章主要聚焦于 Vue 3 的新技术和新特性
如果想要学习基础的 Vue 语法可以看我专栏中的其他博客
Vue(一):Vue 入门与 Vue 指令
Vue(二):计算属性与 watch 监听器
Vue(三):Vue 生命周期与工程化开发
一篇文章快速通关 Vuex(适合小白学习)
Vue 框架前导:详解 Ajax
快速打通 Vue 3(一):基本介绍与组合式 API
上一篇 Vue3 博客:快速打通 Vue 3(一):基本介绍与组合式 API
后续还会继续更新,期待大家的关注!

04. 响应式数据 —— ref 与 reactive

关于响应式数据的官方介绍

4.1 ref 创建响应式数据

要点概览:

  1. 要使用需要加入 .value
  2. 模板会自动添加

通过上面的尝试我们知道,在 setup 中声明的数据默认 不是响应式的,我们需要手动将其声明为响应式,这里就需要 ref 函数。

语法 let xxx = ref(初始值),返回值是一个 RefImpl 的实例 对象

对象中的 value 属性 是响应式的,相当于 ref 为我们的数据上了一层包装,数据放在其中的 value 属性上,我们操控数据要通过操控其 value 属性来实现

这意味着我们只写 sum += 1 是无法实现我们想要的效果的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

模板会自动为我们添加 value 属性,模板中直接写 {{数据名}} 即可

<template><div class="person"><h2>当前数字的为 {{ sum }}</h2><button @click="addOne">+1</button></div>
</template><script setup lang="ts">
import { ref } from 'vue';let sum = ref(0);function addOne() {console.log(sum);sum.value += 1;}
</script>

我们来打印一下整个对象

4.2 reactive 创建对象类型的响应式数据

要点概览

  1. reactive 函数只能创建响应式对象数据
  2. 创建的响应式数据是深层次1
  3. 修改对象为新对象会破坏其响应式特性

响应式数据除了基本的数据类型还包括对象类型,上面的 ref 函数也可以创建对象类型的响应式数据

但是要借助 reactive 函数实现,所以我们这里先来说一下 reactive 函数

reactive 函数 只能 创建对象类型的响应式数据

语法:let xxx = reactive(源对象)

返回值是一个 Proxy 的实例对象,简称响应式对象

<template><div class="person"><h2>姓名:{{person.name}}</h2><h2>年龄:{{person.age}}</h2><button @click="changeName">changeName</button></div>
</template><script setup lang="ts">
import { reactive } from 'vue';let person = reactive({name: 'Tom',age: '18'})function changeName () {person.name = 'Jack';}
</script>


reactive 声明的对象是 深层次

<template><div class="person"><h2>数字:{{a.b.c}}</h2><button @click="change">change</button></div>
</template><script setup lang="ts">
import { reactive } from 'vue';let a = reactive({b: {c: 111}})function change () {a.b.c = 1;}
</script>

上面声明了一个嵌套对象,我们来尝试修改嵌套对象中的数据。


需要注意的是,我们不能修改对象,reactive 是将原本地址上的对象变为响应式对象。

但如果我们创建一个新的对象并且赋值给它,就不是响应式的了(用的不多但需要了解)。

官方文档:

值得注意的是,reactive() 返回的是一个原始对象的 Proxy,它和原始对象是不相等的。

只有代理对象是响应式的,更改原始对象不会触发更新。因此,使用 Vue 的响应式系统的最佳实践是 仅使用你声明对象的代理版本

  function changePerson() { person = {name: 'Jack', age: 10};}

比如我们尝试修改,界面是没有任何变化的

4.3 ref 声明对象类型的响应式数据

要点概览:

  1. ref 的响应式对象是借助 reactive 函数创建的
  2. 使用响应式对象仍然需要 .value

上面我们提到 ref 函数也可以创建对象类型的响应式数据,让我们来尝试一下:

<template><div class="person"><h2>姓名{{person.name}}</h2><h2>年龄{{person.age}}</h2><button @click="changeAge">changeAge</button></div>
</template><script setup lang="ts">
import { ref } from 'vue';let person = ref({name: 'Tom',age: 18})function changeAge() {console.log(person);  person.value.age++;}
</script>

还是经典的修改年龄的界面,我们打印出来创建的这个 person 对象

非常熟悉的内容,正是我们上面 reactive 函数创建的响应式对象

我们使用 ref 创建的对象仍然需要加上 .value

4.4 ref 与 reactive

要点概述:

  1. 推荐使用 ref 作为主要 API
  2. reactive 在某些特定情况可以使用

根据官方文档,reactive 有如下的缺点:

  1. 有限的值类型:它只能用于对象类型 (对象、数组和如 MapSet 这样的集合类型)。它不能持有如 stringnumberboolean 这样的原始类型。

  2. 不能替换整个对象:由于 Vue 的响应式跟踪是通过属性访问实现的,因此我们必须始终保持对响应式对象的相同引用。这意味着我们不能轻易地“替换”响应式对象,因为这样的话与第一个引用的响应性连接将丢失:

    js

  3. 对解构操作不友好:当我们将响应式对象的原始类型属性解构为本地变量时,或者将该属性传递给函数时,我们将丢失响应性连接:

所以一般推荐使用 ref 作为主要的 API

但是当我们的对象深度很深的时候,例如表单对象,我们可能要写无数个 value 比较影响代码的美观,这时候在不影响的情况下是可以使用 reactive 的。


补充:关于解构

在Vue中,解构操作通常用于从对象或数组中提取数据,并将其赋值给变量,以便在Vue组件中使用。Vue支持解构赋值语法,让开发者可以更方便地操作组件中的数据。

  1. 对象解构

在Vue组件中,可以使用对象解构从组件的数据对象中提取数据。例如:

javascriptCopy codeexport default {data() {return {person: {name: 'Alice',age: 30,city: 'New York'}};},mounted() {const { name, age, city } = this.person;console.log(name); // 输出:Aliceconsole.log(age); // 输出:30console.log(city); // 输出:New York}
};
  1. 数组解构

数组解构可以用于解构数组中的数据。例如:

javascriptCopy codeexport default {data() {return {numbers: [1, 2, 3, 4, 5]};},mounted() {const [first, second, third] = this.numbers;console.log(first); // 输出:1console.log(second); // 输出:2console.log(third); // 输出:3}
};
  1. 在模板中使用解构

还可以在Vue的模板中使用对象解构,例如:

htmlCopy code<template><div><p>{{ person.name }}</p><p>{{ person.age }}</p><p>{{ person.city }}</p></div>
</template><script>
export default {data() {return {person: {name: 'Alice',age: 30,city: 'New York'}};}
};
</script>

在模板中,可以直接通过{{ 变量名 }}的方式使用解构后的数据。


4.5 toRefs 与 toRef

要点概览:

  1. 响应式对象的属性转换为 ref 对象
  2. toRefs 批量转化呢,toRef 实现单个转换
  3. 需要加 .value 操控

我们来尝试将对象解构,将其中的属性交给模板 <template> 去显示

<template><div class="person"><h2>姓名{{name}}</h2><h2>年龄{{age}}</h2><button @click="changeAge">changeAge</button></div>
</template><script setup lang="ts">
import { reactive } from 'vue';let person = reactive({name: 'Tom',age: 18})let {name, age} = person;function changeAge() {console.log(person);  age.value++;}
</script>

那这个属性是响应式的吗?

很明显不是,无法将改变的属性显示在网页上,那应该怎么将结构出来的属性变为响应式的呢?

就需要这里讲的 toRefs

语法 let {name, age} = toRefs(person);

这样数据就变为响应式的了

toReftoRefs 作用相同,但可以指定需要将哪个属性变为响应式的

语法:let name = toRef(person, 'name')

这样就可以将响应式对象中的属性也设置为响应式的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

转换出来的是 ref 对象,很明显操控需要加 .value


补充——插件自动填充 .value

我们有时候会忘记添加 .value 或者会加错,这是和可以借助插件来自动为我们添加 .value

这里用到的插件是我们之前提到的 Vue Language Features (Volar)

打开设置界面 -> 拓展 -> Volar -> 打开 Auto Insert: Dot Value

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


  1. 深层次即对象内嵌套的对象也会被声明为响应式的对象。 ↩︎

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

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

相关文章

2023年.AI域名销售额达550万美元 2024还要继续涨

根据域名投资专家Elliot Silver的最新文章&#xff0c;2023年公开报道的.AI域名销售额已经达到了550万美元&#xff0c;而2022年和2021年分别为90万美元和120万美元。 Silver观察到过去几年.AI域名销售额呈现逐年增长的趋势&#xff0c;尤其是2023年的销售额相较前两年有了显著…

【计算机毕业设计】SSM二手交易网站

项目介绍 该项目分为前后台&#xff0c;前台普通用户角色&#xff0c;后台管理员角色。 管理员主要功能如下&#xff1a; 登陆,商品分类管理,商品管理,商品订单管理,用户管理等功能。 用户角色主要功能如下&#xff1a; 包含以下功能&#xff1a;查看所有商品,用户登陆注册…

骨传导耳机不踩坑推荐指南,南卡/韶音/墨觉实测告诉你答案!

你知道怎么选骨传导耳机吗&#xff1f;作为一个音响测评博主&#xff0c;我用过不下10款骨传导耳机&#xff0c;有的是普通款式&#xff0c;有的是专业运动款式&#xff0c;甚至为了维修也拆过一些骨传导耳机。可以说&#xff0c;骨传导耳机的选购绝不是表面看起来那么简单&…

单位转换工具类

单位转换工具类 1. 工具类转换- 定义装换枚举转换类型- 创建转换工具类,1. 通过反射去除字段,2.对照传入map标记的字段需要转换的类型转换3. 重新赋值 2. 注解转换- 定义注解- 解析注解 1. 工具类转换 - 定义装换枚举转换类型 public enum UnitConvertType {/*** 精确度*/ACC…

break,continue跳出指定循环小案例

某一天&#xff0c;你犯了一个错误&#xff0c;你老婆罚你做5天家务&#xff0c;每天去洗碗&#xff0c;洗碗到第三天心软了&#xff0c;原谅你了只有第三太不用洗碗 public class BreakDemo {public static void main(String[] args) {//某一天&#xff0c;你犯了一个错误&am…

视频监控可视化云平台EasyCVR智能视频技术优势分析

TSINGSEE青犀视频安防视频管理系统EasyCVR视频智能融合共享平台&#xff0c;是一个支持Windows/Linux(CentOS ubuntu)/国产化系统的视频管理平台。平台可以支持多协议接入&#xff0c;通过视频应用引擎将多种格式的视频数据转换为统一的视频流数据&#xff0c;支持无插件H5直播…

现在的人们如何看待数据隐私?

PrimiHub一款由密码学专家团队打造的开源隐私计算平台&#xff0c;专注于分享数据安全、密码学、联邦学习、同态加密等隐私计算领域的技术和内容。 在当前时代&#xff0c;每一次点击、触摸或按键都留下了数字痕迹。但是我们对自己的个人数据几乎没有控制的权限&#xff0c;这让…

主流桌面浏览器Chrome,FireFox和Edge等如何禁用弹出式窗口阻止程序,这里有详细步骤

为什么你想知道如何禁用浏览器中的弹出式窗口阻止程序?毕竟,弹出式窗口是网络的祸害:显示烦人的广告、虚假的安全消息和其他刺激,会分散你的浏览注意力,甚至可能包含恶意代码。 所有主要的桌面浏览器现在都默认阻止弹出式窗口,那么你到底为什么要取消阻止这些害虫呢?事…

c++的三大特性之关于继承

目录 继承的概念及定义 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 继承与友元&#xff0c;静态成员 继承的概念及定义 概念&#xff1a; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类…

gitee创建仓库

描述 本文章记录了怎么在gitee上创建项目&#xff0c;以及使用vscode提代码到远程呢个仓库&#xff0c;如何创建一个新分支&#xff0c;并将新分支提交到远程仓库。 1、创建远程仓库 在创建远程仓库之前要先进行ssh密钥的设置 &#xff08;1&#xff09;打开黑窗口&#xff…

iptables 防火墙(二)

目录 1. SNAT 策略及应用 1.1 SNAT策略概述 1. 只开启路由转发&#xff0c;未设置地址转换的情况 2. 开启路由转发&#xff0c;并设置SNAT转换的情况 1.2 SNAT策略的应用 1. 2.1 共享固定IP上网 &#xff08;1&#xff09;打开网关的路由转发 &#xff08;2&#xff09;…

[C#]C# OpenVINO部署yolov8目标检测模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8 抛弃了前几代模型的 Anchor-Base。 YOLO 是一种基于图像全局信息进行预测的目标检测系统。自 2015 年 Joseph Redmon、Ali Farhadi 等人提出初代模型以来&#xff0c;领域内的研究者们…

大数据Doris(四十九):Doris数据导出介绍

文章目录 Doris数据导出介绍 一、​​​​​​​使用示例

静态网页设计——个人简介网站

前言 使用经典前端三件套HTMLCSSJavascript编写了一个关于个人简介的静态网页&#xff0c;可以根据自己的需要&#xff0c;十分简单的进行修改。 首页 首页由上方的菜单栏以及菜单栏下面的轮播图组成&#xff0c;再往下走&#xff0c;是关于自己的兴趣爱好的部分&#xff0c…

django学习:页面渲染与请求和响应

1.请求过程 2.页面渲染 在app中新建一个目录&#xff08;Directory&#xff09;&#xff0c;文件名命名为templates。该文件名命名是固定的&#xff0c;不可命名出错&#xff0c;如若后续步骤出错&#xff0c;该目录文件名是一个检查的重点项目。在该目录下新建一个html文件&a…

深度学习:大规模模型分布式训练框架DeepSpeed

深度学习&#xff1a;大规模模型分布式训练框架DeepSpeed DeepSpeed简介DeepSpeed核心特点DeepSpeed如何工作&#xff1f;DeepSpeed如何使用&#xff1f;参考文献 DeepSpeed简介 随着机器学习模型变得越来越复杂和庞大&#xff0c;训练这些模型所需的计算资源也在不断增加。特别…

如何查找iPhone中所有的应用程序

​ ​ Apple 的 App Store 共有约 200 万个适用于 iPhone 和 iPad 的应用程序。如果您像我们一样&#xff0c;您的 iOS 或 iPadOS 设备上可能有数十个应用程序&#xff0c;但没有机会将它们全部整理好。您很容易忘记主屏幕上应用程序图标的位置。 幸运的是&#xff0c;iPhone…

向日葵远程工具的使用Mysql5.7的安装与配置

目录 一、向日葵远程安装与使用 二、Mysql 5.7 安装与配置 2.1 安装 2.2 Navicat Premium 12 测试连接 本机测试连接 外部访问MySQL测试连接 三、思维导图 一、向日葵远程安装与使用 简介&#xff1a; 向日葵远程控制是一款用于对远程PC进行管理和服务的软件,拥有5秒快速…

智能型参数可设置比例阀放大器

智能型参数可设置比例阀放大器是一种电液控制技术&#xff0c;它可以驱动不带电气位移反馈的各种比例溢流阀、比例流量阀、比例减压阀、比例方向阀和比例插装阀等。 这种放大器的特点是可以将输入的模拟量指令信号进行处理运算&#xff0c;通过比例电磁铁将驱动电流线性转换为作…

网页爬虫对于网络安全有哪些影响?

在当今信息爆炸的时代&#xff0c;网络已经成为人们获取信息、交流思想和开展业务的重要平台。然而&#xff0c;随着网络的普及和技术的不断发展&#xff0c;网络安全问题也日益凸显&#xff0c;其中网页爬虫对网络安全的影响不容忽视。本文将就网页爬虫对网络安全的影响进行深…