Vue 3.x 依赖注入

发布于 2024-08-16 08:34:06 字数 2365 浏览 7 评论 0

provide()

提供一个值,可以被后代组件注入。

function provide<T>(key: InjectionKey<T> | string, value: T): void
  • 参数一:是要注入的 key,可以是一个字符串或者一个 symbol
  • 参数二:要注入的值

与注册生命周期钩子的 API 类似, provide() 必须在组件的 setup() 阶段同步调用

<script setup>
import { ref, provide } from 'vue'
//import { fooSymbol } from './injectionSymbols'
import type { InjectionKey } from 'vue'
const fooSymbol = Symbol() as InjectionKey<string>

// 1.提供静态值
provide('foo', 'bar')

// 2.提供响应式的值
const count = ref(0)
provide('count', count)

// 3.提供时将 Symbol 作为 key
provide(fooSymbol, count)
  
// 4.如果你想确保提供的数据不能被注入方的组件更改,你可以使用 readonly() 来包装提供的值。
provide('read-only-count', readonly(count))
</script>

inject()

注入一个由祖先组件或整个应用 ( app.provide() ) 提供的值

// 没有默认值
function inject<T>(key: InjectionKey<T> | string): T | undefined

// 带有默认值
function inject<T>(key: InjectionKey<T> | string, defaultValue: T): T

// 使用工厂函数
function inject<T>(
  key: InjectionKey<T> | string,
  defaultValue: () => T,
  treatDefaultAsFactory: true
): T

参数一:注入的 key。Vue 会遍历父组件链,通过匹配 key 来确定所提供的值。如果父组件链上多个组件对同一个 key 提供了值,那么离得更近的组件将会“覆盖”链上更远的组件所提供的值。如果没有能通过 key 匹配到值, inject() 将返回 undefined ,除非提供了一个默认值。

参数二:在没有匹配到 key 时使用的默认值。它也可以是一个工厂函数,用来返回某些创建起来比较复杂的值。如果默认值本身就是一个函数,那么你必须将 false 作为第三个参数传入,表明这个函数就是默认值,而不是一个工厂函数。

与注册生命周期钩子的 API 类似, inject() 必须在组件的 setup() 阶段同步调用。

<script setup>
import { inject } from 'vue'
import { fooSymbol } from './injectionSymbols'

// 注入值的默认方式
const foo = inject('foo')

// 注入响应式的值
const count = inject('count')

// 通过 Symbol 类型的 key 注入
const foo2 = inject(fooSymbol)

// 注入一个值,若为空则使用提供的默认值
const bar = inject('foo', 'default value')

// 注入一个值,若为空则使用提供的工厂函数
const baz = inject('foo', () => new Map())

// 注入时为了表明提供的默认值是个函数,需要传入第三个参数
const fn = inject('function', () => {}, false)
</script>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

久而酒知

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

13886483628

文章 0 评论 0

流年已逝

文章 0 评论 0

℡寂寞咖啡

文章 0 评论 0

笑看君怀她人

文章 0 评论 0

wkeithbarry

文章 0 评论 0

素手挽清风

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文