Vue3全家桶 - Vue3 - 【2】声明响应式数据(ref + reactive + toRef + toRefs)

声明响应式数据

一、 组合式API

1.1 ref()

  • ref() 函数,可以创建 任何数据类型响应式数据
  • 🔺注意
    • 当值为 对象类型 时,会用 reactive() 自动转换它的 .value
      • ref 函数的内部实现依赖于 reactive 函数;
    • script使用值 的时候,需要 添加 .value 的后缀;
    • 模板中 使用 ref申明响应式数据,可以 省略 .value
  • 使用场景:
    • 基本数据类型;
    • 数组;
  • 示例展示:
    <script setup>// 引入 ref 函数,来声明响应式对象import { ref } from 'vue'// 使用 ref 函数来声明原始类型的数据源,具备响应式let account = ref('Abc')// 更改账号,控制台查看最新值function changeAccount() {// 通过 ref 函数声明的响应式数据,需要使用 .value 来获取数据的值account.value += '='console.log(account)}// 使用 ref 函数来声明对象类型的数据源:具备响应式let emp = ref({salary: 7000,name: 'Jack'})// 更改员工薪资,控制台查看最新值function changeEmpSalary() {// 通过 ref 函数声明的响应式数据,需要使用 .value 来获取数据的值emp.value.salary += 100console.log(emp)}
    </script><template><h1>账号:{{ account }}</h1><button @click="changeAccount">点我更改账号</button><hr><h1>员工:{{ emp }}</h1><button @click="changeEmpSalary">点我更改员工薪资</button>
    </template>
    

1.2 ractive()

  • reactive() 函数,它可以定义一个 引用数据类型 成为 响应式数据(Object、Array、Set、Map);
  • 使用场景:
    • Object;
  • 🔺注意:
    • 使用的时候 不能 对数据进行 普通解构,解构出来的数据 不具备响应式
      • 如果需要进行解构,需要使用特殊的函数;
    • string、number、boolean 等这样的 原始数据无效
  • 示例展示:
    <script setup>import { ref, reactive, toRef, toRefs } from 'vue';// NOTE ref - 使用 - 将基本数据类型转换成响应式数据let account = ref(123456)// NOTE reactive - 使用 - 将引用数据类型转换成响应式数据let info = reactive({name: '奥特曼',age: 22})// NOTE 将 info 进行解构,查看解构后的数据是否具有响应式// NOTE 结论:使用 reactive 将引用数据类型转换成响应式数据的时候,不能对其进行解构,因为解构出来的数据不具备响应式let { name, age } = infofunction changeAccount() {account.value++}function changeInfo() {info.age++}function changeName() {name += '1'}function changeAge() {age++}</script><template><h3> {{ account }} </h3><button @click="changeAccount"> 改变数字的值 </button><br><h3> {{ info }} </h3><button @click="changeInfo"> 改变对象的值 </button><br><h3> {{ name }} </h3><button @click="changeName"> 改变name的值 - 解构 </button><br><h3> {{ age }} </h3><button @click="changeAge"> 改变age的值 - 解构 </button>
    </template>
    
  • 效果展示:
    image.png

1.3 toRef()

  • toRef():转换 响应式对象某个属性单独响应式数据,并且 值是关联的
  • 语法
    import { toRef } from 'vue'
    let 新变量名 = toRef(要转换的对象名, '要转换对象中的属性名')
    
  • 🔺注意
    • 使用 toRef()前提 是对象必须被 reactive() 转换成响应式了;
    • 要使用解构之后的数据,需要添加 .value 的后缀;
    • toRef() 转换响应式数据包装成对象value存放值的位置;
  • 使用场景:
    • 有一个响应式数据,但是模板中只需要使用其中一项数据;
  • 示例展示:
    • 基于 1.4.2 代码,对 info 对象中的 某个属性 进行 解构;
      // NOTE 将 info 进行解构,查看解构后的数据是否具有响应式
      // NOTE 结论:使用 reactive 将引用数据类型转换成响应式数据的时候,不能对其进行解构,因为解构出来的数据不具备响应式
      // let { name, age } = info// NOTE 使用 toRef 对 info对象 的 某个属性 进行解构,并转换成响应式数据
      let name = toRef(info, 'name')
      let age = toRef(info, 'age')function changeName() {console.log(name)// 添加 .value 后缀才会生效name.value += '1'
      }const changeAge = () => {// NOTE 对象数据格式console.log(typeof age)// NOTE 数字console.log(typeof age.value)// 添加 .value 后缀才会生效age.value++
      }
      
  • 效果展示:
    image.png
    • 可以看到 使用 toRef() 解构之后的数据,是一个Object,value 存放数据;
      image.png

