当前位置: 首页 > news >正文

vue3-03-创建响应式数据的几种方法

响应式数据

  • 一、 ref 创建:响应式数据
      • 1)ref 创建:基本类型的响应式数据
      • 2)ref 创建:对象类型的响应式数据
      • 3)volar 插件自动添加 .value
      • 4)customRef 自定义 ref
  • 二、 reactive 创建:响应式数据
      • 1)reactive 创建对象类型的响应式数据
      • 2)reactive更新对象数据
      • 3)toRefs 与 toRef
  • 三、 ref 和 reactive 的区别
  • 四、其他补充
      • 1)shallowRef、shallowReactive
        • 1. shallowRef
        • 2. shallowReactive
        • 3. 总结
      • 2)readonly 与 shallowReadonly
        • 1. readonly
        • 2. shallowReadonly
      • 3)toRaw 与 markRaw
        • 1. toRaw
        • 2. markRaw

此总结是我看尚硅谷视频总结的,所以可能会有总结不到位或不清楚的情况
适合学过的人回来复习的时候看

一、 ref 创建:响应式数据

ref 可以定义:基本类型、对象类型的响应式数据

1)ref 创建:基本类型的响应式数据

  • vue3项目,在setup中创建的变量,例如 let num = 100 中的num默认不是响应式数据
  • 利用 ref 可以创建基本类型的响应式数据

在这里插入图片描述

2)ref 创建:对象类型的响应式数据

若 ref 接收的是对象类型,内部其实也是调用了 reactive 函数

<script lang="ts" setup name="Person111">import { ref } from "vue"// 数据let car = ref({ brand: '奔驰', price: 100})let game = ref([{ id: 10001, name: '原神'},{ id: 10002, name: '双人成行'},{ id: 10003, name: '头七怪谈'}])// 方法function changePrice() { // 改变汽车价格car.value.price += 10console.log(car.value.price)}function changeGame() { // 改变游戏名称game.value[1].name = '纸嫁衣'}function changeCar() { // 更改车数据// car.value.brand = '小电驴'// car.value.price = 0.3// 上面两行的效果等同下面的这个代码,即使把整个对象赋给car.value,car也不会失去响应式car.value = { '小电驴', price: 0.3 }  }
</script>

在这里插入图片描述

3)volar 插件自动添加 .value

vscode左下角点击设置,搜索Dot Value,勾选,如下图
在这里插入图片描述

4)customRef 自定义 ref

customRef: 创建一个自定义的ref,并对其依赖项跟踪和更新触发进行逻辑控制

举例: 想要1s后(有延迟效果)响应式数据更新
注意:下例中 clearTimeout(timer)起到防抖效果

useSumRef.ts

import { customRef } from 'vue'
export default function (initValue: string, delay: number) {// 使用Vue提供的customRef定义响应式数据// track:跟踪    trigger:触发let msg = customRef((track, trigger) => {let timer: numberreturn {// get何时调用? -- msg被读取时get(){track() // 告诉Vue数据msg很重要,你要对msg进行持续关注,一旦msg变化就去更新return initValue},// set何时调用? -- msg被修改时set(value){clearTimeout(timer)timer = window.setTimeout(() => {initValue = valuetrigger() // 通知Vue数据msg变化了}, delay)}}})return { msg }
}

App.vue

<template><div class="app"><h2>{{ msg }}</h2><input type="text" v-model="msg"></div>
</template><script setup lang="ts" name="App">import {ref} from 'vue'import useMsgRef from './useMsgRef'// 使用Vue提供的默认ref定义响应式数据,数据一变,页面就更新// let msg = ref('你好')// 使用useMsgRef来定义一个响应式数据且有延迟效果let {msg} = useMsgRef('你好',1000)
</script>

二、 reactive 创建:响应式数据

  • reactive 只能创建对象类型的响应式数据
  • 在JS中可以直接操作对象类型数据,不需要.value

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

在这里插入图片描述

