组合式api-跨层级组件通信provide和inject
vue2的provide和inject:https://v2.cn.vuejs.org/v2/api/#provide-inject
主要作用:
跨层级传递数据(响应和非相应数据都可以)、方法(函数),顶层可以跨N层传递数据和方法给子孙组件调用。
使用provide和inject可以在不太复杂的场景下,不使用状态管理(vuex、pinia)来解决组件通信问题。
使用provide提供数据,inject接收数据
测试效果:
使用provide提供方法、函数
应用场景:
子组件即便拿到顶层组件的数据,也无法修改,此时就可以使用provide提供方法,将顶层组件的方法传递给任意底层组件,那么底层组件就可以调用顶层组件的方法,从而实现修改顶层组件中的数据。
顶层组件代码:
<script setup>
import SonA from "@/compon/SonA.vue";
import {provide, ref} from "vue";
const money = ref(100)
const money2 = ref(100)
const changeMoney = (newMoney) => {
money.value -= newMoney
}
// 1. 使用provide函数提供提供需要传递的数据
// 注意:provide可以传递普通数据(非响应式),也可以传递响应式数据,
// money是ref函数返回的响应式对象,money.value是其中值(非响应式)
// 当传递响应式对象时,顶层组件的数据改变,下层组件中inject的数据也会改变,否则相反。
provide('money', money)
provide('money2', money2.value) // 虽然money2是响应式数据,但是我传的时候是传.value(非相应),因此money2改变值后,下层的组件不会改变。
// 还可以传递方法
provide('changeMoney', changeMoney)
</script>
<template>
<div>
我是父组件
<SonA/>
</div>
</template>
son代码:
<script setup>
import GrandSon from "@/compon/GrandSon.vue";
import {inject} from "vue";
const money = inject('money');
</script>
<template>
<div class="SonA">
我是SonA, 爸爸的钱 {{ money }}
<GrandSon></GrandSon>
</div>
</template>
grandSon代码:
<script setup>
import {inject} from "vue";
const money = inject('money');
const money2 = inject('money2');
const changeMoney = inject('changeMoney');
</script>
<template>
<div class="grandSon">
我是孙子, 爷爷的钱: {{ money }}
<div>
我是孙子, 爷爷的钱2(非响应式数据): {{ money2 }}
</div>
<button @click="changeMoney(10)">花钱-10</button>
</div>
</template>
测试效果:
本文来自博客园,作者:蕝戀,转载请注明原文链接:https://www.cnblogs.com/juelian/p/17624858.html