第九节: Vue 3 中的 provide 与 inject:优雅的跨组件通信

文章目录

    • 前言
    • 什么是 provide 和 inject?
    • provide 的基本使用
    • inject 的基本使用
    • provide 提供响应式数据数据
    • provide 提供修改数据的方法
    • provide 提供只读响应数据
    • provide 使用symbol作为注入名
    • inject 默认值
    • 总结

前言

在 Vue 3 中,provideinject 是一对强大的 API,用于实现跨组件的依赖注入。无论是构建大型应用,还是编写组件库,它们都能帮助你以更优雅的方式管理数据共享。本文将带你深入理解 provideinject 的使用方法,并通过生动的示例,展示如何在实际项目中灵活运用

什么是 provide 和 inject?

provide inject 是 Vue 3 提供的一种跨组件通信机制。与 propsemit 不同,它们允许祖先组件向任意深度的后代组件传递数据,而无需逐层传递。这种机制在以下场景中尤为有用:

  • 共享全局状态(如用户信息、主题配置)。
  • 构建高阶组件或插件。
  • 避免 props 层层传递的繁琐。

provide 的基本使用

provide 用于在祖先组件中提供数据,供后代组件注入。它接受两个参数:

  • key:注入名,可以是字符串Symbol
  • value:要注入的值。

与注册生命周期钩子的 API 类似,provide() 必须在组件的 setup() 阶段同步调用。

类型:
在这里插入图片描述

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

inject 的基本使用

inject 用于在后代组件中注入祖先组件或全局应用注入(app.provide())提供的数据。它接受两个参数:

  • key:注入名。
  • defaultValue(可选):当未找到匹配的 key 时使用的默认值。

与注册生命周期钩子的 API 类似,inject() 必须在组件的 setup() 阶段同步调用。

类型
在这里插入图片描述

注入数据
第一个参数是注入的 key。Vue 会遍历父组件链,通过匹配 key 来确定所提供的值。如果父组件链上多个组件对同一个 key 提供了值,那么离得更近的组件将会“覆盖”链上更远的组件所提供的值。如果没有能通过 key 匹配到值,inject() 将返回 undefined

示例:
在这里插入图片描述
需要注意的是如果父组件提供的数据是非响应式数据, 当父组件数据的变化,子组件数据不会改变, 视图不会更新渲染
但如果父组件提供的值是一个 ref,注入进来的会是该 ref 对象,而不会自动解包为其内部的值。这使得注入方组件能够通过 ref 对象保持了和供给方的响应性链接。


provide 提供响应式数据数据

在提供数据时,可以提供响应式数据, 这样当提供数据发生变化时, 注入的数据也会发生变化

示例
在这里插入图片描述

当提供的响应数据user发生变化时,注入的组件显示的result 内容也会更新

provide 提供修改数据的方法

当提供/注入响应式的数据时,建议尽可能将任何对响应式状态的变更都保持在供给方组件中。这样可以确保所提供状态的声明和变更操作都内聚在同一个组件内,使其更容易维护。

如果你需要在注入组件中修改数据, 可以在提供时提供一个修改方法, 在注入组件内使用这个方法

示例
在这里插入图片描述

provide 提供只读响应数据

如果你不希望子组件中直接修改响应数据, 可以提供一个readonly 包装的只读数据

示例
在这里插入图片描述

provide 使用symbol作为注入名

至此,我们已经了解了如何使用字符串作为注入名。但如果你正在构建大型的应用,包含非常多的依赖提供,或者你正在编写提供给其他开发者使用的组件库,建议最好使用 Symbol 来作为注入名以避免潜在的冲突。

使用
在这里插入图片描述

当使用 TypeScript 时,key 可以是一个被类型断言为 InjectionKeysymbolInjectionKey 是一个 Vue 提供的工具类型,继承自 Symbol,可以用来同步 provide() inject() 之间值的类型。

使用
在这里插入图片描述

inject 默认值

