Vue组件:依赖注入provide和inject的使用

news2024/9/25 11:20:27

1、Prop 逐级透传问题

通常情况下,当我们需要从父组件向子组件传递数据时,会使用 props。想象一下这样的结构:有一些多层级嵌套的组件,形成了一棵巨大的组件树,而某个深层的子组件需要一个较远的祖先组件中的部分数据。在这种情况下,如果仅使用 props 则必须将其沿着组件链逐级传递下去,这会非常麻烦:

注意,虽然这里的 <Footer> 组件可能根本不关心这些 props,但为了使 <DeepChild> 能访问到它们,仍然需要定义并向下传递。如果组件链路非常长,可能会影响到更多这条路上的组件。这一问题被称为“prop 逐级透传”,显然是我们希望尽量避免的情况。

2、provide 和 inject 的使用

provide 和 inject 可以帮助我们解决这一问题。一个父组件相对于其所有的后代组件,会作为依赖提供者。任何后代的组件树,无论层级有多深,都可以注入由父组件提供给整条链路的依赖。

provide() 函数:为组件后代提供数据。

inject() 函数:要注入上层组件提供的数据。

【实例1】使用依赖注入 provide 和 inject,实现多层级组件之间的数据传递。

(1)修改 App.vue 根组件文件,实现爷爷组件功能,并使用 provide 传递数据。

<template>
  <fieldset>
    <legend>爷爷组件</legend>
    <!-- 第三步:使用组件 -->
    <ParentComponent></ParentComponent>
  </fieldset>
</template>

<script>
//第一步:引用组件
import ParentComponent from '@/components/ParentComponent.vue';

export default {
  // 核心代码:使用 provide 传递数据
  provide: {
    blogName: '您好,欢迎访问 pan_junbiao的博客',
    blogUrl: 'https://blog.csdn.net/pan_junbiao'
  },
  //第二步:注册组件
  components: {
    ParentComponent
  }
}
</script>

(2)创建 ParentComponent.vue 父组件。

<template>
    <fieldset>
        <legend>父组件</legend>
        <!-- 第三步:使用组件 -->
        <ChildComponent></ChildComponent>
    </fieldset>
</template>

<script>
//第一步:引用组件
import ChildComponent from '@/components/ChildComponent.vue'
export default {
    //第二步:注册组件
    components: {
        ChildComponent,
    }
}
</script>

(3)创建 ChildComponent.vue 子组件,并使用 inject 接收爷爷组件传递的数据。

<template>
    <fieldset>
        <legend>子组件</legend>
        <h3>子组件接收到爷爷组件传递的数据:</h3>
        <p>博客信息:{{ blogName }}</p>
        <p>博客信息:{{ blogUrl }}</p>
    </fieldset>
</template>

<script>
export default {
    // 核心代码:使用 inject 接收数据
    inject: ['blogName', 'blogUrl']
}
</script>

执行结果:

【实例2】provide 的数据来自 data 选项,而 inject 接收到的数据保存到 data 选项。

(1)修改 App.vue 根组件文件,实现爷爷组件功能,将 provide 的数据读取来自 data 选项。

<template>
  <fieldset>
    <legend>爷爷组件</legend>
    <!-- 第三步:使用组件 -->
    <ParentComponent></ParentComponent>
  </fieldset>
</template>

<script>
//第一步:引用组件
import ParentComponent from '@/components/ParentComponent.vue';

export default {
  data() {
    return {
      blogName: '您好,欢迎访问 pan_junbiao的博客',
      blogUrl: 'https://blog.csdn.net/pan_junbiao'
    }
  },
  // 核心代码:使用 provide 传递数据
  provide() {
    return {
      blogName: this.blogName,
      blogUrl: this.blogUrl
    }
  },
  //第二步:注册组件
  components: {
    ParentComponent
  }
}
</script>

(2)修改 ChildComponent.vue 子组件,将 inject 接收爷爷组件传递的数据保存到 data 选项。

<template>
    <fieldset>
        <legend>子组件</legend>
        <h3>子组件接收到爷爷组件传递的数据:</h3>
        <p>博客信息:{{ blogName2 }}</p>
        <p>博客信息:{{ blogUrl2 }}</p>
    </fieldset>
