1.provide和inject相较于父子传递的不同在于provide,inject可以用于跨层级通信(通俗易懂的讲就是可以实现爷孙之间的直接信息传递)。
1.跨层级传递数据
1.在顶层组件通过provide函数提供数据
2.底层组件通过inject函数获取数据
演示一:跨层传递普通数据。
效果图:
演示二:跨层传递动态数据。
效果图:
3.最后附上源代码:
爷爷组件App.vue
javascript
<script setup>
import Father from './components/Father.vue';
import { provide ,ref} from 'vue';
//传递普通数据
provide('HairColor','black')
//传递相应式数据
const count=ref(100)
provide('count',count)
//跨层级传递函数
provide('changeCount',(SonInfo)=>{
count.value--
console.log(SonInfo)
})
</script>
<template>
<div>
<h1>这个是爷爷</h1>
<father></father>
</div>
</template>
<style lang="scss" scoped>
</style>
父亲组件Father.vue
javascript
<script setup>
import Son from './Son.vue';
</script>
<template>
<div>
<h2>这里是爸爸</h2>
<Son></Son>
</div>
</template>
<style lang="scss" scoped>
</style>
孙子组件Son.vue
javascript
<script setup>
import { inject } from 'vue';
const HairColor=inject('HairColor')
//
const count=inject('count')
const ChangeCount=inject('changeCount')
const clickFn=()=>{
ChangeCount('传给父亲的数据')
}
</script>
<template>
<div>
<h3>这里是儿子---爷爷头发的颜色---{{HairColor}} 年龄为:{{count}}岁</h3>
<button @click="clickFn">年龄减一</button>
</div>
</template>
<style lang="scss" scoped>
</style>