Options: Estado
data
Una función que devuelve el estado reactivo inicial para la instancia del componente.
Tipo
tsinterface ComponentOptions { data?( this: ComponentPublicInstance, vm: ComponentPublicInstance ): object }Detalles
Se espera que la función devuelva un objeto JavaScript simple, que Vue hará reactivo. Una vez creada la instancia, se puede acceder al objeto de datos reactivo como
this.$data. La instancia del componente también hace proxy de todas las propiedades encontradas en el objetodata, por lo quethis.aserá equivalente athis.$data.a.Todas las propiedades de
datade nivel superior deben incluirse en el objeto de datos devuelto. Es posible añadir nuevas propiedades athis.$data, pero no se recomienda. Si el valor deseado de una propiedad aún no está disponible, se debe incluir un valor vacío comoundefinedonullcomo marcador de posición para asegurar que Vue sepa que la propiedad existe.Las propiedades que comienzan con
_o$no se harán proxy en la instancia del componente porque pueden entrar en conflicto con las propiedades internas y los métodos de la API de Vue. Tendrás que acceder a ellas comothis.$data._property.No se recomienda devolver objetos con su propio comportamiento con estado, como objetos de la API del navegador y propiedades de prototipo. El objeto devuelto debería ser idealmente un objeto simple que solo represente el estado del componente.
Ejemplo
jsexport default { data() { return { a: 1 } }, created() { console.log(this.a) // 1 console.log(this.$data) // { a: 1 } } }Ten en cuenta que si usas una función flecha con la propiedad
data,thisno será la instancia del componente, pero aún puedes acceder a la instancia como el primer argumento de la función:jsdata: (vm) => ({ a: vm.myProp })Ver también Reactividad en profundidad
props
Declara las props de un componente.
Tipo
tsinterface ComponentOptions { props?: ArrayPropsOptions | ObjectPropsOptions } type ArrayPropsOptions = string[] type ObjectPropsOptions = { [key: string]: Prop } type Prop<T = any> = PropOptions<T> | PropType<T> | null interface PropOptions<T> { type?: PropType<T> required?: boolean default?: T | ((rawProps: object) => T) validator?: (value: unknown, rawProps: object) => boolean } type PropType<T> = { new (): T } | { new (): T }[]Los tipos se simplifican para facilitar la lectura.
Detalles
En Vue, todas las
propsdel componente deben declararse explícitamente. Laspropsdel componente pueden declararse de dos formas:- Forma simple usando un array de cadenas de texto
- Forma completa usando un objeto donde cada clave de propiedad es el nombre de la
prop, y el valor es el tipo de laprop(una función constructora) o las opciones avanzadas.
Con la sintaxis basada en objetos, cada
proppuede definir además las siguientes opciones:type: Puede ser uno de los siguientes constructores nativos:String,Number,Boolean,Array,Object,Date,Function,Symbol, cualquier función constructora personalizada o un array de estos. En modo de desarrollo, Vue comprobará si el valor de unapropcoincide con el tipo declarado y lanzará una advertencia si no es así. Consulta Validación depropspara más detalles.Ten en cuenta también que una
propcon tipoBooleanafecta a su comportamiento de conversión de valor tanto en desarrollo como en producción. Consulta Conversión aBooleanpara más detalles.default: Especifica un valor por defecto para lapropcuando no es pasada por el padre o tiene un valorundefined. Los valores por defecto de tipo objeto o array deben devolverse usando una función fábrica. La función fábrica también recibe el objetopropsoriginal como argumento.required: Define si lapropes requerida. En un entorno que no sea de producción, se lanzará una advertencia en la consola si este valor es verdadero y lapropno se pasa.validator: Función validadora personalizada que toma el valor de lapropy el objetopropscomo argumentos. En modo de desarrollo, se lanzará una advertencia en la consola si esta función devuelve un valor falsy (es decir, la validación falla).
Ejemplo
Declaración simple:
jsexport default { props: ['size', 'myMessage'] }Declaración de objeto con validaciones:
jsexport default { props: { // comprobación de tipo height: Number, // comprobación de tipo más otras validaciones age: { type: Number, default: 0, required: true, validator: (value) => { return value >= 0 } } } }Ver también
computed
Declara propiedades computed que se expondrán en la instancia del componente.
Tipo
tsinterface ComponentOptions { computed?: { [key: string]: ComputedGetter<any> | WritableComputedOptions<any> } } type ComputedGetter<T> = ( this: ComponentPublicInstance, vm: ComponentPublicInstance ) => T type ComputedSetter<T> = ( this: ComponentPublicInstance, value: T ) => void type WritableComputedOptions<T> = { get: ComputedGetter<T> set: ComputedSetter<T> }Detalles
La opción acepta un objeto donde la clave es el nombre de la propiedad
computed, y el valor es ungettercomputed, o un objeto con métodosgetyset(para propiedadescomputedescribibles).Todos los
gettersysetterstienen su contextothisautomáticamente vinculado a la instancia del componente.Ten en cuenta que si usas una función flecha con una propiedad
computed,thisno apuntará a la instancia del componente, pero aún puedes acceder a la instancia como el primer argumento de la función:jsexport default { computed: { aDouble: (vm) => vm.a * 2 } }Ejemplo
jsexport default { data() { return { a: 1 } }, computed: { // solo lectura aDouble() { return this.a * 2 }, // escribible aPlus: { get() { return this.a + 1 }, set(v) { this.a = v - 1 } } }, created() { console.log(this.aDouble) // => 2 console.log(this.aPlus) // => 2 this.aPlus = 3 console.log(this.a) // => 2 console.log(this.aDouble) // => 4 } }Ver también
methods
Declara los methods que se mezclarán en la instancia del componente.
Tipo
tsinterface ComponentOptions { methods?: { [key: string]: (this: ComponentPublicInstance, ...args: any[]) => any } }Detalles
Los
methodsdeclarados pueden ser accedidos directamente en la instancia del componente, o usados en expresiones de template. Todos losmethodstienen su contextothisautomáticamente vinculado a la instancia del componente, incluso cuando se pasan.Evita usar funciones flecha al declarar
methods, ya que no tendrán acceso a la instancia del componente a través dethis.Ejemplo
jsexport default { data() { return { a: 1 } }, methods: { plus() { this.a++ } }, created() { this.plus() console.log(this.a) // => 2 } }Ver también Manejo de Eventos
watch
Declara las callbacks de watch que se invocarán al cambiar los datos.
Tipo
tsinterface ComponentOptions { watch?: { [key: string]: WatchOptionItem | WatchOptionItem[] } } type WatchOptionItem = string | WatchCallback | ObjectWatchOptionItem type WatchCallback<T> = ( value: T, oldValue: T, onCleanup: (cleanupFn: () => void) => void ) => void type ObjectWatchOptionItem = { handler: WatchCallback | string immediate?: boolean // default: false deep?: boolean // default: false flush?: 'pre' | 'post' | 'sync' // default: 'pre' onTrack?: (event: DebuggerEvent) => void onTrigger?: (event: DebuggerEvent) => void }Los tipos se simplifican para facilitar la lectura.
Detalles
La opción
watchespera un objeto donde las claves son las propiedades reactivas de la instancia del componente a observar (por ejemplo, propiedades declaradas a través dedataocomputed) — y los valores son lascallbackscorrespondientes. Lacallbackrecibe el nuevo valor y el valor antiguo de la fuente observada.Además de una propiedad de nivel raíz, la clave también puede ser una ruta simple delimitada por puntos, por ejemplo,
a.b.c. Ten en cuenta que este uso no soporta expresiones complejas; solo se admiten rutas delimitadas por puntos. Si necesitas observar fuentes de datos complejas, usa la API imperativa$watch()en su lugar.El valor también puede ser una cadena de texto con el nombre de un método (declarado a través de
methods), o un objeto que contenga opciones adicionales. Cuando se usa la sintaxis de objeto, lacallbackdebe declararse bajo el campohandler. Las opciones adicionales incluyen:immediate: dispara lacallbackinmediatamente al crear elwatcher. El valor antiguo seráundefineden la primera llamada.deep: fuerza el recorrido profundo de la fuente si es un objeto o un array, para que lacallbackse dispare en mutaciones profundas. Consulta Watchers Profundos.flush: ajusta el momento de vaciado de lacallback. Consulta Momento de Vaciado de la Callback ywatchEffect().onTrack / onTrigger: depura las dependencias delwatcher. Consulta Depuración de Watchers.
Evita usar funciones flecha al declarar
callbacksdewatch, ya que no tendrán acceso a la instancia del componente a través dethis.Ejemplo
jsexport default { data() { return { a: 1, b: 2, c: { d: 4 }, e: 5, f: 6 } }, watch: { // observando propiedad de nivel superior a(val, oldVal) { console.log(`new: ${val}, old: ${oldVal}`) }, // nombre de método en cadena de texto b: 'someMethod', // la callback se llamará cada vez que cambie alguna de las propiedades del objeto observado, independientemente de su profundidad anidada c: { handler(val, oldVal) { console.log('c changed') }, deep: true }, // observando una sola propiedad anidada: 'c.d': function (val, oldVal) { // do something }, // la callback se llamará inmediatamente después del inicio de la observación e: { handler(val, oldVal) { console.log('e changed') }, immediate: true }, // puedes pasar un array de callbacks, se llamarán una por una f: [ 'handle1', function handle2(val, oldVal) { console.log('handle2 triggered') }, { handler: function handle3(val, oldVal) { console.log('handle3 triggered') } /* ... */ } ] }, methods: { someMethod() { console.log('b changed') }, handle1() { console.log('handle 1 triggered') } }, created() { this.a = 3 // => new: 3, old: 1 } }Ver también Watchers
emits
Declara los eventos personalizados emitidos por el componente.
Tipo
tsinterface ComponentOptions { emits?: ArrayEmitsOptions | ObjectEmitsOptions } type ArrayEmitsOptions = string[] type ObjectEmitsOptions = { [key: string]: EmitValidator | null } type EmitValidator = (...args: unknown[]) => booleanDetalles
Los eventos emitidos pueden declararse de dos formas:
- Forma simple usando un array de cadenas de texto
- Forma completa usando un objeto donde cada clave de propiedad es el nombre del evento, y el valor es
nullo una función validadora.
La función de validación recibirá los argumentos adicionales pasados a la llamada
$emitdel componente. Por ejemplo, si se llama athis.$emit('foo', 1), el validador correspondiente parafoorecibirá el argumento1. La función validadora debe devolver un booleano para indicar si los argumentos del evento son válidos.Ten en cuenta que la opción
emitsafecta a quéevent listenersse consideranevent listenersdel componente, en lugar deevent listenersnativos del DOM. Loslistenerspara eventos declarados se eliminarán del objeto$attrsdel componente, por lo que no se pasarán al elemento raíz del componente. Consulta AtributosFallthroughpara más detalles.Ejemplo
Sintaxis de array:
jsexport default { emits: ['check'], created() { this.$emit('check') } }Sintaxis de objeto:
jsexport default { emits: { // sin validación click: null, // con validación submit: (payload) => { if (payload.email && payload.password) { return true } else { console.warn(`Invalid submit event payload!`) return false } } } }Ver también
expose
Declara las propiedades públicas expuestas cuando se accede a la instancia del componente por un padre a través de template refs.
Tipo
tsinterface ComponentOptions { expose?: string[] }Detalles
Por defecto, una instancia de componente expone todas las propiedades de instancia al padre cuando se accede a través de
$parent,$root, otemplate refs. Esto puede ser indeseable, ya que un componente muy probablemente tiene estado interno o métodos que deberían mantenerse privados para evitar un acoplamiento estrecho.La opción
exposeespera una lista de cadenas de texto con nombres de propiedades. Cuando se usaexpose, solo las propiedades explícitamente listadas se expondrán en la instancia pública del componente.exposesolo afecta a las propiedades definidas por el usuario; no filtra las propiedades de instancia de componente incorporadas.Ejemplo
jsexport default { // solo `publicMethod` estará disponible en la instancia pública expose: ['publicMethod'], methods: { publicMethod() { // ... }, privateMethod() { // ... } } }