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

详细分析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>
  1. 创建子组件
    创建一个子组件 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>
  1. 更新 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
  1. 在父组件 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>
  1. 创建子组件
    在子组件 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>
  1. 创建颜色改变组件
    在 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>
  1. 更新 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. 拓展 前言 原先写过一篇父传子&#xff0c;推荐阅读&#xff1a;详细分析Vue3中的props用法&#xff08;父传子&#xff09; 实战中也常用这种方式&#xff0c;今天突然发现还有另外一种方式&#xff0c;对此进行深入探讨学习下 1. 基本知识 …...

spring集成kafka

Kafka 是一个分布式流处理平台&#xff0c;广泛用于构建实时数据流管道和流应用程序。它以高吞吐量、可扩展性和可靠性著称。以下是 Kafka 的实现原理详解及其在 Spring Boot 中的集成示例。 一、Kafka 实现原理 1. 架构概述 Kafka 的架构主要由以下几个组件组成&#xff1a…...

el-form表单中含有el-input按回车自动刷新如何阻止

场景&#xff1a; 在Vue.js中使用Element UI的el-input组件时&#xff0c;如果按下Enter键导致页面刷新&#xff0c;这通常是因为表单的默认提交行为被触发了。要避免这种情况&#xff0c;你可以在el-input所在的表单上监听键盘事件&#xff0c;并阻止默认行为。 先解释一下时间…...

Spring Boot2.x教程:(十)从Field injection is not recommended谈谈依赖注入

从Field injection is not recommended谈谈依赖注入 1、问题引入2、依赖注入的三种方式2.1、字段注入&#xff08;Field Injection&#xff09;2.2、构造器注入&#xff08;Constructor Injection&#xff09;2.3、setter注入&#xff08;Setter Injection&#xff09; 3、为什…...

在 Android Studio 上运行 Java 的 main 函数

直接写了个main函数运行的时候提示 这时我们需要在idea目录下找到gradle.xml文件 添加 <option name"delegatedBuild" value"false" />搞定...

【Nas】X-DOC:Mac mini 安装 ZeroTier 并替换 planet 实现内网穿透

【Nas】X-DOC&#xff1a;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

在现代分布式系统中&#xff0c;消息队列扮演着至关重要的角色。它能够实现系统间的异步通信、解耦组件以及提高系统的可扩展性和可靠性。RabbitMQ 作为一款广泛使用的开源消息中间件&#xff0c;具有强大的功能和灵活的配置。而 Spring Boot 则是一种流行的 Java 开发框架&…...

存在sql注入的公网站点

此数据为博主在新手阶段练习sql注入时发现的站点&#xff0c;漏洞可能修复&#xff0c;备注可能错误 url: https://www.uni-1.com.hk/about_en.php?id2 注入点类型&#xff1a;数值 sql报错回显&#xff1a;无 sql语句执行&#xff1a;[order by] [union] 字段数&#xff1a;1…...

linux之网络子系统- 内核发送数据包流程以及相关实际问题

一、相关实际问题 查看内核发送数据消耗的CPU时应该看sy还是si在服务器上查看/proc/softirqs&#xff0c;为什么NET_RX要比NET_TX大得多发送网络数据的时候都涉及那些内存拷贝操作零拷贝到底是怎么回事为什么Kafka的网络性能很突出 二、网络包发送过程总览 调用系统调用send发…...

UDP 实现的 Echo Server 和 Echo Client 回显程序

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! 在网络编程中&#xff0c;Echo Server 和 Echo Client 回显是一种经典的示例&#xff0c;用于演示基本的网络通信。Echo Server 接收来自客户端的数据&#xff0c;并将相同的数据发送回客户端。这种模式在测试…...

AUTOSAR CP MCAL微控制器抽象层介绍

AUTOSAR&#xff08;Automotive Open System Architecture&#xff09;即汽车开放系统架构&#xff0c;它将汽车电子控制单元&#xff08;ECU&#xff09;的软件底层做了一个标准的封装&#xff0c;使得开发者能够共用一套底层软件&#xff0c;并通过修改参数来匹配不同的硬件和…...

SpringBoot应用部署到Docker中MySQL8时间戳相差8小时问题及处理方式

文章目录 SpringBoot应用部署到Docker中MySQL8时间戳相差8小时问题及处理方式1. 检查MySQL服务器的时间区设置2. 在Spring Boot应用程序中设置时间区3. Docker容器中通过Dockerfile设置时区4. 在运行Docker容器时通过命令行传递环境变量5. 启动SpringBoot应用时设置JVM参数来指…...

飞桨首创 FlashMask :加速大模型灵活注意力掩码计算,长序列训练的利器

在 Transformer 类大模型训练任务中&#xff0c;注意力掩码&#xff08;Attention Mask&#xff09;一方面带来了大量的冗余计算&#xff0c;另一方面因其 O ( N 2 ) O(N^2) O(N2)巨大的存储占用导致难以实现长序列场景的高效训练&#xff08;其中 N N N为序列长度&#xff09;…...

【含文档+源码】基于SpringBoot+Vue的新型吃住玩一体化旅游管理系统的设计与实现

开题报告 本文旨在探讨新型吃住玩一体化旅游管理系统的设计与实现。该系统融合了用户注册与登录、旅游景点管理、旅游攻略发帖、特色旅游路线推荐、附近美食推荐以及酒店客房推荐与预定等多项功能&#xff0c;旨在为游客提供全方位、一体化的旅游服务体验。在系统设计中&#…...

【网络安全】揭示 Web 缓存污染与欺骗漏洞