</template>

<script>
export default {
    // 核心代码:使用 inject 接收数据
    inject: ['blogName', 'blogUrl'],
    data() {
        return {
            blogName2: this.blogName,
            blogUrl2: this.blogUrl
        }
    }
}
</script>

执行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧水务建设的核心内容

智慧水务解决方案的主要对象客户是全国各地水务投资集团、水务局、水司、水厂、农水办,也会有少量项目涉及到住建局或城管局。解决方案通常会以具体的某个业务单位的职能工作为切入点,配合物联感知、大数据分析、人工智能等技术手段,为城市供水、乡村供水的水质安全、供水调…

一文彻底了解DNS协议工作原理,恐怕没有比这更通俗易懂的了吧?

了解DNS工作原理有助于深入理解互联网通信的基础机制&#xff0c;对于网络运维、开发以及优化网站访问速度至关重要。它能帮助解决域名解析问题&#xff0c;提升用户体验&#xff0c;同时对于网络安全和防护也具有重要意义。本文博主反反复复、前前后后斟酌了三天&#xff0c;就…

【学习笔记】手写Tomcat 二

目录 响应静态资源 HTTP协议请求格式 1. 解析请求信息 创建解析请求类 HttpRequest 2. 创建静态资源目录 webs 3. 封装响应信息 创建静态资源处理器 StaticResourceHandler 创建响应类 HttpResponse 作业 1. 绘制 请求解析类 HttpRequest 和响应类 HttpResponse 的封…

动手学深度学习(pytorch土堆)-03常见的Transforms

Compose transforms.Compose 是 PyTorch 中的一个函数&#xff0c;用于将多个图像变换操作组合在一起&#xff0c;形成一个变换流水线。这样可以将一系列的图像处理操作整合为一个步骤&#xff0c;便于对图像进行批量预处理或增强。 基本用法 transforms.Compose 接受一个列表…

vue + Lodop 制作可视化设计页面 实现打印设计功能(四)

历史&#xff1a; vue2 Lodop 制作可视化设计页面 实现打印设计功能&#xff08;一&#xff09; vue Lodop 制作可视化设计页面 实现打印设计功能&#xff08;二&#xff09; vue Lodop 制作可视化设计页面 实现打印设计功能&#xff08;三&#xff09; 前言&#xff1a…

必看!实网环境下,合宙Cat.1模组低功耗详细数据

一、背景说明 合宙4G Cat.1模组以低功耗为显著特点&#xff0c;提供了三种功耗模式以适应不同需求。 分别是&#xff1a;常规模式&#xff0c;低功耗模式&#xff0c;PSM模式。 在实际应用中&#xff0c;用户可以根据不同的应用场景和需求&#xff0c;灵活选择合宙4G Cat.1模…

数据结构与算法图论 并查集

前言 写一道并查集的题 判断是否为亲戚 原题目&#xff1a;现在有若干家族图谱关系&#xff0c;给出了一些亲戚关系&#xff0c;如Marrv和Tom是亲戚&#xff0c;Tom和Ben是亲戚等等。从这些信息中&#xff0c;你可以推导出Marry和Ben是亲戚。请写一个程序&#xff0c;对于我…

一文读懂在线学习凸优化技术

一文读懂在线学习凸优化技术 在当今的数据驱动时代&#xff0c;机器学习算法已成为解决复杂问题的关键工具。在线学习凸优化作为机器学习中的一项核心技术&#xff0c;不仅在理论研究上具有重要意义&#xff0c;还在实际应用中展现出巨大的潜力。本文将深入浅出地介绍在线学习…

C++(三)----内存管理

1.C/C内存分布 看下面这个问题&#xff08;考考你们之前学的咋样&#xff09;&#xff1a; int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] {1, 2, 3, 4};char char2[] "abcd";char* pCh…

【leetcode C++】 动态规划

4. 91 解码方法 题目&#xff1a; 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; "1" -> A "2" -> B ... "25" -> Y "26" -> Z 然而&#xff0c;在 解码 已编码的消息时&#xff0c;你意识到有许多不同的…

