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

  • 相关阅读:
    (王道考研计算机网络)第五章传输层-第三节1-3:TCP可靠传输
    Linux安装进程树状图显示工具pstree
    自研ORM 子查询&嵌套查询
    【ansible第三次作业】
    优维2个合作项目入选2022服贸会“企业数字化转型优秀案例”
    xindi-2022-08-23数据分析记录
    新日语(2)】第15課 張さんは部長に褒められました
    无法将类型为“Newtonsoft.Json.Linq.JObject”的对象转换为类型“Newtonsoft.Json.Linq.JArray”解决方法
    Mysql的in和exists用法区别
    商品标题 内容 向量特征提取
  • 原文地址:https://blog.csdn.net/csl125/article/details/125023508