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

  • 相关阅读:
    PDF怎么转换成PPT
    【JavaScript 逆向】极验三代滑块验证码逆向分析
    《MongoDB入门教程》第18篇 文档更新之$unset操作符
    一篇文章讲清楚 MySQL 的聚簇 / 联合 / 覆盖索引、回表、索引下推
    c语言刷题(第8周)
    mysql中的各种日志文件redo log、undo log和binlog
    来了,来了~GSEA官网更新,Mouse基因集终于有了“官方认证”
    【B+树索引】索引的使用和注意事项
    python之if else语句介绍
    冒泡排序 和 选择排序
  • 原文地址:https://blog.csdn.net/csl125/article/details/125023508