1.4 toRefs()

  • toRefs()
    • 将一个响应式数据转换为一个普通对象,这个普通对象的每个属性都是指向源对象相应属性的 ref。每个单独的 ref 都是使用 toRef() 创建的;
    • 转换 响应式对象所有属性单独响应式数据对象 成为 普通对象,并且 值是关联的
    • 🔺 toRefs() 可以 批量解构数据并保持响应式
    • 对象成为普通对象:
      const obj = reactive({ a: 1});
      const obj1 = toRefs(obj);
      
  • 🔺注意
    • 使用 toRefs()前提 是对象必须被 reactive() 转换成响应式了;
    • 要使用解构之后的数据,需要添加 .value 的后缀;
    • toRefs() 转换响应式数据包装成对象value存放值的位置;
  • 使用场景:剥离响应式对象(解构 / 展开),想使用响应式对象中的多个或者所有属性为响应式数据;
  • 示例展示:
    • 基于 1.4.2 的代码,对 info 对象的 所有属性 进行 解构;
    // NOTE 使用 toRef 对 info对象 的 某个属性 进行结构,并转换成响应式数据
    // let name = toRef(info, 'name');
    // let age = toRef(info, 'age');// NOTE 使用 toRefs 将对象的所有属性进行解构,此时,该对象是个普通对象,所有的值具有响应式
    const info1 = toRefs(info);
    let { name, age } = toRefs(info);
    // 以上两种方式,使用的时候都需要添加 .value 的后缀
    /**
    * info1.nmae.age += 1
    * age.value += 1
    **/
    
  • 效果展示:
    image.png
// 这块还不是太清楚,还要我自己瞎鼓捣一会
// 如果是这种写法
let info1 = toRefs(info)
// 1. 不改变 info1 里面数据的时候,改变 info 数据,info1数据也会同步发生变化;
// 2. 改变 info1 里面某个属性的数据// info 对应属性的数据不会发生变化,视图上info1展示的信息不会立即发生变化// 只有当info数据改变的时候(只要有一个属性改变,info1就会展示这次修改的数据),info1才会展示这次修改之后的数据// 再次改变 info 里面对应属性的数据,info1里面对应属性的数据不会发生改变;
// 新增方法const changeAge1 = () => {console.log(info1)info1.age = 456}
// 新增结构
<h3> {{ info1 }} </h3>
<button @click="changeAge1"> 改变info1-age的值 </button>

二、 选项式API的响应式数据

  • 可用 data 选项来声明组件的响应式状态,该 data 选项的值应为返回一个对象的函数;
  • data 函数返回对象的所有顶层属性都会被代理到组的实例(既方法和生命周期钩子中的 this 上);
