Options: Composición
provide
Proporciona valores que pueden ser inyectados por componentes descendientes.
Tipo
tsinterface ComponentOptions { provide?: object | ((this: ComponentPublicInstance) => object) }Detalles
provideyinjectse utilizan juntos para permitir que un componente ancestro sirva como inyector de dependencias para todos sus descendientes, sin importar la profundidad de la jerarquía de componentes, siempre que estén en la misma cadena de padres.La opción
providedebe ser un objeto o una función que devuelva un objeto. Este objeto contiene las propiedades que están disponibles para ser inyectadas en sus descendientes. Puedes usar Symbols como claves en este objeto.Ejemplo
Uso básico:
jsconst s = Symbol() export default { provide: { foo: 'foo', [s]: 'bar' } }Usando una función para proporcionar estado por componente:
jsexport default { data() { return { msg: 'foo' } } provide() { return { msg: this.msg } } }Ten en cuenta que en el ejemplo anterior, el
msgproporcionado NO será reactivo. Consulta Trabajar con Reactividad para más detalles.Consulta también Provide / Inject
inject
Declara propiedades para inyectar en el componente actual, localizándolas desde los proveedores ancestros.
Tipo
tsinterface ComponentOptions { inject?: ArrayInjectOptions | ObjectInjectOptions } type ArrayInjectOptions = string[] type ObjectInjectOptions = { [key: string | symbol]: | string | symbol | { from?: string | symbol; default?: any } }Detalles
La opción
injectdebe ser:- Un array de cadenas, o
- Un objeto donde las claves son el nombre de la vinculación local y el valor es:
- La clave (cadena o Symbol) a buscar en las inyecciones disponibles, o
- Un objeto donde:
- La propiedad
fromes la clave (cadena o Symbol) a buscar en las inyecciones disponibles, y - La propiedad
defaultse utiliza como valor de respaldo. Similar a los valores predeterminados de lasprops, se necesita una función de fábrica para los tipos de objeto para evitar compartir valores entre múltiples instancias de componentes.
- La propiedad
Una propiedad inyectada será
undefinedsi no se proporcionó una propiedad coincidente ni un valor predeterminado.Ten en cuenta que las vinculaciones inyectadas NO son reactivas. Esto es intencional. Sin embargo, si el valor inyectado es un objeto reactivo, las propiedades de ese objeto sí permanecen reactivas. Consulta Trabajar con Reactividad para más detalles.
Ejemplo
Uso básico:
jsexport default { inject: ['foo'], created() { console.log(this.foo) } }Usando un valor inyectado como valor predeterminado para una
prop:jsconst Child = { inject: ['foo'], props: { bar: { default() { return this.foo } } } }Usando un valor inyectado como entrada de datos:
jsconst Child = { inject: ['foo'], data() { return { bar: this.foo } } }Las inyecciones pueden ser opcionales con un valor predeterminado:
jsconst Child = { inject: { foo: { default: 'foo' } } }Si necesita ser inyectado desde una propiedad con un nombre diferente, usa
frompara denotar la propiedad de origen:jsconst Child = { inject: { foo: { from: 'bar', default: 'foo' } } }De forma similar a los valores predeterminados de las
prop, necesitas usar una función de fábrica para valores no primitivos:jsconst Child = { inject: { foo: { from: 'bar', default: () => [1, 2, 3] } } }Consulta también Provide / Inject
mixins
Un array de objetos de opciones para ser mezclados en el componente actual.
Tipo
tsinterface ComponentOptions { mixins?: ComponentOptions[] }Detalles
La opción
mixinsacepta un array de objetosmixin. Estos objetosmixinpueden contener opciones de instancia como los objetos de instancia normales, y se fusionarán con las opciones finales utilizando la lógica de fusión de opciones específica. Por ejemplo, si tumixincontiene unhookcreatedy el componente en sí también tiene uno, ambas funciones serán llamadas.Los
hooksdeMixinse llaman en el orden en que se proporcionan, y se llaman antes de loshookspropios del componente.Ya no recomendado
En Vue 2, los
mixinseran el mecanismo principal para crear bloques reutilizables de lógica de componente. Aunque losmixinssiguen siendo compatibles en Vue 3, las funciones Composable usando la Composition API son ahora el enfoque preferido para la reutilización de código entre componentes.Ejemplo
jsconst mixin = { created() { console.log(1) } } createApp({ created() { console.log(2) }, mixins: [mixin] }) // => 1 // => 2
extends
Un componente de "clase base" del que extender.
Tipo
tsinterface ComponentOptions { extends?: ComponentOptions }Detalles
Permite que un componente extienda a otro, heredando sus opciones de componente.
Desde la perspectiva de la implementación,
extendses casi idéntico amixins. El componente especificado porextendsserá tratado como si fuera el primermixin.Sin embargo,
extendsymixinsexpresan intenciones diferentes. La opciónmixinsse utiliza principalmente para componer fragmentos de funcionalidad, mientras queextendsse ocupa principalmente de la herencia.Al igual que con los
mixins, cualquier opción (exceptosetup()) se fusionará utilizando la estrategia de fusión relevante.Ejemplo
jsconst CompA = { ... } const CompB = { extends: CompA, ... }No recomendado para Composition API
extendsestá diseñado para la Options API y no maneja la fusión delhooksetup().En la Composition API, el modelo mental preferido para la reutilización de lógica es "componer" en lugar de "heredar". Si tienes lógica de un componente que necesita ser reutilizada en otro, considera extraer la lógica relevante en un Composable.
Si aún pretendes "extender" un componente usando la Composition API, puedes llamar al
setup()del componente base en elsetup()del componente que extiende:jsimport Base from './Base.js' export default { extends: Base, setup(props, ctx) { return { ...Base.setup(props, ctx) // local bindings } } }