inject 第二个参数是可选的,即在没有匹配到 key 时使用的默认值。它也可以是一个工厂函数,用来返回某些创建起来比较复杂的值。如果默认值本身就是一个函数,那么你必须将 false 作为第三个参数传入,表明这个函数就是默认值,而不是一个工厂函数。

示例
在这里插入图片描述

总结

provideinject 为 Vue 3 提供了一种优雅的跨组件通信方式。无论是共享全局状态,还是避免 props 层层传递,它们都能帮助你以更简洁的方式管理应用数据。通过本文的学习,相信你已经掌握了 provideinject 的核心用法。在实际开发中,灵活运用这些技巧,可以让你的代码更高效、更优雅。

如果你有任何疑问或想法,欢迎在评论区分享!🌟

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

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

相关文章

prometheus+node_exporter+grafana监控K8S信息

prometheusnode_exportergrafana监控K8S 1.prometheus部署2.node_exporter部署3.修改prometheus配置文件4.grafana部署 1.prometheus部署 包下载地址:https://prometheus.io/download/ 将包传至/opt 解压 tar xf prometheus-2.53.3.linux-amd64.tar.gz 移动到…

C/C++流星雨

系列文章 序号直达链接1C/C李峋同款跳动的爱心2C/C跳动的爱心3C/C经典爱心4C/C满屏飘字5C/C大雪纷飞6C/C炫酷烟花7C/C黑客帝国同款字母雨8C/C樱花树9C/C奥特曼10C/C精美圣诞树11C/C俄罗斯方块小游戏12C/C贪吃蛇小游戏13C/C孤单又灿烂的神14C/C闪烁的爱心15C/C哆啦A梦16C/C简单…

理解 MHA、GQA、MQA 和 MLA:多头注意力的变种及其应用