<script>
export default {data: () => ({// 定义数据}),methods: {// 定义方法}
}
</script>

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

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

相关文章

【AI】如何创建自己的自定义ChatGPT

如何创建自己的自定义ChatGPT 目录 如何创建自己的自定义ChatGPT大型语言模型(LLM)GPT模型ChatGPTOpenAI APILlamaIndexLangChain参考推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课本文将记录如何使用OpenAI GPT-3.5模型、LlamaIndex和LangChain创建自己的…

java-ssm-基于jsp商场停车服务管理信息系统

java-ssm-基于jsp商场停车服务管理信息系统

Notes用户还可自助改密码

大家好&#xff0c;才是真的好。 很多时候企业对员工的安全使用进行了硬性规定&#xff0c;例如严格的就是&#xff0c;每三个月或六个月要至少更改一次密码。 在Domino 8.5以后&#xff0c;功能上多了一个新特性&#xff0c;叫ID保险库&#xff0c;其实就是把用户的id标识符…

day40 整数拆分 不同的二叉搜索树

题目1&#xff1a;343 整数拆分 题目链接&#xff1a;343 整数拆分 题意 将正整数n拆成k个正整数的和&#xff08;k>2&#xff09;使整数的乘积最大化 尽量拆成若干个数值近似相等的数&#xff0c;这使用的是数学里面的思想&#xff1a;ab<(a^2b^2)/2 (当且仅当ab时&…

http升级https需要做什么

背景&#xff1a;随着现代网络时代的高速发展&#xff0c;网络安全方面的日益更新&#xff0c;实现网站https协议的数量也在不断增多&#xff0c;完善安全方面的因素也在逐步增加。 下面从最基础的网站http协议全面升级为https协议的流程做出说明。 目录 首先带大家一起先了解…

Unity类银河恶魔城学习记录9-1 9-2 P89,90 Character stats - Stat script源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Stat.cs using System.Collections; using System.Collections.Generic; us…

javascript:void(0);用法及常见问题解析

javascript:void(0);用法及常见问题解析 1. 简介 javascript:void(0); 是一种 JavaScript 代码,常用于以下几种情况: 创建一个空链接,点击后不会发生任何跳转或动作。 在需要返回值的地方,返回 undefined 值。 避免意外的副作用,例如在箭头函数中,如果函数体不使用括号…

【C++】---string的OJ题

【C】---string的OJ题 1.字符串转整形数字&#xff08;重要&#xff09;&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;思路展示&#xff08;3&#xff09;代码实现 2.字符串相加&#xff08;重要&#xff09;&#xff08;1&#xff09;题目描述&#xff08;2&am…

如何保护企业云上安全

近日&#xff0c;CrowdStrike发布了《2024年全球威胁报告》&#xff0c;揭示了网络攻击的最新趋势。报告指出&#xff0c;网络攻击生态系统仍在持续增长&#xff0c;CrowdStrike在2023年观察到了34个新的威胁参与者。同时&#xff0c;攻击者正越来越多地瞄准云环境&#xff0c;…

Docker Desktop将镜像存储位置从C盘迁移到其它盘

一、简述 Docker Desktop默认安装在C盘,默认镜像存储位置在 C:\用户\Administrator\AppData\Local\Docker\wsl Docker Desktop 通过WSL2启动,会自动创建2个子系统,分别对应2个 vhdx 硬盘映像文件。 可以命令行执行wsl --list -v 看到 二、迁移步骤 1、在Docker Desktop…

css之常用样式

展示样式一&#xff1a; <div class"showListBox"><div class"List" v-for"(i,index) in sealList" :key"index"> <div class"ListItemCon"><div class"ListItem-titleBox"><img src…

阿里云ACK的应用服务如何暴露公网并挂载域名

背景介绍 针对部署到阿里云ACK集群的应用服务&#xff0c;实际业务场景可能需要我们暴露其中的服务到公网并要求通过域名访问改服务&#xff0c;那具体在阿里云平台上如何实现呢 配置步骤 新建ack集群是后续工作的第一前提由于篇幅有限就不在本文赘述&#xff0c;如下是基本…

Conmi遇到的坑——禅道的PCDN

好家伙&#xff0c;悄悄在后台吃了七十多G流量&#xff0c;我把你当兄弟宣传&#xff0c;你把我当PCDN吸。 还纳闷今天创建个VUE项目怎么提示D盘没空间&#xff0c;明明留了几十G&#xff0c;好家伙&#xff0c;一下子全吸干了。 删了两个&#xff0c;还有一个

6N137SDM光电耦合器中文资料规格书PDF数据手册引脚图图片价格参数芯片概述

产品概述&#xff1a; 6N137M、HCPL2601M、HCPL2611M 单沟道和 HCPL2630M、HCPL2631M 双沟道包含一个 850 nm AlGaAS LED&#xff0c;与带有可调谐输出的极高速集成式光电探测器逻辑门级进行光耦合。此输出具有一个开路集电极&#xff0c;允许有线 OR 输出。耦合参数在 -40C 至…

QT----计算器

目录 1 搭建标准界面2、 逻辑编写2.1 初始化 1 搭建标准界面 按照下图搭设界面 修改样式让这计算器看起来更像一点&#xff0c;同时对按钮分组进行样式编辑&#xff0c;添加字符串name,为number&#xff0c;其他按键为other。之前的文章里出现过好几次不在赘述 修改最大的样式…

git init 执行后发生了什么?

首先在磁盘中创建一个新目录 Git&#xff0c;进入该目录后执行 git init 初始化。这个时候目录下会创建一个隐藏目录 ./git&#xff0c;这个./git 目录叫做 Git 版本库或者仓库 $ git init Initialized empty Git repository in D:/Git/.git/ 在讲解.git 目录内容前&#xff0…

【SpringBoot3】快速启动框架 快速入门 配置文件

文章目录 SpringBoot3介绍一、快速入门二、入门总结1. 为什么依赖不需要写版本&#xff1f;2. 启动器(Starter)是什么3. SpringBootApplication注解包括的效果&#xff1f; 三、SpringBoot3配置文件3.1 统一配置管理概述3.2 属性配置文件使用3.3 YAML配置文件使用3.4 批量配置文…

【Unity】读取Json的三种方法(JsonUtility,LitJson,Newtonsoft)

介绍 在Unity开发过程中&#xff0c;Json是比较常用的一种数据存储文本&#xff0c;尤其是在和第三方交互中&#xff0c;基本都是json格式。 先给出一个Json示例&#xff0c;我们来看看是如何解析的。 {"Player": [{"id": 1001,"name": "…

SSL---VPN

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.SSL-VPN概述 SLL VPN是一种基于HTTPS&#xff08;即支持SSL的HTTP协议&#xff09;的远程安全接入技术。它充分利用了SSL协议提供的基于证书的身份认证、数据加密和消息完整性验证机制&#…

23-Java空对象模式 ( Null Object Pattern )

Java空对象模式 实现范例 在空对象模式&#xff08;Null Object Pattern&#xff09;中&#xff0c;一个空对象取代 NULL 对象实例的检查Null 对象不是检查空值&#xff0c;而是反应一个不做任何动作的关系&#xff0c;这样的 Null 对象也可以在数据不可用的时候提供默认的行为…