1、先上个图:
2、我们在App.vue下面声明了一个provide,然后子与子的子,就可以利用inject来接收这个值。
代码结构:
父的代码:App.vue
<script setup lang="ts">
import { provide, ref } from "vue";
import HelloWorld from "./components/HelloWorld.vue";
// 提供响应式的值
const count = ref(0);
provide("count", count);
</script>
<template>
<div>
<!-- <a href="https://vitejs.dev" target="_blank">
<img src="/vite.svg" class="logo" alt="Vite logo" />
</a>
<a href="https://vuejs.org/" target="_blank">
<img src="./assets/vue.svg" class="logo vue" alt="Vue logo" />
</a> -->
<el-button type="primary" @click="count++">Primary</el-button>
<HelloWorld msg="Vite + Vue" />
</div>
</template>
<style scoped>
.logo {
height: 6em;
padding: 1.5em;
will-change: filter;
transition: filter 300ms;
}
.logo:hover {
filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.vue:hover {
filter: drop-shadow(0 0 2em #42b883aa);
}
</style>
子的代码:HelloWorld.vue
子的子代码:
<script setup lang="ts">
import { inject } from "vue";
// 注入响应式的值
const count = inject("count");
</script>
<template>
<h3 class="custom-html">sub- {{ count }}</h3>
</template>
<style scoped>
.read-the-docs {
color: #888;
}
.custom-html {
background-color: #ff0;
border: 1px solid #0000ff;
padding: 10px;
color: #000;
}
</style>
说明:子与子的子代码可以类似就行,子的代码比较多,因为之前做了一个x6的demo。
3、最终的效果:
4、最后我们总结一下:
provide(父) + inject(子、子的子...),只要是父中定义了,那么不同你有多少层,只要inject的了,都会很轻松的显示出来。
这个对于多层嵌套的时候,传值还是比较方便的。
5、官网地址:
https://cn.vuejs.org/api/composition-api-dependency-injection.html#inject