<template><div class="person"><h2>汽车信息:一辆{{ car.brand }}品牌的车,价格为{{ car.price }}</h2><button @click="changePrice">改变汽车价格</button><h2>游戏信息列表</h2><ul><li v-for="item in game" :key="item.id">{{ item.name }}</li></ul><button @click="changeGame">改变游戏名称</button><h4>深层次{{ shen.a.b.id }}</h4><button @click="changeShen">测试</button></div>
</template><script lang="ts" setup name="Person111">import { reactive } from "vue"// 数据let car = reactive({ brand: '奔驰', price: 100})let game = reactive([{ id: 10001, name: '原神'},{ id: 10002, name: '双人成行'},{ id: 10003, name: '头七怪谈'}])let shen = reactive({a: {b: {id: 4}}})// 方法function changePrice() {car.price += 10console.log(car.price)}function changeGame() {game[1].name = '纸嫁衣'}function changeShen() {shen.a.b.id = 100}
</script>

2)reactive更新对象数据

注意: reactive重新分配对象 ,会失去响应式

场景:

<button @click="changeCar">点击修改车数据</button>
...
let car = ref({ brand: '奔驰', price: 100})
...
function  changeCar()  {
// { brand: '小电驴', price: 0.3 } ,要更新这个信息给car
}

方法一:手动赋值

function  changeCar()  {
// { brand: '小电驴', price: 0.3 } ,要更新这个信息给car
// 弊端:从后端返回的数据可以一个对象里有很多属性,一个一个赋值也太麻烦了Person.name = 'lisi'Person.age = 20
}

方法二:对象整体赋值

function  changeCar()  {// { brand: '小电驴', price: 0.3 } ,要更新这个信息给car// 下面这个写法页面可以更新, 而且这个写法car不会失去响应式更新Object.assign(car, { brand: '小电驴', price: 0.3})// 下面是两种错误写法// car = { brand: '小电驴', price: 0.3} // 这么写,数据更新了,页面不更新,不是响应式的了// car = reactive({ brand: '小电驴', price: 0.3}) // 这么写页面不更新的
}

3)toRefs 与 toRef

在这里插入图片描述

<template><div class="box"><div>姓名:{{ person.name }}</div><div>年龄:{{ person.age }}</div><br><button @click="changeName">点击修改姓名</button><button @click="changeAge">点击修改年龄</button><div>叫啥:{{ test }}</div></div>
</template><script lang="ts" setup name="Person111">import { ref, reactive, toRefs, toRef } from "vue"// 数据let person = reactive({name: '张三',age: 18})let { name, age } = toRefs(person)console.log(name)  // 转换为了ref基本数据类型的响应式数据console.log(age)   // 相当于是把每一项都拆开了,但是每一项都还是ref响应式的let test = toRef(person, 'name') // 这个当然也是响应式的function changeName() {// person.name = 'zhang-san'name.value = 'zhang-san'}function changeAge() {// person.age += 1age.value += 1}</script><style>.box {padding: 20px;background-color: skyblue;box-shadow:  0 0 10px;border-radius: 20px;}button {margin-right: 20px;}
</style>

三、 ref 和 reactive 的区别

在这里插入图片描述

四、其他补充

1)shallowRef、shallowReactive

1. shallowRef

在这里插入图片描述

举例:
在这里插入图片描述

运行效果:只有 “sum+1” 和 “修改整个人” 的功能能用,另外两个无效

在这里插入图片描述

2. shallowReactive

在这里插入图片描述

举例:
在这里插入图片描述

运行效果:只有 “修改品牌” 和 “修改整个车” 功能能用,另外两个无效

在这里插入图片描述

3. 总结

在这里插入图片描述

2)readonly 与 shallowReadonly

1. readonly

效果:

  • original显示什么,readOnlyCopy就显示什么,original修改,readOnlyCopy也会跟着修改
  • original可以修改自己的值,readOnlyCopy什么都不能修改,只能读

在这里插入图片描述

2. shallowReadonly

效果:

  • original显示什么,shallowReadOnlyCopy就显示什么,original修改shallowReadOnlyCopy也会跟着修改
  • original可以修改自己的值,shallowReadOnlyCopy第一层数据不能修改,但是深层次(第二层、第三层…)数据能够修改

