详细分析Vue3中的provide和inject基本知识(附Demo)
目录
- 前言
- 1. 基本知识
- 2. Demo
- 3. 拓展
前言
原先写过一篇父传子,推荐阅读:详细分析Vue3中的props用法(父传子)
实战中也常用这种方式,今天突然发现还有另外一种方式,对此进行深入探讨学习下
1. 基本知识
在 Vue 3 中,provide 和 inject 是用于组件间数据共享的 API,允许父组件向子组件传递数据而不需要通过 props 一层层传递
-
provide:
在父组件中定义,可以提供数据给其所有子孙组件
该数据可以是任何类型(对象、数组、基本数据类型等) -
inject:
在子组件中使用,用于接收来自祖先组件提供的数据
通过 inject,子组件可以直接使用父组件提供的数据,而无需通过 props
基本的步骤也很简单,就是父组件使用provide提供数据,子组件使用inject接收数据
2. Demo
基本的项目结构如下:
my-vue-app
├── src
│ ├── components
│ │ ├── ParentComponent.vue
│ │ ├── ChildComponent.vue
│ ├── App.vue
│ ├── main.js
创建一个父组件 ParentComponent.vue,在其中提供一些数据
<!-- src/components/ParentComponent.vue -->
<template><div><h2>父组件</h2><p>提供的主题颜色: {{ themeColor }}</p><ChildComponent /></div>
</template><script>
import { provide, ref } from 'vue';
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent},setup() {// 创建一个响应式变量const themeColor = ref('blue');// 使用 provide 提供数据provide('themeColor', themeColor);return {themeColor};}
};
</script>
- 创建子组件
创建一个子组件 ChildComponent.vue,在其中注入父组件提供的数据
<!-- src/components/ChildComponent.vue -->
<template><div><h3>子组件</h3><p>使用的主题颜色: {{ themeColor }}</p></div>
</template><script>
import { inject } from 'vue';export default {setup() {// 使用 inject 获取提供的数据const themeColor = inject('themeColor');return {themeColor};}
};
</script>
- 更新 App.vue
在 App.vue 中使用父组件:
<template><div id="app"><ParentComponent /></div>
</template><script>
import ParentComponent from './components/ParentComponent.vue';export default {components: {ParentComponent}
};
</script>
3. 拓展
通过按钮点击改变主题颜色
相关的结构如下:
my-vue-app
├── src
│ ├── components
│ │ ├── ParentComponent.vue
│ │ ├── ChildComponent.vue
│ │ ├── ColorChanger.vue
│ ├── App.vue
│ ├── main.js
- 在父组件 ParentComponent.vue 中提供一个状态(主题颜色)和一个方法(改变颜色):
<!-- src/components/ParentComponent.vue -->
<template><div><h2>父组件</h2><p>当前主题颜色: {{ themeColor }}</p><ChildComponent /><ColorChanger /></div>
</template><script>
import { provide, ref } from 'vue';
import ChildComponent from './ChildComponent.vue';
import ColorChanger from './ColorChanger.vue';export default {components: {ChildComponent,ColorChanger},setup() {// 创建一个响应式变量const themeColor = ref('blue');// 方法:改变颜色const changeColor = (newColor) => {themeColor.value = newColor;};// 使用 provide 提供数据和方法provide('themeColor', themeColor);provide('changeColor', changeColor);return {themeColor};}
};
</script>
- 创建子组件
在子组件 ChildComponent.vue 中注入并使用主题颜色:
<!-- src/components/ChildComponent.vue -->
<template><div><h3>子组件</h3><p>使用的主题颜色: {{ themeColor }}</p></div>
</template><script>
import { inject } from 'vue';export default {setup() {// 使用 inject 获取提供的数据const themeColor = inject('themeColor');return {themeColor};}
};
</script>
- 创建颜色改变组件
在 ColorChanger.vue 中注入并使用改变颜色的方法:
<!-- src/components/ColorChanger.vue -->
<template><div><h3>颜色改变器</h3><button @click="changeColor('red')">红色</button><button @click="changeColor('green')">绿色</button><button @click="changeColor('blue')">蓝色</button></div>
</template><script>
import { inject } from 'vue';export default {setup() {// 使用 inject 获取提供的方法const changeColor = inject('changeColor');return {changeColor};}
};
</script>
- 更新 App.vue
在 App.vue 中使用父组件:
<template><div id="app"><ParentComponent /></div>
</template><script>
import ParentComponent from './components/ParentComponent.vue';export default {components: {ParentComponent}
};
</script>
截图如下:

相关文章:
详细分析Vue3中的provide和inject基本知识(附Demo)
目录 前言1. 基本知识2. Demo3. 拓展 前言 原先写过一篇父传子,推荐阅读:详细分析Vue3中的props用法(父传子) 实战中也常用这种方式,今天突然发现还有另外一种方式,对此进行深入探讨学习下 1. 基本知识 …...
spring集成kafka
Kafka 是一个分布式流处理平台,广泛用于构建实时数据流管道和流应用程序。它以高吞吐量、可扩展性和可靠性著称。以下是 Kafka 的实现原理详解及其在 Spring Boot 中的集成示例。 一、Kafka 实现原理 1. 架构概述 Kafka 的架构主要由以下几个组件组成:…...
el-form表单中含有el-input按回车自动刷新如何阻止
场景: 在Vue.js中使用Element UI的el-input组件时,如果按下Enter键导致页面刷新,这通常是因为表单的默认提交行为被触发了。要避免这种情况,你可以在el-input所在的表单上监听键盘事件,并阻止默认行为。 先解释一下时间…...
Spring Boot2.x教程:(十)从Field injection is not recommended谈谈依赖注入
从Field injection is not recommended谈谈依赖注入 1、问题引入2、依赖注入的三种方式2.1、字段注入(Field Injection)2.2、构造器注入(Constructor Injection)2.3、setter注入(Setter Injection) 3、为什…...
在 Android Studio 上运行 Java 的 main 函数
直接写了个main函数运行的时候提示 这时我们需要在idea目录下找到gradle.xml文件 添加 <option name"delegatedBuild" value"false" />搞定...
【Nas】X-DOC:Mac mini 安装 ZeroTier 并替换 planet 实现内网穿透
【Nas】X-DOC:Mac mini 安装 ZeroTier 并替换 planet 实现内网穿透 1、下载客户端 ZeroTier One2、安装过程3、更换planet备份原planet4、重启服务5、加入网络6、NAT内网穿透 1、下载客户端 ZeroTier One https://www.zerotier.com/download/ 选择 MacOS 适用版本&…...
Spring Boot 集成 RabbitMQ
在现代分布式系统中,消息队列扮演着至关重要的角色。它能够实现系统间的异步通信、解耦组件以及提高系统的可扩展性和可靠性。RabbitMQ 作为一款广泛使用的开源消息中间件,具有强大的功能和灵活的配置。而 Spring Boot 则是一种流行的 Java 开发框架&…...
存在sql注入的公网站点
此数据为博主在新手阶段练习sql注入时发现的站点,漏洞可能修复,备注可能错误 url: https://www.uni-1.com.hk/about_en.php?id2 注入点类型:数值 sql报错回显:无 sql语句执行:[order by] [union] 字段数:1…...
linux之网络子系统- 内核发送数据包流程以及相关实际问题
一、相关实际问题 查看内核发送数据消耗的CPU时应该看sy还是si在服务器上查看/proc/softirqs,为什么NET_RX要比NET_TX大得多发送网络数据的时候都涉及那些内存拷贝操作零拷贝到底是怎么回事为什么Kafka的网络性能很突出 二、网络包发送过程总览 调用系统调用send发…...
UDP 实现的 Echo Server 和 Echo Client 回显程序
欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! 在网络编程中,Echo Server 和 Echo Client 回显是一种经典的示例,用于演示基本的网络通信。Echo Server 接收来自客户端的数据,并将相同的数据发送回客户端。这种模式在测试…...
AUTOSAR CP MCAL微控制器抽象层介绍
AUTOSAR(Automotive Open System Architecture)即汽车开放系统架构,它将汽车电子控制单元(ECU)的软件底层做了一个标准的封装,使得开发者能够共用一套底层软件,并通过修改参数来匹配不同的硬件和…...
SpringBoot应用部署到Docker中MySQL8时间戳相差8小时问题及处理方式
文章目录 SpringBoot应用部署到Docker中MySQL8时间戳相差8小时问题及处理方式1. 检查MySQL服务器的时间区设置2. 在Spring Boot应用程序中设置时间区3. Docker容器中通过Dockerfile设置时区4. 在运行Docker容器时通过命令行传递环境变量5. 启动SpringBoot应用时设置JVM参数来指…...
飞桨首创 FlashMask :加速大模型灵活注意力掩码计算,长序列训练的利器
在 Transformer 类大模型训练任务中,注意力掩码(Attention Mask)一方面带来了大量的冗余计算,另一方面因其 O ( N 2 ) O(N^2) O(N2)巨大的存储占用导致难以实现长序列场景的高效训练(其中 N N N为序列长度)…...
【含文档+源码】基于SpringBoot+Vue的新型吃住玩一体化旅游管理系统的设计与实现
开题报告 本文旨在探讨新型吃住玩一体化旅游管理系统的设计与实现。该系统融合了用户注册与登录、旅游景点管理、旅游攻略发帖、特色旅游路线推荐、附近美食推荐以及酒店客房推荐与预定等多项功能,旨在为游客提供全方位、一体化的旅游服务体验。在系统设计中&#…...
【网络安全】揭示 Web 缓存污染与欺骗漏洞
未经许可,不得转载。 文章目录 前言污染与欺骗Web 缓存污染 DoS1、HTTP 头部超大 (HHO)2、HTTP 元字符 (HMC)3、HTTP 方法覆盖攻击 (HMO)4、未键入端口5、重定向 DoS6、未键入头部7、Host 头部大小写规范化8、路径规范化9、无效头部 CP-DoS10、HTTP 请求拆分Web 缓存污染与有害…...
PHP如何防止防止源代码的暴露
在PHP开发中,防止源代码暴露是确保应用程序安全性的重要一环。源代码暴露可能会让攻击者发现敏感信息,如数据库凭据、业务逻辑漏洞等,从而进行恶意攻击。以下是一些防止PHP源代码暴露的方法: 禁用PHP短标签: 在php.in…...
C++智能指针的实现
本篇文章详细探讨下如何使用裸指针实现智能指针。 补充内容 由于本篇文章主要是探讨怎么实现三种智能指针,但是在编码过程中,博主可能会使用些有些同学不了解的特性,为了保证大家思绪不被打断,博主先把这些小特性介绍出来,大家选择性参考。 1、什么是RAII? RAII(Reso…...
硅谷(12)菜单管理
菜单管理模块 11.1 模块初始界面 11.1.1 API&&type API: import request from /utils/request import type { PermisstionResponseData, MenuParams } from ./type //枚举地址 enum API {//获取全部菜单与按钮的标识数据ALLPERMISSTION_URL /admin/acl/permission…...
定子调压调速系统
定子调压调速系统是一种用于控制三相交流绕线电机的调速系统,它通过改变电动机定子电压和转子电阻来实现对电机转速的控制。以下是关于定子调压调速系统的详细介绍: 工作原理 定子电压调控:在1~3档时,系统通过控制定子…...
从APP小游戏到Web漏洞的发现
一、前因: 在对一次公司的一个麻将游戏APP进行渗透测试的时候发现,抓到HTTP请求的接口,但是反编译APK后发现没有在本身发现任何一个关于接口或者域名相关的关键字,对此感到了好奇。 于是直接解压后everything搜索了一下ÿ…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
