# Métodos de Instancias
# $watch
Argumentos:
{string | Function} source
{Function | Object} callback
{Object} options (opcional)
{boolean} deep
{boolean} immediate
{string} flush
Retorna:
{Function} unwatch
Uso:
Observar los cambios de una propiedad reactiva o una función computada en la instancia de componente. El callback será llamado con el valor nuevo y viejo para la propiedad dada. Podemos solo pasar nombres de las propiedades de nivel superior
data
,props
, ocomputed
como una cadena de caracteres. Para más expresiones complejas o propiedades anidadas, utilice una función en su lugar.Ejemplo:
const app = createApp({ data() { return { a: 1, b: 2, c: { d: 3, e: 4 } } }, created() { // nombre de una propiedad de nivel superior this.$watch('a', (newVal, oldVal) => { // hacer algo }) // función para observar una sola propiedad anidada this.$watch( () => this.c.d, (newVal, oldVal) => { // hacer algo } ) // función para observar una expresion compleja this.$watch( // cada vez la expresión `this.a + this.b` produce un resulto diferente, // el manejador será llamado. Es como si estuviéramos observando una propiedad // computada sin definir la propiedad computada mísma () => this.a + this.b, (newVal, oldVal) => { // hacer algo } ) } })
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37Cuando el valor observado es un objeto o matriz, cualquieres cambios a sus propiedades o elementos no dispararán el observador porque se refieren al mismo objeto/matriz:
const app = createApp({ data() { return { article: { text: '¡Vue es genial!' }, comments: ['¡De verdad!', 'Estoy de acuerdo'] } }, created() { this.$watch('article', () => { console.log('El artículo ha cambiado!') }) this.$watch('comments', () => { console.log('Los comentarios han cambiado!') }) }, methods: { // Estos métodos no dispararán un observador porque cambiamos solo una propiedad del objeto/matriz, // en vez de sí mísmo changeArticleText() { this.article.text = 'Vue 3 es genial' }, addComment() { this.comments.push('Nuevo comentario') }, // Estos métodos dispararán un observador porque reemplazamos el objeto/matriz completamente changeWholeArticle() { this.article = { text: 'Vue 3 es genial' } }, clearComments() { this.comments = [] } } })
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38$watch
retorna una función de quitar observación (unwatch) que deje disparar el callback:const app = createApp({ data() { return { a: 1 } } }) const vm = app.mount('#app') const unwatch = vm.$watch('a', cb) // luego, derrumba el observador unwatch()
1
2
3
4
5
6
7
8
9
10
11
12
13Opción: deep
Para también detectar cambios de valores anidados dentro de objetos, necesita pasar
deep: true
en el argumento de opciones. Esta opción también puede ser utilizada para observar mutaciones de matriz.Note que cuando mute (en vez de reemplace) un objeto o matriz y observe con la opción deep, el valor viejo será igual como el valor nuevo porque se refieren al mismo objeto/matriz. Vue no posee una copia del valor antes de que se mute.
vm.$watch('someObject', callback, { deep: true }) vm.someObject.nestedValue = 123 // callback es disparado
1
2
3
4
5Opción: immediate
Pasar
immediate: true
en la opción disparará el callback inmediatamente con el valor actual de la expresión:vm.$watch('a', callback, { immediate: true }) // `callback` es disparado inmediatamente con el valor actual de `a`
1
2
3
4Note que con opción
immediate
no será capaz de quitar la observación a una propiedad dada en la primera llamada de callback.// Este resultará un error const unwatch = vm.$watch( 'value', function() { doSomething() unwatch() }, { immediate: true } )
1
2
3
4
5
6
7
8
9Si todavía quiere llamar una función de quitar observación dentro del callback, debería comprobar su disponibilidad primero:
let unwatch = null unwatch = vm.$watch( 'value', function() { doSomething() if (unwatch) { unwatch() } }, { immediate: true } )
1
2
3
4
5
6
7
8
9
10
11
12Opción: flush
La opción
flush
permite un mayor control sobre la temporizción del callback. Puede establecerse como'pre'
,'post'
o'sync'
.El valor por defecto es
'pre'
, lo que especifica que el callback debe ser invocado antes de la renderización. Este permite que el callback actualice otros valores antes de que se ejecute la plantilla.El valor
'post'
puede ser utilizado para diferir el callback hasta después de la renderización. Este debería ser utilizado si el callback necesite acceso al DOM actualizado o los componentes hijos mediante$refs
.Si
flush
se establece como'sync'
, el callback será llamado sincrónicamente, tan pronto como se cambie el valor.Para
'pre'
y'post'
, el callback es amortiguado utilizando una cola. El callback será agregado a la cola una sola vez, incluso si el valor observado se ha cambiado múltiples veces. El valor intermedio se omitirá y no se pasará al callback.Amortiguar el callback no solo mejorar el rendimiento sino también ayuda a asegurarse la consistencia de dato. Los observadores no serán disparados hasta que se haya terminado el código que realice las actualizaciones de dato.
Los observadores de
'sync'
deberían ser utilizados con moderación, como no poseen estos beneficios.Para más información sobre
flush
véase la temporización para tirar de la cadena de los efectos secundarios.Vea también: Observadores
# $emit
Argumentos:
{string} eventName
...args (opcional)
Disparar un evento en la instancia actual. Cualquieres argumentos adicionales serán pasados a la función callback del escuchador.
Ejemplos:
Utilizar
$emit
con solo un nombre de evento:<div id="emit-example-simple"> <welcome-button v-on:welcome="sayHi"></welcome-button> </div>
1
2
3const app = createApp({ methods: { sayHi() { console.log('¡Hola!') } } }) app.component('welcome-button', { emits: ['welcome'], template: ` <button v-on:click="$emit('welcome')"> Hazme clic para recibir bienvenidas </button> ` }) app.mount('#emit-example-simple')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18Utilizar
$emit
con argumentos adicionales:<div id="emit-example-argument"> <advice-component v-on:advise="showAdvice"></advice-component> </div>
1
2
3const app = createApp({ methods: { showAdvice(advice) { alert(advice) } } }) app.component('advice-component', { emits: ['advise'], data() { return { adviceText: 'Cierto consejo' } }, template: ` <div> <input type="text" v-model="adviceText"> <button v-on:click="$emit('advise', adviceText)"> Hazme clic para enviar un consejo </button> </div> ` }) app.mount('#emit-example-argument')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26Vea también:
# $forceUpdate
Uso:
Forzar la rerenderización de la instancia de componente. Note que no aafecta a todos componentes hijos, solo la instancia mísma y los componentes hijos con contenidos de slot insertados.
# $nextTick
Argumentos:
{Function} callback (opcional)
Uso:
Diferir la ejecución del callback hasta el próximo ciclo de actualización DOM. Utilícelo inmediatamente después de que haya cambiado unos datos para esperar la actualización DOM. Esto es lo mismo como el método global
nextTick
, excepto que el contextothis
del callback sea vinculado automáticamente a la instancia que llame a este método.Ejemplo:
createApp({ // ... methods: { // ... example() { // modificar dato this.message = 'changed' // DOM aún no es actualizado this.$nextTick(function() { // DOM ya es actualizado // `this` es vinculado a la instancia actual this.doSomethingElse() }) } } })
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16Vea también: nextTick