vue3依赖注入

news/2024/10/30 9:22:51/

props逐级透传问题:父组件向子组件传递数据时用props;如果父组件要传递数据给孙子组件,那么需要父组件props传递给子组件,子组件再把props传递给孙子组件;这样沿着组件链传递下去,非常麻烦。

provide和inject可以解决这一问题:一个父组件相对于其所有的后代组件,会作为依赖提供者。任何后代的组件树,无论层级有多深,都可以注入由父组件提供给整条链路的依赖。

  • provide(提供)

    • <script setup>
      import { provide } from 'vue'provide(/* 注入名 */ 'message', /* 值 */ 'hello!')
      </script>
      
    • provide() 函数接收两个参数。

    • 第一个参数被称为注入名,可以是一个字符串或是一个 Symbol。后代组件会用注入名来查找期望注入的值。一个组件可以多次调用 provide(),使用不同的注入名,注入不同的依赖值。

    • 第二个参数是提供的值,值可以是任意类型,包括响应式的状态,比如一个 ref:

      • import { ref, provide } from 'vue'const count = ref(0)
        provide('key', count)
        
  • 应用层provide

    • 除了在一个组件中提供依赖,可以在整个应用层面提供依赖:

    • import { createApp } from 'vue'
      const app = createApp({})
      app.provide(/* 注入名 */ 'message', /* 值 */ 'hello!')
      
    • 在应用级别提供的数据在该应用内的所有组件中都可以注入。

  • Inject(注入)

    • 要注入上层组件提供的数据,需使用 inject() 函数:

    • <script setup>
      import { inject } from 'vue'const message = inject('message')
      </script>
      
    • 默认注入值

      • 如果在注入一个值时不要求必须有提供者,那么我们应该声明一个默认值

      • // 如果没有祖先组件提供 "message"
        // `value` 会是 "这是默认值"
        const value = inject('message', '这是默认值')
        
  • 和响应式数据配合使用

    • 当提供 / 注入响应式的数据时,建议尽可能将任何对响应式状态的变更都保持在供给方组件中。这样可以确保所提供状态的声明和变更操作都内聚在同一个组件内,使其更容易维护。

    • <!-- 在供给方组件内 -->
      <script setup>
      import { provide, ref } from 'vue'const location = ref('North Pole')function updateLocation() {location.value = 'South Pole'
      }provide('location', {location,updateLocation
      })
      </script>
      
    • <!-- 在注入方组件 --><template><button @click="updateLocation">{{ location }}</button>
      </template>
      <script setup>
      import { inject } from 'vue'const { location, updateLocation } = inject('location')
      </script>
      
    • 最后,如果你想确保提供的数据不能被注入方的组件更改,你可以使用 readonly() 来包装提供的值。

    • <script setup>
      import { ref, provide, readonly } from 'vue'const count = ref(0)
      provide('read-only-count', readonly(count))
      </script>
      
  • 使用Symbol作为注入名

    • 建议最好使用 Symbol 来作为注入名以避免潜在的冲突。

    • // keys.js
      export const myInjectionKey = Symbol()
      
    • // 在供给方组件中
      import { provide } from 'vue'
      import { myInjectionKey } from './keys.js'provide(myInjectionKey, { /*要提供的数据
      */ });
      
    • // 注入方组件
      import { inject } from 'vue'
      import { myInjectionKey } from './keys.js'const injected = inject(myInjectionKey)
      

http://www.ppmy.cn/news/84209.html

相关文章

关于宝塔部署jar包和war包

文章目录 前言一、jar包部署二、war包部署1.maven如果打包不了使用命令打包2.安装Tomcat进行访问是否成功2.进入Tomcat目录进行配置war包 一、项目访问方法 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、jar包部署 1.其实jar包没什么讲的&…

【问题记录】flask开发blog

文章目录 小知识点问题1. 文章标签显示错误2. 文章状态无法回显&#xff08;open)3. 用户管理页面&#xff0c;图标无法显示4. BuildError5. 用户管理添加用户&#xff0c;使用重复的用户名会报错(open)6. 添加用户&#xff0c;不上传头像会报错(open)7. 部分标签删除时报错&am…

水处理计算常用表格大全

第二章 设计方案城市污水处理厂的设计规模与进入处理厂的污水水质和水量有关&#xff0c;污水的水质和水量可以通过设计任务书的原始资料计算。2.1 厂址选择在污水处理厂设计中&#xff0c;选定厂址是一个重要的环节&#xff0c;处理广的位置对周围环境卫生、基建投资及运行管理…

当互联网的红利不再,更多人开始寻找新的发展方式和方法

当互联网的红利不再&#xff0c;玩家们开始寻找新的发展方式和方法。无论是头部的玩家&#xff0c;还是新入局的玩家&#xff0c;几乎都是如此。   在这个过程中&#xff0c;有人将目光聚焦在了新技术的身上&#xff0c;有人将目光聚焦在了新模式的身上&#xff0c;有人则是将…

Py06·爬虫

Py06爬虫 pyhon3爬虫filddler抓包工具robots.txt 文件Sitemap.xml 文件反爬虫爬虫测试 pyhon3爬虫 1.缺点&#xff1a;解释性语言&#xff1b;执行效率低 2.优点&#xff1a;网络接口简单医用&#xff1a;系统自带urllib&#xff0c;第三方requets都很简单数据解析容易&#x…

使用RSD从DEM数据创建用户高程数据层

李国春 SRTM90和Aster DEM的V2/V3是比较常用的免费共享高程数据。用户下载好以后应用到自己的项目时&#xff0c;经常会需要进行拼接合成和投影重采样等。RSD提供了一种创建自己项目的高程数据的方法。 一. 高程图像生成方法 在自己的项目中&#xff0c;选择图1的菜单。 图1…

项目压测相关

几个重要指标的关系 QPS 并发数/平均响应时间 并发数 QPS*平均响应时间 也就是说&#xff0c;并发连接数代表服务器抗压能力&#xff0c;接收连接的能力。qps代表在相同的并发数下&#xff0c;服务器处理的速度&#xff0c;响应时间越短&#xff0c;那么qps就越大。 不是说并发…

结构体总结

目录 1.普通结构体 2.定义结构体并同时建立变量 3.匿名结构体 4.typedef重命名 5.typedef省略结构体名字 6.结构体数组 7.结构体指针 8.结构体嵌套 9.结构体链表&#xff08;头插法&#xff09; 10.结构体中的函数指针 11.结构体的构造函数和初始化列表 1.普通结构体 stru…