数据湖-方案对比

数据湖架构结合了数据湖和数据仓库。虽然它不仅仅是两者之间的简单集成&#xff0c;但其理念是充分发挥两种架构的优势&#xff1a;数据仓库的可靠交易以及数据湖的可扩展性和低成本。 Lakehouse 架构支持管理各种数据类型&#xff0c;例如结构化、半结构化和非结构化数据&…

巧用工具,Vue 集成 medium-zoom 实现图片缩放

文章目录 巧用工具&#xff0c;Vue 集成 medium-zoom 实现图片缩放介绍medium-zoomVue3集成 medium-zoom 示例Vue2集成 medium-zoom 示例进阶 - 可选参数 巧用工具&#xff0c;Vue 集成 medium-zoom 实现图片缩放 在现代网页开发中&#xff0c;为用户提供良好的视觉体验至关重…

爬虫逆向学习(六):补环境过某数四代

声明&#xff1a;本篇文章内容是整理并分享在学习网上各位大佬的优秀知识后的实战与踩坑记录 引用博客&#xff1a; https://blog.csdn.net/shayuchaor/article/details/103629294 https://blog.csdn.net/qq_36291294/article/details/127699273 https://blog.csdn.net/weixin_…

vivo手机已删除的短信还能恢复吗?

虽然现在我们很少使用vivo手机的短信功能&#xff0c;但是我们偶尔还会通过vivo手机短信功能接收一些重要的信息。如果我们在清理垃圾短信的时候误删了vivo手机重要短信&#xff0c;该怎么恢复呢&#xff1f; 方法一&#xff1a;通过vivo云服务恢复 1、确保您已开启vivo云服务…

Go常用正则函数整理

前言 在Go语言中&#xff0c;标准库regexp提供了丰富的API来处理正则表达式&#xff0c;支持编译、匹配、查找、替换等操作。以下是一个Go标准库正则函数的常用大全教程及部分使用示例。 Go标准库常用正则函数 Compile&#xff1a;编译正则表达式&#xff0c;返回一个可用于…

Qt 构建报错 undefined reference to xxx

初次学习使用Qt&#xff0c;在构建时报错。这是个典型报错&#xff0c;熟练vs与c的朋友一眼就可以看出要么是库出问题了&#xff0c;要么是库链接出问题了。那么就可以按照相对明确的方向找问题。 1、确认库与项目配置是否一致。32位还是64位&#xff0c;debug还是release一定…

如何逆转Instagram账号流量减少?4个实用技巧分享

Instagram作为全球十大社媒之一&#xff0c;不仅是个人分享生活的平台&#xff0c;还是跨境卖家进行宣传推广和客户开发的关键工具。在运营Instagram的过程中&#xff0c;稍有不慎就容易出现账号被限流的情况&#xff0c;对于账号状态和运营工作的进行都十分不利。 一、如何判断…

new String(),toString()和Arrays.toString()的区别

下面写了一段代码来展示结果 import javax.sound.midi.Soundbank; import java.util.Arrays; import java.util.Scanner;public class Main {public static void main(String[] args) {String str "abc";System.out.println("str:"str);char[] chars st…

若楠带你初识OpenCV(7) -- 轮廓检测之银行卡号识别

文章目录 银行卡号识别详细流程一、设置参数二、函数准备三、具体步骤1. 得到每个数字的信息2. 银行卡处理3. 找到数字边框4. 模板匹配 总结 银行卡号识别 经过了几篇关于轮廓检测的学习&#xff0c;本篇我们来尝试完成对银行卡号的检测识别&#xff1a; 目标&#xff0c;识别…

获取时间,并将时间按一定的格式输出

一、时间函数 1.获取秒数 CTS 北京时间 2.转换为需要个格式 系统时间的获取: 1.time 获得秒数 time_t time(time_t *t); time_t 类型变量 第一种 准备一个变量 time_t tm; time(&tm) 第二种 tm time(NULL); 功能: 获得1970年到现在的秒数 第一步&#xff0c;先获得秒…