Vue3中依赖注入provide、inject的使用

 更新时间:2023年10月19日 09:38:07   作者:痴心阿文  
这篇文章主要介绍了Vue3中依赖注入provide、inject的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、Prop 逐级透传问题

vue中我们要从父组件向子组件传递数据时,会使用 props。

如果需要给深层子组件传递数据,会非常麻烦,

如下图:

provide 和 inject 可以帮助我们解决这一问题。

一个父组件相对于其所有的后代组件,会作为依赖提供者。

任何后代的组件树,无论层级有多深,都可以注入由父组件提供给整条链路的依赖。

二、Provide (提供)

要为组件后代提供数据,需要使用到 provide() 函数:

如果不使用 <script setup>,请确保 provide() 是在 setup() 同步调用的:

provide() 函数接收两个参数。第一个参数被称为注入名,可以是一个字符串或是一个 Symbol。

后代组件会用注入名来查找期望注入的值。

一个组件可以多次调用 provide(),使用不同的注入名,注入不同的依赖值。

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

提供的响应式状态使后代组件可以由此和提供者建立响应式的联系。

三、应用层 Provide

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

在应用级别提供的数据在该应用内的所有组件中都可以注入。

这在你编写插件时会特别有用,因为插件一般都不会使用组件形式来提供值。

四、Inject (注入)

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

如果提供的值是一个 ref,注入进来的会是该 ref 对象,而不会自动解包为其内部的值。

这使得注入方组件能够通过 ref 对象保持了和供给方的响应性链接。

同样的,如果没有使用 <script setup>,inject() 需要在 setup() 内同步调用:

五、注入默认值

默认情况下,inject 假设传入的注入名会被某个祖先链上的组件提供。

如果该注入名的确没有任何组件提供,则会抛出一个运行时警告。

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

在一些场景中,默认值可能需要通过调用一个函数或初始化一个类来取得。

为了避免在用不到默认值的情况下进行不必要的计算或产生副作用,我们可以使用工厂函数来创建默认值:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue实现移动端图片上传功能

    vue实现移动端图片上传功能

    这篇文章主要为大家详细介绍了vue实现移动端图片上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Vue组件之间数据共享浅析

    Vue组件之间数据共享浅析

    本文章向大家介绍vue组件中的数据共享,主要包括vue组件中的数据共享使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下
    2022-11-11
  • 详解Vue.js Class与Style绑定

    详解Vue.js Class与Style绑定

    这篇文章主要为大家介绍了Vue.js Class与Style绑定的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • ElementPlus表单rules校验的方法步骤

    ElementPlus表单rules校验的方法步骤

    相信大家经常都会遇到要处理表单验证的环节,而我在最近的项目中也遇到需要做表单验证的业务,下面这篇文章主要给大家介绍了关于ElementPlus表单rules校验的方法步骤,需要的朋友可以参考下
    2023-04-04
  • vue自动路由-单页面项目(非build时构建)

    vue自动路由-单页面项目(非build时构建)

    这篇文章主要介绍了vue自动路由-单页面项目(非build时构建),本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • vue常见路由跳转的几种方式小结

    vue常见路由跳转的几种方式小结

    本文主要介绍了常见路由跳转的几种方式,主要介绍了四种常见方式,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • vue实现购物车完整功能

    vue实现购物车完整功能

    这篇文章主要为大家详细介绍了vue实现购物车完整功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Vue $emit()不能触发父组件方法的原因及解决

    Vue $emit()不能触发父组件方法的原因及解决

    这篇文章主要介绍了Vue $emit()不能触发父组件方法的原因及解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • 使用Vue生成动态表单的示例代码

    使用Vue生成动态表单的示例代码

    这篇文章主要为大家详细介绍了如何使用Vue生成动态表单,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • Vue3使用vant检索组件van-search遇到的问题小结

    Vue3使用vant检索组件van-search遇到的问题小结

    当清空按钮与检索按钮同时居右时,点击clear清空按钮事件时会同时触发click-right-icon事件,这个时候容易触发一系列问题,小编小编给大家分享Vue3使用vant检索组件van-search遇到的问题小结,感兴趣的朋友一起看看吧
    2024-02-02

最新评论