举例:

  • shallowReadOnlyCopy不能修改“name”和“hobby整体”,但能修改hobby.eat和hobby.sport的值
    在这里插入图片描述
    在这里插入图片描述

3)toRaw 与 markRaw

1. toRaw

在这里插入图片描述

使用示例:
在这里插入图片描述

2. markRaw

在这里插入图片描述

相关文章:

vue3-03-创建响应式数据的几种方法

响应式数据 一、 ref 创建&#xff1a;响应式数据1&#xff09;ref 创建&#xff1a;基本类型的响应式数据2&#xff09;ref 创建&#xff1a;对象类型的响应式数据3&#xff09;volar 插件自动添加 .value4&#xff09;customRef 自定义 ref 二、 reactive 创建&#xff1a;响…...

stm32智能颜色送餐小车(openmv二维码识别+颜色识别+oled显示)

大家好啊&#xff0c;我是情谊&#xff0c;今天我们来介绍一下我最近设计的stm32产品&#xff0c;我们在今年七月份的时候参加了光电设计大赛&#xff0c;我们小队使用的就是stm32的智能送餐小车&#xff0c;虽然止步于省赛&#xff0c;但是还是一次成长的经验吧&#xff0c;那…...

对接的广告平台越多,APP广告变现的收益越高?

无论是游戏、社交、工具应用类APP还是泛娱乐类APP&#xff0c;流量变现的方式主要有广告、内购、订阅三种方式。其中&#xff0c;广告变现是门槛最低、适用最广的变现方式。 只要APP有流量&#xff0c;就可以进行广告变现&#xff0c;让APP的流量快速转化为商业价值。作为最常…...

LINUX原始机安装JDK

文章目录 下载 JDK压缩包创建jdk文件夹sftp 远程上传解压缩 tar -zxvf 包名配置环境变量刷新 环境变量验证是否安装成功安装JAVA 依赖yum更新及替换镜像curl 命令下载更新更新yum依赖判断repo文件是否存在生成缓存、启用阿里云镜像 重新下载java依赖再次验证hello world 下载 J…...

MR400D工业级带网口4G DTU:RS232/RS485 TO LTE深度测评

在物联网技术日新月异的今天&#xff0c;数据传输的效率和稳定性成为了各行各业关注的焦点。作为一款集先进性与实用性于一身的物联网设备&#xff0c;工业级带网口的4G DTU&#xff08;数据传输单元&#xff09;以其强大的功能特性和广泛的应用场景&#xff0c;赢得了市场的广…...

第四范式发布AI+5G视频营销产品 助力精准获客与高效转化

产品上新 Product Release 今天&#xff0c;第四范式AI5G视频电话互动营销产品全新发布。 相较于以往销效率低、互动差、转化差的传统电话外呼和短信营销方式&#xff0c;视频电话互动营销基于AI、5G等技术&#xff0c;可让用户接听电话时观看个性化视频广告并实时互动&#xf…...

DVWA-IDS测试(特殊版本)

起因 浏览DVWA历史更新记录发现有版本带有IDS插件&#xff0c;可以用于平时没有相关设备等场景演示用&#xff0c;所以开启本次测试。 下载 官方最新版本是移除了IDS插件&#xff0c;原因是“从不使用”&#xff0c;所以需要下载移除该插件之前的版本。 https://github.com/…...

轻度自闭症的温柔启航:星启帆的康复之旅

在儿童成长的道路上&#xff0c;自闭症作为一种复杂的神经发展障碍&#xff0c;给许多家庭带来了挑战与困扰。轻度自闭症&#xff0c;作为自闭症谱系中的一个类型&#xff0c;其症状表现相对较轻&#xff0c;但同样需要我们的关注与科学的干预。星启帆自闭症儿童康复机构&#…...

一、OpenTK简介

文章目录 一、历史和发展二、功能和优势(一)强大的图形渲染功能(二)跨平台支持(三)与 C# 的紧密集成(四)开源和活跃的社区(五)性能优化三、适用场景(一)游戏开发(二)科学计算可视化(三)虚拟现实和增强现实应用(四)图形用户界面开发(五)教育和培训应用(六)…...

