快速打通 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.mzph.cn/news/593542.shtml

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

相关文章

Flink-【时间语义、窗口、水位线】

1. 时间语义 1.1 事件时间&#xff1a;数据产生的事件&#xff08;机器时间&#xff09;&#xff1b; 1.2 处理时间&#xff1a;数据处理的时间&#xff08;系统时间&#xff09;。 &#x1f330;&#xff1a;可乐 可乐的生产日期 事件时间&#xff08;可乐产生的时间&…

算法导论复习——CHP24 单源最短路

单源最短路径问题&#xff1a; 给定一个图G (V,E)&#xff0c;找出从给定的源点s∈V到其它每个结点v∈V的最短路径。 这样最短路径具有最优子结构性&#xff1a;两个结点之间的最短路径的任何子路径都是最短的。 基本概念 负权边&#xff1a;权重为负值的边称为负权重的边。 如…

Vue3+TS+ElementPlus的安装和使用教程【详细讲解】

前言 本文简单的介绍一下vue3框架的搭建和有关vue3技术栈的使用。通过本文学习我们可以自己独立搭建一个简单项目和vue3的实战。 随着前端的日月更新&#xff0c;技术的不断迭代提高&#xff0c;如今新vue项目首选用vue3 typescript vite pinia……模式。以前我们通常使用…

webpack知识点总结(高级应用篇)

除开公共基础配置之外&#xff0c;我们意识到两点: 1. 开发环境(modedevelopment),追求强大的开发功能和效率&#xff0c;配置各种方便开 发的功能;2. 生产环境(modeproduction),追求更小更轻量的bundle(即打包产物); 而所谓高级应用&#xff0c;实际上就是进行 Webpack 优化…

计算机组成原理-期末复习

目录 第一章——计算机系统概述 一、数字计算机的主要组成结构 二、指令的形式 三、控制器的基本任务 四、指令流和数据流 五、适配器与输入/输出设备 七、计算机的系统软件 八、C 语言的转换层次图 九、计算机系统的层次结构图 第二章——运算方法和运算器 一、 数据格式…

javascript之跳转页面的几种方法?

文章目录 前言代码演示及解释使用location.href属性使用location.assign()方法使用location.replace()方法使用window.open()方法使用document.URL方法 总结 前言 本章学习的是JavaScript中的跳转页面的几种方法 代码演示及解释 使用location.href属性 可以直接将一个新的URL…

企业如何做好客户管理?有哪些关键因素?

客户管理是建立和维护客户关系的重要组成部分&#xff0c;对于企业的发展至关重要。下面就让我们来看看在做好客户管理时有哪些关键因素吧。 第一个关键因素是提供优质的客户服务。无论是线上还是线下&#xff0c;当客户需要帮助时&#xff0c;他们希望能够得到有效且及时的支持…

sqlserver根据分组的内容分别查询出匹配的一条信息

需求场景&#xff1a; 我写了条分组语句&#xff0c; select name from car_machine_command group by name 然后该表有很多条相关的数据&#xff0c;我只想拿各个分组的一条数据看看即可 解决&#xff1a;可以使用窗口函数&#xff08;Window Function&#xff09;和 ROW_NU…

Dora-rs 机器人框架学习教程(1)—— Dora-rs安装

1、dora简介 Dora-rs[1] 是一个基于 Rust 实现的化机器人框架&#xff0c;其具有极高的实时性能。Dora-rs使用Rust语言做数据流的传输和调度管理&#xff0c;可以大大减少了数据的重复拷贝和传输。它提供了Rust语言和Python语言之间的无缝集成&#xff0c;减少了跨语言的性能代…

阿里云服务器Valheim端口2456、2457和2458放行设置

使用阿里云服务器搭建Valheim英灵神殿需要开启2456-2458端口&#xff0c;阿里云服务器默认只开放了22核3389端口&#xff0c;开通2456端口是在安全组中配置的&#xff0c;阿里云服务器网aliyunfuwuqi.com来详细说下阿里云服务器安全组开通端口流程&#xff1a; 阿里云服务器安…

