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

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

 Vue 组件系列文章:

《Vue组件:创建组件、注册组件、使用组件》

《Vue组件:使用Prop实现父组件向子组件传递数据》

《Vue组件:使用$emit()方法监听子组件事件》

《Vue组件:插槽》

《Vue组件:混入》

《Vue组件:动态组件、缓存组件、异步组件》

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

《Vue组件:模板引用ref属性的使用》 

1、Prop 逐级透传问题

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

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

2、provide 和 inject 的使用

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

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

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

2.1 静态数据的传递与接收

【实例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.2 响应式数据的传递与接收

【实例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>

执行结果:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python中的单例模式:从入门到精通
  • 【秋招笔试】9.09阿里国际秋招(已改编)-三语言题解
  • Hadoop Pig
  • Vue3+setup+el-pagination+el-select封装下拉分页及懒加载
  • git:分支管理
  • 如果java垮了其他语言社区就遭殃了,这个说法可信吗?
  • ffmpeg编译连接报错 undefined reference to `uncompress‘
  • 安全工具 | 使用Burp Suite的10个小tips
  • CANFD和CAN最主要的区别
  • 查找算法--python
  • Qt 实现自定义截图工具
  • 二维码的原理以及Java生成二维码【中间带图片】
  • 计算机网络(四) —— 简单Tcp网络程序
  • 使用 Lodash 提供的 isNil 和 omitBy 实现对象空属性的过滤
  • appium server gui详细按照步骤
  • 4. 路由到控制器 - Laravel从零开始教程
  • css布局,左右固定中间自适应实现
  • HTML-表单
  • IndexedDB
  • Invalidate和postInvalidate的区别
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java基本数据类型之Number
  • Java精华积累:初学者都应该搞懂的问题
  • Just for fun——迅速写完快速排序
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Linux链接文件
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Spring核心 Bean的高级装配
  • VuePress 静态网站生成
  • Windows Containers 大冒险: 容器网络
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 爱情 北京女病人
  • 关于List、List?、ListObject的区别
  • 基于组件的设计工作流与界面抽象
  • 开发基于以太坊智能合约的DApp
  • 前端js -- this指向总结。
  • 前端临床手札——文件上传
  • 前端设计模式
  • 如何编写一个可升级的智能合约
  • 入门级的git使用指北
  • 微服务核心架构梳理
  • 问题之ssh中Host key verification failed的解决
  • 1.Ext JS 建立web开发工程
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 容器镜像
  • ​一些不规范的GTID使用场景
  • ‌JavaScript 数据类型转换
  • ###C语言程序设计-----C语言学习(6)#
  • #ifdef 的技巧用法
  • #if等命令的学习
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...