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

总结Vue3里一些常见的组合式api

一:前言

二:常见api

1、ref 和 reactive

        这两个组合式 api 是在 Vue3 开发中最为常见的两个 api ,主要是将一个非响应式的数据变为响应式数据。

        ref作用: 定义一个数据的响应式

  • 语法: const xxx = ref(initValue):
  • 创建一个包含响应式数据的引用(reference)对象
  • js中操作数据: xxx.value
  • 模板中操作数据: 不需要.value
  • 一般用来定义一个基本类型的响应式数据

        reactive作用: 定义多个数据的响应式

  • 语法:const proxy = reactive(obj):
  • 响应式转换是“深层的”:会影响对象内部所有嵌套的属性
  • 内部基于 ES6 的 Proxy 实现,通过代理对象操作源对象内部数据都是响应式的
  • 接收一个普通对象然后返回该普通对象的响应式代理器对象

代码:

// ref
<template><h2>{{count}}</h2><hr><button @click="update">更新</button>
</template><script>
import {ref
} from 'vue'
export default {/* 使用vue3的composition API */setup () {// 定义响应式数据 ref对象const count = ref(1)console.log(count)// 更新响应式数据的函数function update () {// alert('update')count.value = count.value + 1}return {count,update}}
}
</script>// reactive
<template><h2>name: {{state.name}}</h2><h2>age: {{state.age}}</h2><h2>wife: {{state.wife}}</h2><hr><button @click="update">更新</button>
</template><script>
import {reactive,
} from 'vue'
export default {setup () {/* 定义响应式数据对象*/const state = reactive({name: 'tom',age: 25,wife: {name: 'marry',age: 22},})console.log(state, state.wife)const update = () => {state.name += '--'state.age += 1state.wife.name += '++'state.wife.age += 2}return {state,update,}}
}
</script>

2、shallowRef和shallowReactive

  • shallowReactive : 只处理了对象内最外层属性的响应式(也就是浅响应式)

  • shallowRef: 只处理了value的响应式, 不进行对象的reactive处理

  • 什么时候用浅响应式呢?

    • 一般情况下使用ref和reactive即可
    • 如果有一个对象数据, 结构比较深, 但变化时只是外层属性变化 ===> shallowReactive
    • 如果有一个对象数据, 后面会产生新的对象来替换 ===> shallowRef
<template><h2>App</h2><h3>m1: {{m1}}</h3><h3>m2: {{m2}}</h3><h3>m3: {{m3}}</h3><h3>m4: {{m4}}</h3><button @click="update">更新</button>
</template><script lang="ts">
import { reactive, ref, shallowReactive, shallowRef } from 'vue'export default {setup () {const m1 = reactive({a: 1, b: {c: 2}})const m2 = shallowReactive({a: 1, b: {c: 2}})const m3 = ref({a: 1, b: {c: 2}})const m4 = shallowRef({a: 1, b: {c: 2}})const update = () => {m4.value.a += 1}return {m1,m2,m3,m4,update,}}
}
</script>

3、 readonly 与 shallowReadonly

  • readonly:
    • 深度只读数据
    • 获取一个对象 (响应式或纯对象) 或 ref 并返回原始代理的只读代理。
    • 只读代理是深层的:访问的任何嵌套 property 也是只读的。
  • shallowReadonly
    • 浅只读数据
    • 创建一个代理,使其自身的 property 为只读,但不执行嵌套对象的深度只读转换
  • 应用场景:
    • 在某些特定情况下, 我们可能不希望对数据进行更新的操作, 那就可以包装生成一个只读代理对象来读取数据, 而不能修改或删除
<template><h2>App</h2><h3>{{state}}</h3><button @click="update">更新</button>
</template><script lang="ts">
import { reactive, readonly, shallowReadonly } from 'vue'export default {setup () {const state = reactive({a: 1,b: {c: 2}})// const rState1 = readonly(state)const rState2 = shallowReadonly(state)const update = () => {// rState1.a++ // error// rState1.b.c++ // error// rState2.a++ // errorrState2.b.c++}return {state,update}}
}
</script>

4、 toRaw 与 markRaw

  • toRaw
    • 返回由 reactive 或 readonly 方法转换成响应式代理的普通对象。
    • 这是一个还原方法,可用于临时读取,访问不会被代理/跟踪,写入时也不会触发界面更新。
  • markRaw
    • 标记一个对象,使其永远不会转换为代理。返回对象本身
    • 应用场景:
      • 有些值不应被设置为响应式的,例如复杂的第三方类实例或 Vue 组件对象。
      • 当渲染具有不可变数据源的大列表时,跳过代理转换可以提高性能。
<template><h2>{{state}}</h2><button @click="testToRaw">测试toRaw</button><button @click="testMarkRaw">测试markRaw</button>
</template><script lang="ts">
/* 
toRaw: 得到reactive代理对象的目标数据对象
*/
import {markRaw,reactive, toRaw,
} from 'vue'
export default {setup () {const state = reactive<any>({name: 'tom',age: 25,})const testToRaw = () => {const user = toRaw(state)user.age++  // 界面不会更新}const testMarkRaw = () => {const likes = ['a', 'b']// state.likes = likesstate.likes = markRaw(likes) // likes数组就不再是响应式的了setTimeout(() => {state.likes[0] += '--'}, 1000)}return {state,testToRaw,testMarkRaw,}}
}
</script>

5、toRef

  • 为源响应式对象上的某个属性创建一个 ref对象, 二者内部操作的是同一个数据值, 更新时二者是同步的
  • 区别ref: 拷贝了一份新的数据值单独操作, 更新时相互不影响
  • 应用: 当要将 某个prop 的 ref 传递给复合函数时,toRef 很有用
<template><h2>App</h2><p>{{state}}</p><p>{{foo}}</p><p>{{foo2}}</p><button @click="update">更新</button><Child :foo="foo"/>
</template><script lang="ts">
import {reactive,toRef,ref,
} from 'vue'
import Child from './Child.vue'export default {setup () {const state = reactive({foo: 1,bar: 2})const foo = toRef(state, 'foo')const foo2 = ref(state.foo)const update = () => {state.foo++// foo.value++// foo2.value++  // foo和state中的数据不会更新}return {state,foo,foo2,update,}},components: {Child}
}
</script>
<template><h2>Child</h2><h3>{{foo}}</h3><h3>{{length}}</h3>
</template><script lang="ts">
import { computed, defineComponent, Ref, toRef } from 'vue'const component = defineComponent({props: {foo: {type: Number,require: true}},setup (props, context) {const length = useFeatureX(toRef(props, 'foo'))return {length}}
})function useFeatureX(foo: Ref) {const lenth = computed(() => foo.value.length)return lenth
}export default component
</script>

6、customRef

  • 创建一个自定义的 ref,并对其依赖项跟踪和更新触发进行显式控制
  • 需求: 使用 customRef 实现 debounce 的示例
<template><h2>App</h2><input v-model="keyword" placeholder="搜索关键字"/><p>{{keyword}}</p>
</template><script lang="ts">
/*
customRef:创建一个自定义的 ref,并对其依赖项跟踪和更新触发进行显式控制需求: 使用 customRef 实现 debounce 的示例
*/import {ref,customRef
} from 'vue'export default {setup () {const keyword = useDebouncedRef('', 500)console.log(keyword)return {keyword}},
}/* 
实现函数防抖的自定义ref
*/
function useDebouncedRef<T>(value: T, delay = 200) {let timeout: numberreturn customRef((track, trigger) => {return {get() {// 告诉Vue追踪数据track()return value},set(newValue: T) {clearTimeout(timeout)timeout = setTimeout(() => {value = newValue// 告诉Vue去触发界面更新trigger()}, delay)}}})
}</script>

7、provide 与 inject

  • provideinject提供依赖注入,功能类似 2.x 的provide/inject

  • 实现跨层级组件(祖孙)间通信

<template><h1>父组件</h1><p>当前颜色: {{color}}</p><button @click="color='red'">红</button><button @click="color='yellow'">黄</button><button @click="color='blue'">蓝</button><hr><Son />
</template><script lang="ts">
import { provide, ref } from 'vue'
/* 
- provide` 和 `inject` 提供依赖注入,功能类似 2.x 的 `provide/inject
- 实现跨层级组件(祖孙)间通信
*/import Son from './Son.vue'
export default {name: 'ProvideInject',components: {Son},setup() {const color = ref('red')provide('color', color)return {color}}
}
</script>
<template><div><h2>子组件</h2><hr><GrandSon /></div>
</template><script lang="ts">
import GrandSon from './GrandSon.vue'
export default {components: {GrandSon},
}
</script>
<template><h3 :style="{color}">孙子组件: {{color}}</h3></template><script lang="ts">
import { inject } from 'vue'
export default {setup() {const color = inject('color')return {color}}
}
</script>

三:结尾

        熟练的掌握 Vue3 中各种组合式 api ,可以让我们在日常开发中规避很多的 bug 以及提高代码速率。好啦,以上就是本文的全部内容了。希望能够对各位小伙伴有所帮助哦。

相关文章:

总结Vue3里一些常见的组合式api

一&#xff1a;前言 二&#xff1a;常见api 1、ref 和 reactive 这两个组合式 api 是在 Vue3 开发中最为常见的两个 api &#xff0c;主要是将一个非响应式的数据变为响应式数据。 ref作用: 定义一个数据的响应式 语法: const xxx ref(initValue):创建一个包含响应式数据的引…...

C_5练习题

一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中,选出一个正确的答案&#xff0c;并将所选项前的字母填写在答题纸的相应位置上。) 1.以下不正确的C语言标识符是(&#xff09; A. AB1 B._ab3 C. char D. a2_b 若 x、i、j、k都是 int型变量&#…...

【采坑分享】导出文件流responseType:“blob“如何提示报错信息

目录 前言&#xff1a; 采坑之路 总结&#xff1a; 前言&#xff1a; 近日&#xff0c;项目中踩了一个坑分享一下经验&#xff0c;也避免下次遇到方便解决。项目基于vue2axioselement-ui&#xff0c;业务中导出按钮需要直接下载接口中的文件流。正常是没有问题&#xff0c;但…...

机器学习算法——主成分分析(PCA)

目录 1. 主体思想2. 算法流程3. 代码实践 1. 主体思想 主成分分析&#xff08;Principal Component Analysis&#xff09;常用于实现数据降维&#xff0c;它通过线性变换将高维数据映射到低维空间&#xff0c;使得映射后的数据具有最大的方差。主成分可以理解成数据集中的特征…...

01、copilot+pycharm

之——free for student 目录 之——free for student 杂谈 正文 1.for student 2.pycharm 3.使用 杂谈 copilot是github推出的AI程序员&#xff0c;将chatgpt搬到了私人终端且无token限制&#xff0c;下面是使用方法。 GitHub Copilot 是由 GitHub 与 OpenAI 合作开发的…...

一般将来时

一般将来时 概念 表示将要发生的动作或打算、计划准备做某事 时间 tomorrow 明天 the day after tomorrow 后天 next week 下周 next weekend 下周末 next month 下个月 next year 明年 ...句子结构 主语 be&#xff08;am/is/are&#xff09;going to do … 计划,…...

【古诗生成AI实战】之四——模型包装器与模型的训练

在上一篇博客中&#xff0c;我们已经利用任务加载器task成功地从数据集文件中加载了文本数据&#xff0c;并通过预处理器processor构建了词典和编码器。在这一过程中&#xff0c;我们还完成了词向量的提取。 接下来的步骤涉及到定义模型、加载数据&#xff0c;并开始训练过程。…...

redis实现消息延迟队列

业务场景 在很多软件系统功能中都会出现定时任务的业务场景,比如提前点单,比如定时发布动态,文章等而出现这样的的定时的任务为延迟队任务 代码模块 任务的持久化一般都需要建立一个任务表和任务日志表,避免宕机导致任务失效,先新建立一个数据库,创建基本的任务表和任务日志表…...

keyof

// 在TypeScript中&#xff0c;keyof是一个操作符&#xff0c; // 它允许你从一个类型中提取所有的可枚举属性名&#xff0c;并将它们组成一个联合类型。 // 例如&#xff0c;假设你有这样一个类型&#xff1a; type Person { firstName: string; lastName: string; age: n…...

Centos 7 更改 PostgreSQL 14 默认存储路径

前言&#xff1a; 默认PostgreSQL数据存储路径为&#xff1a;/var/lib/pgsql/14/data 迁移到新的存储路径&#xff1a;/mnt/postgresql/data 1、关闭PostgreSQL服务 systemctl stop postgresql-142、创建目录 # 创建新目录 mkdir -p /mnt/postgresql/data# 更改目录权限 chow…...

深信服超融合一体机提示:内存ECC

PS&#xff1a;此事件分享主要来源于季度巡检时发现的超融合一体机红灯闪烁异常&#xff0c;接入IPMI端口查看日志发现持续提示内存ECC&#xff1b; 因为是只有3.05这一天发现了有这个告警的提示&#xff0c;所以当时清除了日志以后重启了BMC服务就解决了&#xff1b;但是如果清…...

STK Components 二次开发-地面站传感器

上一篇我们说了创建地面站&#xff0c;那么这次我们在地面站添加一些特效。 1. 创建地面站 var locationPoint1 new PointCartographic(m_earth, new Cartographic(Trig.DegreesToRadians(117.17066), Trig.DegreesToRadians(31.84056), 240.359)); m_facility new Platfor…...

基于springboot校园车辆管理系统

背景 伴随着社会经济的快速发展&#xff0c;机动车保有量不断增加。不断提高的大众生活水平以及人们不断增长的自主出行需求&#xff0c;人们对汽车的 依赖性在不断增强。汽车已经发展成为公众日常出行的一种重要的交通工具。在如此形势下&#xff0c;高校校园内的机动车数量也…...

通用电气调查网络攻击和数据盗窃指控

通用电气正在调查有关威胁行为者在网络攻击中破坏了公司开发环境并泄露据称被盗数据的指控。 通用电气 (GE) 是一家美国跨国公司&#xff0c;业务涉及电力、可再生能源和航空航天行业。 本月早些时候&#xff0c;一个名为 IntelBroker 的威胁行为者试图在黑客论坛上以 500 美…...

2023亚太赛数学建模A题:采果机器人的图像识别技术思路模型代码

亚太A题&#xff1a;采果机器人的图像识别技术 A题完整思路获取 &#xff1a;获取见文末名片&#xff0c;第一时间更新 中国是世界上最大的苹果生产国&#xff0c;年产量约为3500万吨。与此同时&#xff0c;中国也是世 界上最大的苹果出口国&#xff0c;全球每两个苹果中就有…...

C++ 协程

经典协程辅助入门代码&#xff1a; typedef cotask::task my_task_t; int main() { // create a task using factory function [with lambda expression] my_task_t::ptr_t task my_task_t::create([]() { //创建协程 std::cout ()->get_id() cotask::this_task::get…...

Flutter学习(六)EventBus的使用

背景 项目开发过程中&#xff0c;有些场景&#xff0c;需要跨页面进行数据传递。按照安卓开发的思路&#xff0c;在flutter实现一个事件总线EventBus&#xff0c;进行数据传递 原理 通过dart的签名函数&#xff0c;进行监听集合设置&#xff0c;然后post分发的时候&#xff…...

Linux系统---僵尸进程、孤儿进程

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 键盘敲烂&#xff0c;年薪百万&#xff01; 有了上一篇博客的学习&#xff0c;我们已经简单了解了进程的基础知识&#xff0c;今天我们再来学习两个特殊的进程&#xff0c;僵尸进程和孤儿进程。 …...

SpringBoot中如何优雅地使用重试

1 缘起 项目中使用了第三方的服务&#xff0c; 第三方服务偶尔会出现不稳定、连接不上的情况&#xff0c; 于是&#xff0c;在调用时为了保证服务的相对高可用&#xff0c;添加了超时连接重试&#xff0c; 当连接第三方服务超时时&#xff0c;多重试几次&#xff0c;比如3次&a…...

数据库日志解析:深入了解MySQL中的各类日志

**> &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 数据库日志解析&#xff1a;深入了解MySQL中的各类日志 前言第一&#xff1a;错误日志❌1. 错误日志的作用2. 记录内容3. 故障排查的方法 第二&#xff1a;查询日志1.…...

OpenClaw内存优化技巧:Phi-3-vision-128k-instruct在8GB设备上的稳定运行方案

OpenClaw内存优化技巧&#xff1a;Phi-3-vision-128k-instruct在8GB设备上的稳定运行方案 1. 为什么需要内存优化&#xff1f; 去年我在一台老款MacBook Air上第一次尝试部署Phi-3-vision-128k-instruct时&#xff0c;系统几乎立即崩溃。这台仅有8GB内存的设备&#xff0c;在…...

大卫小东(Sheldon)恫

Issue 概述 先来看看提交这个 Issue 的作者是为什么想到这个点子的&#xff0c;以及他初步的核心设计概念。?? 本 PR 实现了 Apache Gravitino 与 SeaTunnel 的集成&#xff0c;将其作为非关系型连接器的外部元数据服务。通过 Gravitino 的 REST API 自动获取表结构和元数据&…...

Python 批量导出数据库数据至 Excel 文件分

简介 langchain专门用于构建LLM大语言模型&#xff0c;其中提供了大量的prompt模板&#xff0c;和组件&#xff0c;通过chain(链)的方式将流程连接起来&#xff0c;操作简单&#xff0c;开发便捷。 环境配置 安装langchain框架 pip install langchain langchain-community 其中…...

空气质量指数背后的科学:从污染物浓度到健康影响的完整解读

空气质量指数背后的科学&#xff1a;从污染物浓度到健康影响的完整解读 清晨推开窗户&#xff0c;你是否曾因灰蒙蒙的天空而犹豫今天的晨跑计划&#xff1f;天气预报中那个看似简单的AQI数值&#xff0c;实则凝结了环境科学家们数十年的研究成果。这个介于0到500之间的数字&am…...

AI原生研发转型落地难?(SITS2026闭门报告首次解密:92%企业卡在“伪敏捷+真人工”陷阱)

第一章&#xff1a;AI原生研发的文化变革&#xff1a;从认知断层到组织跃迁 2026奇点智能技术大会(https://ml-summit.org) 当大模型不再仅是“调用API的工具”&#xff0c;而成为代码生成、测试覆盖、架构推演与运维决策的默认协作者&#xff0c;研发团队的认知基线正经历一…...

Vivado2020.2与Modelsim2020.4联合仿真实战:从安装到避坑指南

1. 环境准备与安装避坑指南 刚接触FPGA开发的朋友们&#xff0c;肯定对Vivado和Modelsim这对黄金搭档不陌生。但说实话&#xff0c;我第一次用Vivado2020.2和Modelsim2020.4做联合仿真时&#xff0c;差点被各种坑给劝退。今天我就把踩过的坑和解决方案都整理出来&#xff0c;让…...

C#实战编程:从基础练习到WinForm应用开发

1. C#基础语法快速上手 第一次接触C#时&#xff0c;我被它清晰的语法结构惊艳到了。作为微软主推的编程语言&#xff0c;C#既保留了C系语言的严谨性&#xff0c;又具备现代语言的简洁特性。先来看个最简单的例子&#xff1a; Console.WriteLine("Hello World!");这行…...

跳表(Skip List):思想、优劣与应用场景完全解读

一、为什么需要跳表&#xff1f;在计算机科学中&#xff0c;我们经常需要一种数据结构&#xff0c;既能快速查找&#xff0c;又能高效插入和删除。数组的二分查找虽然快&#xff08;O(log n)&#xff09;&#xff0c;但插入删除却需要移动大量元素&#xff08;O(n)&#xff09;…...

高效直链文件分享平台深度评测(二)

1. 为什么你需要一个高效直链文件分享平台&#xff1f; 在日常工作和学习中&#xff0c;我们经常需要快速分享文件给同事、朋友或客户。传统的网盘虽然功能丰富&#xff0c;但往往需要对方注册账号、下载客户端&#xff0c;甚至忍受漫长的广告等待时间。而直链文件分享平台则提…...

现在不重构组织,Q3将面临AI人才断层潮:SITS2026圆桌披露的21天敏捷转型启动清单

第一章&#xff1a;SITS2026圆桌&#xff1a;AI原生研发的组织变革 2026奇点智能技术大会(https://ml-summit.org) 在SITS2026圆桌讨论中&#xff0c;来自Google Brain、阿里通义实验室与微软Azure AI的工程负责人共同指出&#xff1a;AI原生研发已不再仅是工具链升级&#x…...