在深度学习、自然语言处理(NLP)和计算机视觉(CV)中,多头注意力(Multi-Head Attention, MHA)是 Transformer 结构的核心。近年来,MHA 产生了多个变体,如 GQA(G…

Crack SmartGit

感谢大佬提供的资源 一、正常安装SmartGit 二、下载crackSmartGit crackSmartGit 发行版 - Gitee.com 三、使用crackSmartGit 1. 打开用户目录:C:\Users%用户名%\AppData\Roaming\syntevo\SmartGit。将crackSmartGit.jar和license.zip拷贝至 用户目录。 2. 用户…

将CUBE或3DL LUT转换为PNG图像

概述 在大部分情况下,LUT 文件通常为 CUBE 或 3DL 格式。但是我们在 OpenGL Shader 中使用的LUT,通常是图像格式的 LUT 文件。下面,我将教大家如何将这些文件转换为 PNG 图像格式。 条形LUT在线转换(不是8x8网络)&am…

关于命令行下的 git( git add、git commit、git push)

文章目录 关于 gitgit 的概念git 操作(git add、git commit、git push 三板斧)安装 git新建仓库及配置git clone.gitignoregit addgit commitgit push其他 git 指令git pull(把远端的东西拉到本地进行同步)其他指令 关于 git git…

一文讲解Redis中的数据一致性问题

一文讲解Redis中的数据一致性问题 在技术派实战项目中,我们采用的是先写 MySQL,再删除 Redis 的方式来保证缓存和数据库的数据一致性。 我举例说明一下。 对于第一次查询,请求 B 查询到的缓存数据是 10,但 MySQL 被请求 A 更新为…

论文笔记(七十二)Reward Centering(五)

Reward Centering(五) 文章概括摘要附录B 理论细节C 实验细节D 相关方法的联系 文章概括 引用: article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arX…

使用 Python 进行批量解压 .rar 文件

在进行解压 .rar 文件之前,需要进行下载外部工具包,参考以下地址: WinRAR archiver, a powerful tool to process RAR and ZIP filesWinRAR is a Windows data compression tool that focuses on the RAR and ZIP data compression formats …

夜莺监控 - 边缘告警引擎架构详解

前言 夜莺类似 Grafana 可以接入多个数据源,查询数据源的数据做告警和展示。但是有些数据源所在的机房和中心机房之间网络链路不好,如果由 n9e 进程去周期性查询数据并判定告警,那在网络链路抖动或拥塞的时候,告警就不稳定了。所…

Apache DolphinScheduler系列1-单节点部署及测试报告

文章目录 整体说明一、部署环境二、版本号三、部署方案四、部署步骤4.1、上传部署包4.2、创建外部数据库4.3、修改元数据库配置4.4、上传MySQLl驱动程序4.5、初始化外部数据库4.6、启停服务4.7、访问页面五、常见问题及解决方式5.1、时间不一致5.2、异常终止5.3、大量日志5.4、…

CNN 卷积神经网络

前置基础知识 convolution operator 卷积运算 输入矩阵循环取子矩阵跟filter(kernal)按位乘后加和作为输出矩阵对应位置的值。 convolution与cross correlation 上面操作实际是cross correlation操作,两者之间的唯一区别是卷积操作需要在开始计算之前将卷积核进行…

docker部署go简单web项目(无mysql等附加功能)

首先准备好go语言代码 代码表示当访问主机上8080端口下的/hello路径时,会返回hello,world。 package mainimport ("fmt""github.com/gin-gonic/gin" )type hh struct {S string }func main() {router : gin.Default()router.GET(&…

C语言:字符函数和字符串函数

1.字符函数 在 C 语言中&#xff0c;字符分类函数主要定义在<ctype.h>头文件中&#xff0c;这些函数可以用来判断一个字符是否属于特定的字符类别&#xff0c;下面为你详细介绍一些常用的字符分类函数&#xff1a; 1.1 iscntrl 功能&#xff1a;判断一个字符是否为控制…

全域旅游景区导览系统:赋能智慧旅游生态,破解行业核心难题

全域旅游景区导览系统&#xff1a;赋能智慧旅游生态&#xff0c;破解行业核心难题 ——整合旅游商城、非遗文化与全域服务的一站式解决方案 一、行业痛点&#xff1a;传统旅游服务模式的局限性 随着旅游业从单一景区游览向“全域旅游”转型&#xff0c;传统服务模式暴露出诸多…

SQL笔记#集合运算

目录 一、表的加减法 1、什么是集合运算 2、表的加法——UNION 3、集合运算的注意事项 4、包含重复行的集合运算——ALL运算 5、选取表中公共部分——INTERSECT 6、记录的减法——EXCEPT 二、联结(以列为单位对表进行联结) 1、什么是联结(JOIN) 2、内联结——INSER…

基于C++“简单且有效”的“数据库连接池”

前言 数据库连接池在开发中应该是很常用的一个组件&#xff0c;他可以很好的节省连接数据库的时间开销&#xff1b;本文基使用C实现了一个简单的数据库连接池&#xff0c;代码量只有400行只有&#xff0c;但是压力测试效果很好&#xff1b;欢迎收藏 关注&#xff0c;本人将会…

如何通过提示词更好地利用AI

如何通过提示词工程释放AI的全部潜力&#xff1a;7个深度优化技巧 前言&#xff1a;为什么提示词决定AI的输出质量&#xff1f; 在人工智能对话系统的使用中&#xff0c;提示词&#xff08;Prompt&#xff09;就像开启宝藏的密码钥匙。研究表明&#xff0c;优化后的提示词可使…

【C语言】指针笔试题

前言&#xff1a;上期我们介绍了sizeof与strlen的辨析以及sizeof&#xff0c;strlen相关的一些笔试题&#xff0c;这期我们主要来讲指针运算相关的一些笔试题&#xff0c;以此来巩固我们之前所学的指针运算&#xff01; 文章目录 一&#xff0c;指针笔试题1&#xff0c;题目一…

电子科技大学考研复习经验分享

电子科技大学考研复习经验分享 本人情况&#xff1a;本科就读于电科软院&#xff0c;24年2月开始了解考研&#xff0c;24年3月开始数学&#xff0c;9月决定考本院&#xff08;开始全天候图书馆学习&#xff09;并开始专业课学习&#xff0c;11月底开始政治学习&#xff0c;最后…