未经许可,不得转载。 文章目录 前言污染与欺骗Web 缓存污染 DoS1、HTTP 头部超大 (HHO)2、HTTP 元字符 (HMC)3、HTTP 方法覆盖攻击 (HMO)4、未键入端口5、重定向 DoS6、未键入头部7、Host 头部大小写规范化8、路径规范化9、无效头部 CP-DoS10、HTTP 请求拆分Web 缓存污染与有害…...

PHP如何防止防止源代码的暴露

在PHP开发中&#xff0c;防止源代码暴露是确保应用程序安全性的重要一环。源代码暴露可能会让攻击者发现敏感信息&#xff0c;如数据库凭据、业务逻辑漏洞等&#xff0c;从而进行恶意攻击。以下是一些防止PHP源代码暴露的方法&#xff1a; 禁用PHP短标签&#xff1a; 在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…...

定子调压调速系统

定子调压调速系统是一种用于控制三相交流绕线电机的调速系统&#xff0c;它通过改变电动机定子电压和转子电阻来实现对电机转速的控制。以下是关于定子调压调速系统的详细介绍&#xff1a; 工作原理 定子电压调控&#xff1a;在1&#xff5e;3档时&#xff0c;系统通过控制定子…...

从APP小游戏到Web漏洞的发现

一、前因&#xff1a; 在对一次公司的一个麻将游戏APP进行渗透测试的时候发现&#xff0c;抓到HTTP请求的接口&#xff0c;但是反编译APK后发现没有在本身发现任何一个关于接口或者域名相关的关键字&#xff0c;对此感到了好奇。 于是直接解压后everything搜索了一下&#xff…...

设计模式07-结构型模式(装饰模式/外观模式/代理模式/Java)

4.4 装饰模式 4.4.1 装饰模式的定义 1.动机&#xff1a;在不改变一个对象本身功能的基础上给对象增加额外的新行为 2.定义&#xff1a;动态地给一个对象增加一些额外的职责&#xff0c;就增加对象功能来说&#xff0c;装饰模式比生成子类实现更为灵活 4.4.2 装饰模式的结构…...

C# 广播技术——发现局域网设备技术——

一广播技术应用 客户端发现与管理&#xff1a;软件可以通过广播消息来发现网络中的客户端&#xff0c;从而方便对客户端进行集中管理和监控。服务通知&#xff1a;向所有客户端广播重要的通知、更新或警告信息&#xff0c;确保客户端及时了解相关情况。资源共享与分配&#xf…...

【QA】windows和linux陷入系统调用后有什么区别?

最近被某面试官的这个问题拷打&#xff0c;当场脸烧起来… 首先讲讲系统调用&#xff1a; 系统调用是操作系统为调用者提供服务的接口&#xff0c;以便程序员聚焦于业务问题。分为文件操作&#xff0c;内存分配&#xff0c;进程管理等等。用户使用系统调用后会触发软中断&…...

Github 2024-11-01 开源项目月报 Top19

根据Github Trendings的统计,本月(2024-11-01统计)共有19个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目9TypeScript项目3JavaScript项目3Svelte项目1Jupyter Notebook项目1Ruby项目1HTML项目1Rust项目1Java项目1C++项目1Go项目1Python中的…...

Python实现深度学习模型预测控制(tensorflow)DL-MPC(Deep Learning Model Predictive Control

链接&#xff1a;深度学习模型预测控制 &#xff08;如果认为有用&#xff0c;动动小手为我点亮github小星星哦&#xff09;&#xff0c;持续更新中…… 链接&#xff1a;WangXiaoMingo/TensorDL-MPC&#xff1a;DL-MPC&#xff08;深度学习模型预测控制&#xff09;是基于 P…...

Anki插件Export deck to html的改造

在Anki中进行复习时&#xff0c;每次只能打开一条笔记。如果积累了很多笔记&#xff0c;有时候会有将它们集中输出成一个pdf进行阅读的想法。Anki插件Export deck to html&#xff08;安装ID&#xff1a;1897277426&#xff09;就有这个功能。但是&#xff0c;这个插件目前存在…...

csdn 记载文章十分缓慢

现象&#xff1a;其它网站能够正常访问&#xff0c;但只要点击某个 csdn 页面就会等很久 &#xff08;本文只针对 csdn 网页&#xff0c;其他网页出现类似情况可以同样处理&#xff09; 产生这种现象的原因&#xff1a; 这种情况很有可能是在访问 CSDN 主页时&#xff0c;需要向…...

python通过pyperclip库操作剪贴板

pyperclip介绍 pyperclip是一个python库用于操作剪贴板&#xff0c;可以非常方便地将文本复制到剪贴板或从剪贴板获取文本。 通过pip进行安装&#xff1a;pip install pyperclip pyperclip的github地址 pyperclip使用 复制到剪贴板 import pypercliptext "Hello, Wo…...

LSTM——长短期记忆神经网络

目录 1.LSTM 工作原理 2.LSTM的代码实现 3.代码详解 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种特殊的循环神经网络&#xff08;RNN&#xff09;&#xff0c;用于解决长序列中的长期依赖问题。它通过引入门机制&#xff0c;控制信息的流入、保留和输出&…...

10进阶篇:运用第一性原理解答“是什么”类型题目

在667分析题题型中,关于“如何做”和“好处是什么”的题目,许多同学都能较好地运用前述的667作答地图开展答题,但是唯独在“是什么”类型题目(也可以叫做认识型题目),不知从何下手。这种题目通常要求我们理解、分析,并展望未来的发展方向,而结构化、逻辑清晰的答案往往…...