选项: 组合
provide
提供可以被后代组件注入的值。
类型
tsinterface ComponentOptions { provide?: object | ((this: ComponentPublicInstance) => object) }
详情
provide
和inject
一起使用,允许父组件作为所有后代组件的依赖注入器,无论组件层级有多深,只要它们在同一个父链中。provide
选项应该是一个对象或一个返回对象的函数。这个对象包含可注入其子组件的属性。您可以使用Symbol作为对象的键。示例
基本用法
JavaScriptconst s = Symbol() export default { provide: { foo: 'foo', [s]: 'bar' } }
使用函数提供每个组件的状态
JavaScriptexport default { data() { return { msg: 'foo' } } provide() { return { msg: this.msg } } }
注意,在上面的示例中,提供的
msg
将不会是响应式的。有关更多详细信息,请参阅与响应式一起工作。另请参阅 提供/注入
注入
通过从祖先提供者定位声明要注入当前组件的属性。
类型
tsinterface ComponentOptions { inject?: ArrayInjectOptions | ObjectInjectOptions } type ArrayInjectOptions = string[] type ObjectInjectOptions = { [key: string | symbol]: | string | symbol | { from?: string | symbol; default?: any } }
详情
inject
选项可以是:- 一个字符串数组,或者
- 一个对象,其中键是本地绑定名称,值可以是:
- 在可用注入中搜索的键(字符串或Symbol),或者
- 一个对象,其中
from
属性是在可用注入中搜索的键(字符串或Symbol),default
属性用作后备值。与props默认值类似,对于对象类型需要工厂函数以避免多个组件实例之间的值共享。
如果未提供匹配的属性或默认值,则注入属性将为
undefined
。请注意,注入绑定不是响应式的。这是故意的。但是,如果注入的值是响应式对象,该对象上的属性仍然保持响应式。有关更多详细信息,请参阅与响应式一起工作。
示例
基本用法
JavaScriptexport default { inject: ['foo'], created() { console.log(this.foo) } }
将注入值用作prop的默认值
JavaScriptconst Child = { inject: ['foo'], props: { bar: { default() { return this.foo } } } }
将注入值用作数据条目
JavaScriptconst Child = { inject: ['foo'], data() { return { bar: this.foo } } }
注入可以具有默认值的可选
JavaScriptconst Child = { inject: { foo: { default: 'foo' } } }
如果需要从一个具有不同名称的属性中注入,请使用
from
来表示源属性JavaScriptconst Child = { inject: { foo: { from: 'bar', default: 'foo' } } }
与非原始值类似,您需要为非原始值使用工厂函数
JavaScriptconst Child = { inject: { foo: { from: 'bar', default: () => [1, 2, 3] } } }
另请参阅 提供/注入
混入
要混合到当前组件中的选项对象数组。
类型
tsinterface ComponentOptions { mixins?: ComponentOptions[] }
详情
mixins
选项接受一个混合对象数组。这些混合对象可以包含实例选项,就像正常的实例对象一样,它们将使用某些选项合并逻辑与最终选项合并。例如,如果您的混合包含一个created
钩子,而组件本身也有一个,那么这两个函数都会被调用。混合钩子按提供的顺序调用,并在组件自己的钩子之前调用。
不再推荐
在Vue 2中,混入是创建可重用组件逻辑块的主要机制。虽然Vue 3中仍然支持混入,但现在首选的方法是使用组合式API的可组合函数来在组件之间重用代码。
示例
JavaScriptconst mixin = { created() { console.log(1) } } createApp({ created() { console.log(2) }, mixins: [mixin] }) // => 1 // => 2
扩展
要从其扩展的“基类”组件。
类型
tsinterface ComponentOptions { extends?: ComponentOptions }
详情
允许一个组件扩展另一个组件,继承其组件选项。
从实现的角度来看,
extends
几乎与mixins
相同。由extends
指定的组件将被视为第一个混合。但是,
extends
和mixins
表达了不同的意图。mixins
选项主要用于组合功能块,而extends
主要关注继承。与
mixins
一样,任何选项(除setup()
外)都将使用相关的合并策略进行合并。示例
JavaScriptconst CompA = { ... } const CompB = { extends: CompA, ... }
不推荐用于 Composition API
extends
是为 Options API 设计的,不能处理setup()
钩子的合并。在 Composition API 中,逻辑复用的首选思维模式是“组合”而非“继承”。如果你有一个需要在其他组件中复用的逻辑,考虑将其相关逻辑提取到 可组合(Composable) 中。
如果你仍然打算使用 Composition API “扩展”一个组件,你可以在扩展组件的
setup()
中调用基组件的setup()
JavaScriptimport Base from './Base.js' export default { extends: Base, setup(props, ctx) { return { ...Base.setup(props, ctx), // local bindings } } }