vue3- provide和inject

依赖注入的优势

在我们平时写项目中常常会建立很多的组件树,什么父子组件,爷孙组件都是很常见的,组件组件我们常常使用props来进行传值,但难免会遇到层级很深的传值,比如爷爷组件需要传值给孙子组件,就像下面这种情况

但是!!!实际上爸爸组件(图中的Footer组件)又不需要这个值,所以我感觉这样子传值会显得很捞,而且组件复用性变差。那我们有没有什么方式不经过爸爸组件,从而让孙子组件收到这个值?那么我们今天的主角就要登场了!!!

provide和inject 的使用

主要流程是使用provide先注册,在使用inject接收这个值

注册

provide函数接收两个值

1
2
key为字符串,其需要具有唯一性    value是需要传递的值,或者是变量,函数等
provide(key,value)

接收

inject使用唯一key获取相应的值

1
2
mes就是我接收过来的值,而第二个参数则是默认值,当没有相应的key注册时,mes是默认值
const mes=inject(key,default)

简单示例

爷爷组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<template>
<div style="width: 100%; height: 100%;" >
<h1>{{ mes }}</h1>
<button @click="addnum" >点击</button>
<father />
</div>
</template>
<script setup >
import father from './father.vue'
import {provide, ref} from "vue"
let mes=ref(0)
let addnum=()=>{
mes.value++
}
provide('mes',mes)
provide('num',addnum)
</script>

爸爸组件

1
2
3
4
5
6
7
8
<template>
<son />
</template>
<script setup >
import son from './son.vue'
</script>
<style>
</style>

孙子组件

1
2
3
4
5
6
7
8
9
<template>
<h1>{{ mes }}</h1>
<button @click="addnum" >点击</button>
</template>
<script setup >
import {inject} from "vue"
const mes=inject('mes',0)
const addnum=inject('num',()=>{})
</script>

爷爷组件传给孙子组件的mes数据是响应式的,爷爷组件中的mes改变孙子组件的值也随之改变

而在孙子组件中触发addnum相当于在爷爷组件中触发,所以爷爷组件的mes也可以被孙子改变


http://move-brain.github.io/super_zhu/2023/05/06/vue3- provide和inject/
作者
super_zhu
发布于
2023年5月6日
更新于
2023年5月7日
许可协议