• 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>

  • 相关阅读:
    在 Python 脚本中设置环境变量
    MyBatis使用注解操作及XML操作
    定时任务报警通知解决方案详解
    【云原生】Kubernetes入门详细讲解
    Linux驱动开发——块设备驱动
    FastApi项目搭建
    Automotive audio车载音频(2)-----Audio Focus音频焦点
    使用navicat模型功能 快速理清表间关系
    注册会计师怎么注册非执业?注会执业与非执业有何区别
    CentOS7 安装 kafka
  • 原文地址:https://blog.csdn.net/csl125/article/details/125023508