# 读官方文档学技术-Vue3父组件向子组件通讯不要盲目用props

本文讨论了在Vue3中,如何避免父组件通过props逐级传递数据给多层嵌套的子组件。作者提出依赖注入是一种更优雅的跨级共享数据的方法,通过`provide`和`inject`组合式API可以在任何深度的后代组件中直接获取父组件的数据。此外,还提到了组件通讯的其他形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读官方文档学技术-Vue3父组件向子组件通讯不要盲目用props

1. 先下结论:

父组件向子组件传递信息,如果是多层组件嵌套(父>子>孙>孙孙…) ,props逐级透传十分麻烦,props可用但不优雅,更推荐 provide/inject依赖注入的方式;

在**provide/inject依赖注入**中父组件向后代组件通讯,如果说props是传递,逐级透传的,那么依赖注入更准确来说是在父组件中与后代组件共享数据,可实现跨级共享;

2. 原因:

2.1. props逐级透传:

逐级透传,多层组件嵌套的情况,需要一层层传递到目标组件,十分麻烦,虽然大部分情况是点对点传递,但是涉及到多层组件通讯的情况,props用起来就不是那么优雅了

  • props父传子适应组件间直接传递的情况:从图中可见,**props逐级透传**是十分麻烦的,需要一层层传递props,在每一层子孙组件中接收props和传递props#### 2.1.1. props逐级透传:组合式API +setup 语法糖代码实例:
//父组件 Root.vue---------------------------------------------------
<template>
  <div>
    <Footer :msg="parentMsg" />
  </div>
</template>
<script setup> import { ref } from 'vue'
import Footer from './Footer.vue' //导入子组件Footer
const parentMsg = ref('父组件信息') </script>
​
//子组件 Footer.vue--------------------------------------------------
<template>
    <DeepChild>
    </DeepChild>
</template>
<script setup> import { toRef, defineProps } from "vue";
import DeepChild from './DeepChild.vue' //导入孙子组件DeepChild 
const props = defineProps(["msg"]);//接收Root父组件传递的信息
console.log(props.msg) //父组件信息 </script>
​
//子孙组件DeepChild.vue---------------------------------------------------
<template>
    <div>
        {{ msg }}
    </div>
</template>
<script setup> import { toRef, defineProps } from "vue";
const props = defineProps(["msg"]);//接收Footer父组件传递的信息
console.log(props.msg) //父组件信息 </script>
​ 

2.2. provide/inject依赖注入 跨级传递:

在**provide/inject依赖注入中父组件向后代组件通讯,如果说props是传递,逐级透传的,那么依赖注入更准确来说是在父组件中与后代组件共享数据,可实现跨级共享**

  • provide: 提供> 父组件中注册,传递给后代组件的数据对象* inject: 注入> 后代组件中接收父组件提供的数据对象#### 2.2.1. provide/inject依赖注: 组合式API +setup 语法糖代码实例:
//父组件 Root.vue---------------------------------------------------
<template>
  <div>
    <Footer/>
  </div>
</template>
<script setup> import { ref } from 'vue'
import Footer from './Footer.vue' //导入子组件Footer
//父组件中注册给共享后代组件的信息
provide(/* 注入名 */ 'mgs', /* 值 */ '父组件信息!')  
​ </script>
​
//子组件 Footer.vue--------------------------------------------------
<template>
    <DeepChild/>
</template>
<script setup> import DeepChild from './DeepChild.vue' //导入子组件Footer
//在子组件Footer中可以不需要接收父组件Root共享的数据,在后代组件中,直接接收,实现跨级传递 </script>
​
//子孙组件DeepChild.vue---------------------------------------------------
<template>
    <div>
        {{ msg }}
    </div>
</template>
<script setup> import { inject } from 'vue'
const msg = inject('msg') //跨级接收祖先组件的共享的信息
console.log(msg) //父组件信息 </script> 

通过provide/inject依赖注,父组件与后代组件无论嵌套多深,仅在需要的地方进行依赖注入即可在子孙组件中拿到父组件传递过来的信息,避免了props逐级透传的麻烦且不优雅的方式;

3.扩展-组件通讯的多种形式:

方式Vue2Vue3
父传子propsprops
父传子provide/injectprovide/inject
父传子$attrsattrs
父组件访问子组件$children
父组件访问子组件$refexpose&ref
子传父$emitemits
子传父$listeners无(合并到 attrs方式)
子组件访问父组件$parent
兄弟传值EventBusmitt

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值