中国供应链,出海大时代

尽量优化、打通跨境电商每一个参与方的物流、商流、信息流、资金流是电商供应链出海的解题之法。这个过程中数智化便是打通这些节点的钥匙。 作者|斗斗 编辑|皮爷 出品|产业家 “速卖通加持&#xff0c;阿里国际零售商业收入同比上涨73%”“拼多多发布Q3财报同比增长94%…

基于Java SSM框架实现中国古诗词学习平台项目【项目源码】

基于java的SSM框架实现中国古诗词学习平台系统演示 JSP技术介绍 JSP技术本身是一种脚本语言&#xff0c;但它的功能是十分强大的&#xff0c;因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时&#xff0c;它可以使显示逻辑和内容分开&#xff0c;这就极大的方便了用…

Sam Altman的一天被曝光!每天15小时禁食、服用小剂量安眠药,尽可能避免开会

Sam Altman在经历了几天混乱的管理重组后&#xff0c;重新回到了OpenAI的CEO位置。在日常生活中&#xff0c;奥特曼与许多科技行业高管一样&#xff0c;痴迷于延长自己的寿命。 据报道&#xff0c;他还为应对末日场景&#xff08;致命合成病毒的释放、核战争和人工智能攻击等&…

P59 生成式对抗网络GAN-理论介绍 Theory behind GAN

Object Normal Distribution 的数据 经过 Generator 后生成分布更加复杂的PG. 真实数据的分布为 Pdata , 希望 PG和Pdata 越近越好 LOSS 是 两者之间的分布距离 问题: 如何计算 divergence? Sampling is goog enough Discriminator 希望V越大越好 y~Pdata 代表从 Pdata里…

Vue3 watch 的使用,如何监听一个对象中的属性值的变化 vue3 + ts + vite

Vue3 watch 的使用&#xff0c;如何监听一个对象中的属性值的变化 由 vue2 转到 vue3 ts vite 之后都不会写这些玩意了。搜了下&#xff0c;找到了答案&#xff1a; vue2 的 watch <script>export default {watch: {$route.query.id(newValue){// 可以这样监听路由的…

vue 实现拐弯时间线,弯曲时间线,弯曲任务步骤条

需求&#xff1a; 实现可拐弯的步骤条功能 实现后效果如下&#xff1a; 代码部分&#xff1a; 创建步骤条组件Steps.vue <template><div><divstyle"width: 100%; display: flex; position: relative; margin-top: 20px"><div style"wi…

为什么大学c语言课不顺便教一下Linux,Makefile

为什么大学c语言课不顺便教一下Linux&#xff0c;Makefile&#xff0c;git&#xff0c;gdb等配套工具链呢? 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「Linux的资料从专业入门到高级教程工具包」&…

五、Spring AOP面向切面编程(基于注解方式实现和细节)

本章概要 Spring AOP底层技术组成初步实现获取通知细节信息切点表达式语法重用&#xff08;提取&#xff09;切点表达式环绕通知切面优先级设置CGLib动态代理生效注解实现小结 5.5.1 Spring AOP 底层技术组成 动态代理&#xff08;InvocationHandler&#xff09;&#xff1a;…

RocketMQ5.0延时消息时间轮算法

前言 RocketMQ 相较于其它消息队列产品的一个特性是支持延时消息&#xff0c;也就是说消息发送到 Broker 不会立马投递给消费者&#xff0c;要等待一个指定的延迟时间再投递&#xff0c;适用场景例如&#xff1a;下单后多长时间没付款系统自动关闭订单。 RocketMQ 4.x 版本的延…

一文搞懂手机卡的定向流量到底是什么!

最近有一些小伙伴对于手机卡流量中包含的定向流量这个概念不是很明白&#xff0c;而且也不知道具体如何使用&#xff0c;今天这个视频&#xff0c;葫芦弟就仔细给大家讲解一下&#xff0c;希望能解开小伙伴们心中的疑惑。废话不多说&#xff0c;我们直接进入正题&#xff01; 首…