• vue3 + vite + ts + setup , 第五练 依赖注入(provide/inject)的使用


    Provide / Inject

    通常,当我们需要从父组件向子组件传递数据时,我们使用 props。想象一下这样的结构:有一些深度嵌套的组件,而深层的子组件只需要父组件的部分内容。在这种情况下,如果仍然将 prop 沿着组件链逐级传递下去,可能会很麻烦

    我们使用provide 、 inject可以在祖先组件中指定提供给后代的数据或方法

    例如:创建三个组件 A.vue B.vue C.vue

    A  B  C 互相引用

    A.vue组件

    1. <template>
    2. <div class="a-div">
    3. <h1>我是AAA组件</h1>
    4. <h5 style="color: #fff;">{{ tname }}</h5>
    5. <B />
    6. </div>
    7. </template>
    8. <script setup lang="ts">
    9. import { provide } from "vue";
    10. import B from "./B.vue";
    11. let tname = '我是你爸爸'
    12. let name = provide('name', tname)
    13. </script>
    14. <style scoped>
    15. .a-div {
    16. width: 600px;
    17. height: 600px;
    18. background-color: red;
    19. }
    20. </style>

    B.vue组件

    1. <template>
    2. <div class="b-div">
    3. <h1>我是BBBBB组件</h1>
    4. <h5 style="color: #fff;">{{ name }}</h5>
    5. <C />
    6. </div>
    7. </template>
    8. <script setup lang="ts">
    9. import { inject } from "vue";
    10. import C from "./C.vue";
    11. let name = inject('name')
    12. </script>
    13. <style scoped>
    14. .b-div {
    15. width: 500px;
    16. height: 500px;
    17. background-color: green;
    18. }
    19. </style>

    C.vue组件

    1. <template>
    2. <div class="c-div">
    3. <h1>我是CCC组件</h1>
    4. <h5 style="color: #fff;">{{ name }}</h5>
    5. </div>
    6. </template>
    7. <script setup lang="ts">
    8. import C from "./C.vue";
    9. import { inject } from "vue";
    10. let name = inject('name')
    11. </script>
    12. <style scoped>
    13. .c-div {
    14. width: 400px;
    15. height: 400px;
    16. background-color: blue;
    17. }
    18. </style>

    效果:

    我们可以看到在A组件注入的数据  在其子代组件中都可以使用

    如上因为是传递普通的值 是不具有响应式的,如何需要响应的需要通过ref reactive 添加响应式

    添加响应后的provide/inject 

    A.vue

    1. <template>
    2. <div class="a-div">
    3. <h1>我是AAA组件</h1>
    4. <h5 style="color: #fff;">{{ tname }}</h5>
    5. <B />
    6. </div>
    7. </template>
    8. <script setup lang="ts">
    9. import { provide, ref } from "vue";
    10. import B from "./B.vue";
    11. let tname = ref('我是你爸爸')
    12. let name = provide('name', tname)
    13. </script>
    14. <style scoped>
    15. .a-div {
    16. width: 600px;
    17. height: 600px;
    18. background-color: red;
    19. }
    20. </style>

    B.vue

    1. <template>
    2. <div class="b-div">
    3. <h1>我是BBBBB组件</h1>
    4. <h5 style="color: #fff;">{{ name }}</h5>
    5. <button @click="changeName">改变</button>
    6. <C />
    7. </div>
    8. </template>
    9. <script setup lang="ts">
    10. import { inject, Ref, ref } from "vue";
    11. import C from "./C.vue";
    12. let name = inject<Ref<string>>('name', ref('我是C默认值'))
    13. let changeName = () => {
    14. name.value = "改变name---BBBB"
    15. }
    16. </script>
    17. <style scoped>
    18. .b-div {
    19. width: 500px;
    20. height: 500px;
    21. background-color: green;
    22. }
    23. </style>

     C.vue

    1. <template>
    2. <div class="c-div">
    3. <h1>我是CCC组件</h1>
    4. <h5 style="color: #fff;">{{ name }}</h5>
    5. <button @click="changeName">change name</button>
    6. </div>
    7. </template>
    8. <script setup lang="ts">
    9. import C from "./C.vue";
    10. import { inject, Ref, ref } from "vue";
    11. let name = inject<Ref<string>>('name', ref('我是C默认值'))
    12. let changeName = () => {
    13. name.value = "改变name---C"
    14. }
    15. </script>
    16. <style scoped>
    17. .c-div {
    18. width: 400px;
    19. height: 400px;
    20. background-color: blue;
    21. }
    22. </style>

    默认效果:

     点击修改

     

     总结:

    Provide (供给):父组件(祖先)供给,为组件后代供给数据

    1. <script setup lang="ts">
    2. import { provide, ref } from "vue";
    3. let tname = ref('参数')
    4. let name = provide('name', tname)
    5. </script>

    Inject (注入):注入祖先组件供给的数据

    1. <script setup lang="ts">
    2. import { inject, Ref, ref } from "vue";
    3. let name = inject<Ref<string>>('name', ref('我是C默认值'))
    4. let changeName = () => {
    5. name.value = "改变name---BBBB"
    6. }
    7. </script>

  • 相关阅读:
    摆动序列【贪心4】
    我们写的代码是如何一步步变成可执行程序(.EXE)的?
    会声会影2024(Corel VideoStudio)正式版安装下载步骤教程
    微信小程序----父子组件之间通信
    java 上机练习题
    JAVA 集合框架(二) List集合详解和常用方法
    在linux上做移动开发必须知道这五个
    FTP服务器操作手册
    云计算及虚拟化教程
    Spring必背面试题
  • 原文地址:https://blog.csdn.net/csl125/article/details/125023508