Opciones: Composición
provide
Proporcionar valores que puedan ser inyectados por los componentes descendientes.
Tipo
tsinterface ComponentOptions { provide?: object | ((this: ComponentPublicInstance) => object) }
Detalles
provide
yinject
se utilizan conjuntamente para permitir que un componente ancestral sirva como inyector de dependencias para todos sus descendientes, independientemente de la profundidad de la jerarquía de componentes, siempre que estén en la misma cadena padre.La opción
provide
debe 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 utilizar símbolos como claves en este objeto.Ejemplo
Uso básico:
jsconst s = Symbol() export default { provide: { foo: 'foo', [s]: 'bar' } }
Utilizar una función para proporcionar el estado por componente:
jsexport default { data() { return { msg: 'foo' } } provide() { return { msg: this.msg } } }
Tenga en cuenta que en el ejemplo anterior, el
msg
proporcionado NO será reactivo. Consulte Trabajando con Reactividad para más detalles.Véase también Provide / Inject
inject
Declara propiedades para inyectar en el componente actual localizándolas desde los proveedores ancestrales.
Tipo
tsinterface ComponentOptions { inject?: ArrayInjectOptions | ObjectInjectOptions } Tipo ArrayInjectOptions = string[] Tipo ObjectInjectOptions = { [key: string | symbol]: | string | symbol | { from?: string | symbol; default?: any } }
Details
La opción
inject
debe ser:- Una matriz de cadenas, o
- Un objeto en el que las claves son el nombre del enlace local y el valor es:
- La clave (cadena o símbolo) a buscar en las inyecciones disponibles, o
- Un objeto donde:
- La propiedad
from
es la clave (cadena o símbolo) a buscar en las inyecciones disponibles, y - La propiedad
default
se utiliza como valor de reserva. De forma similar a los valores por defecto de los props, se necesita una función de fábrica para los tipos de objetos para evitar que se compartan los valores entre múltiples instancias de componentes.
- La propiedad
Una propiedad inyectada será
undefined
si no se ha proporcionado ni una propiedad coincidente ni un valor por defecto.Tenga en cuenta que los enlaces inyectados NO son reactivos. Esto es intencionado. Sin embargo, si el valor inyectado es un objeto reactivo, las propiedades de ese objeto siguen siendo reactivas. Para más detalles, consulte Trabajando con Reactividad.
Ejemplo
Uso básico:
jsexport default { inject: ['foo'], created() { console.log(this.foo) } }
Usando un valor inyectado como valor por defecto para una proposición:
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 valor por defecto:
jsconst Child = { inject: { foo: { default: 'foo' } } }
Si debe inyectarse desde una propiedad con un nombre diferente, utilice
from
para indicar la propiedad de origen:jsconst Child = { inject: { foo: { from: 'bar', default: 'foo' } } }
Similar a las propiedades (props) predeterminadas, es necesario utilizar una función de fábrica para los valores no primitivos:
jsconst Child = { inject: { foo: { from: 'bar', default: () => [1, 2, 3] } } }
Véase también Provide / Inject
mixins
Una matriz de objetos de opción que se mezclan en el componente actual.
Tipo
tsinterface ComponentOptions { mixins?: ComponentOptions[] }
Detalles
La opción
mixins
acepta un array de objetos mixin. Estos objetos mixin pueden contener opciones de instancia como los objetos de instancia normales, y se fusionarán con las opciones eventuales utilizando la lógica de fusión de opciones determinada. Por ejemplo, si tu mixin contiene un método llamadocreated
y el propio componente también tiene uno, ambas funciones serán llamadas.Los hooks del mixin se llaman en el orden en que se proporcionan, y se llaman antes que los hooks propios del componente.
Ya no se recomienda
En Vue 2, los mixins eran el mecanismo principal para crear fragmentos reutilizables de lógica de componentes. Aunque los mixins siguen siendo compatibles en Vue 3, los composables mediante 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" para extender.
Tipo:
tsinterface ComponentOptions { extends?: ComponentOptions }
Detalles
Permite que un componente extienda a otro, heredando sus opciones de componentes.
Desde el punto de vista de la implementación,
extends
es casi idéntico amixins
. El componente especificado porextends
será tratado como si fuera el primer mixin.Sin embargo,
extends
ymixins
expresan intenciones diferentes. La opciónmixins
se utiliza principalmente para componer trozos de funcionalidad, mientras queextends
se ocupa principalmente de la herencia.Al igual que con
mixins
, cualquier opción (exceptosetup()
) se fusionará utilizando la estrategia de fusión correspondiente.Ejemplo
jsconst CompA = { ... } const CompB = { extends: CompA, ... }
No recomendado para la Composition API
extends
está diseñado para la Options API y no maneja la fusión del hook setup()
.
En la Composition API, el modelo mental preferido para la reutilización de lógica es "componer" en lugar de "heredar". Si tiene lógica de un componente que debe reutilizarse en otro, considera extraer la lógica relevante en un Composable.
Si aún tienes la intención de "extender" un componente utilizando la Composition API, puede llamar al setup()
del componente base en el setup()
del componente que lo extiende:
js
import Base from './Base.js'
export default {
extends: Base,
setup(props, ctx) {
return {
...Base.setup(props, ctx)
// enlaces locales
}
}
}