Dom4j详细介绍

Dom4j 1.1 解析概览 将数据存储为XML格式后&#xff0c;程序化地访问这些数据变得至关重要。虽然Java基础的IO操作能够实现这一目标&#xff0c;但这一过程往往既复杂又繁琐&#xff0c;尤其是在处理大型文件或需要频繁读写操作的场景下。为了解决这些问题&#xff0c;开发者…...

thissuper

this&super 一、 this this关键字表示调用的是当前类的成员变量或者成员方法 一般情况下&#xff0c;可以省略this关键字直接调用成员变量以及成员方法但当方法的形参与成员变量同名时&#xff0c;如果要在方法内使用成员变量&#xff0c;必须添加this关键字指明使用的是…...

cv::normalize()

cv::normalize()函数是OpenCV库中用于对矩阵或图像数据进行归一化处理的工具。归一化是图像处理和计算机视觉中常见的预处理步骤&#xff0c;它可以确保数据在一定范围内&#xff0c;从而有助于后续的处理和算法的稳定性和性能。cv::normalize()函数可以将输入矩阵的值缩放到一…...

【Python快速入门和实践016】Python常用脚本-对视频抽取指定帧数并保存

一、功能介绍 这段代码的功能是从一个视频文件中抽取指定数量的帧&#xff0c;并将这些帧保存为图像文件。步骤如下&#xff1a; 设置路径和参数&#xff1a; video_path&#xff1a;视频文件的路径。image_folder&#xff1a;保存抽取图像的目录。num_frames_to_extract&#…...

[Linux CMD] 目录与文件相关的命令

. 代表次层目录 .. 代表上一层目录 - 代表前一个工作目录 ~ 代表目前使用者身份所在的家目录 ~account 代表account这个使用者的家目录&#xff08;account是个账号名称&#xff09…...

redis面试(十三)公平锁排队代码剖析

我们来看一下第二种redis分布式锁 第一种锁是可重入锁&#xff0c;非公平可重入锁&#xff0c;所谓的非公平可重入锁是什么意思呢&#xff1f;胡乱的争抢&#xff0c;根本没有任何公平性和顺序性可言 第二种锁&#xff0c;可重入锁&#xff0c;公平锁 通过公平锁&#xff0c…...

冷热数据拆分

订单系统设计方案之如何做历史订单和归档 订单数据越来越多&#xff0c;数据库越来越慢该怎么办&#xff1f; 随着历史订单不断累积&#xff0c;2017年MySQL中订单表数据量已达千万级。之后的订单数据&#xff0c;远远大于亿级 对数据量大的问题&#xff0c;进行了以下优化…...

JavaScript 基础(四)

五、DOM编程 1.常用事件 onload 页面加载后触发事件 onscroll 滚动时触发 onresize 尺寸变化时 onclick 鼠标点击 onmouseover 鼠标悬停 onmouseout 鼠标移出 onmousemove 鼠标移动&#xff0c;会触发多次 onfocus 对象获得光标&#xff08;焦点&#xff09;时&#x…...

《机器学习by周志华》学习笔记-神经网络-01神经元模型

1、背景 本书所谈的「人工神经网络」不是生物学意义的神经网络。这是T.Kohonen 1988年在Neural Networks创刊号上给出的定义。 2、概念 2.1、神经网络 关于「神经网络(neural networks)」的研究很早就已经出现过,今天的「神经网络」已经是一个比较大且多学科交叉的领域,其…...

C#中常用的扩展类

/// <summary>/// 常用扩展/// </summary>public static class UsualExtension{public static string[] chineseNumbers { "零", "一", "二", "三", "四", "五", "六", "七", &…...

麒麟v10(ky10.x86_64)升级——openssl-3.2.2、openssh-9.8p1

系统版本: ky10.x86_64 下载安装包并上传 openssh下载地址 https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable openssl下载地址 https://openssl-library.org/source/index.html zlib下载地址 https://zlib.net/fossils/ 上传安装包 备份配置文件 cp -r /etc/ssh /et…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...