# Métodos de Instância
# $watch
Argumentos:
{string | Function} source{Function | Object} callback{Object} options (optional){boolean} deep{boolean} immediate{string} flush
Retorno:
{Function} unwatchUso:
Observa uma propriedade reativa ou uma função computada na instância do componente esperando alterações. O callback é chamado com o novo valor e o valor antigo para a propriedade fornecida. Só podemos passar o nome da propriedade
data,propsoucomputedde nível superior como uma string. Para expressões mais complexas ou propriedades aninhadas, use uma função.Exemplo:
const app = createApp({ data() { return { a: 1, b: 2, c: { d: 3, e: 4 } } }, created() { // nome da propriedade de nível superior this.$watch('a', (newVal, oldVal) => { // faça algo }) // função para observar uma única propriedade aninhada this.$watch( () => this.c.d, (newVal, oldVal) => { // faça algo } ) // função para observar uma expressão complexa this.$watch( // toda vez que a expressão `this.a + this.b` produz um resultado diferente, // o manipulador será chamado. É como se estivéssemos observando // um dado computado sem precisarmos definí-lo () => this.a + this.b, (newVal, oldVal) => { // faça 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
37Quando o valor observado é um objeto ou array, quaisquer alterações em suas propriedades ou elementos não acionarão o inspetor porque fazem referência ao mesmo objeto/array:
const app = createApp({ data() { return { article: { text: 'Vue é incrível!' }, comments: ['De fato!', 'Concordo'] } }, created() { this.$watch('article', () => { console.log('Artigo alterado!') }) this.$watch('comments', () => { console.log('Comentários alterados!') }) }, methods: { // Esses métodos não acionarão um observador pois alteramos apenas uma propriedade do object/array, // não o objeto/array em si changeArticleText() { this.article.text = 'Vue 3 é incrível' }, addComment() { this.comments.push('Novo comentário') }, // Esses métodos acionarão um observador pois substituímos o objeto/array completamente changeWholeArticle() { this.article = { text: 'Vue 3 é incrível' } }, 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$watchretorna uma funçãounwatchque para de disparar o callback:const app = createApp({ data() { return { a: 1 } } }) const vm = app.mount('#app') const unwatch = vm.$watch('a', cb) // depois, desmonta o observador unwatch()1
2
3
4
5
6
7
8
9
10
11
12
13Opção:
deepPara também detectar mudanças de valores aninhados dentro de Objects, você precisa passar
deep: trueno argumento de opções. Esta opção também pode ser usada para observar mutações de array.Nota: ao mudar (ao invés de substituir) um Object ou um Array e observar com a opção
deep, o valor antigo será o mesmo que o novo valor porque eles fazem referência ao mesmo Object/Array. O Vue não mantém uma cópia do valor pré-modificação.vm.$watch('someObject', callback, { deep: true }) vm.someObject.nestedValue = 123 // callback é acionado1
2
3
4
5Opção:
immediatePassar
immediate: truena opção acionará o callback imediatamente com o valor atual da expressão:vm.$watch('a', callback, { immediate: true }) // `callback` é acionado imediatamente com o valor atual de `a`1
2
3
4Observe que com a opção
immediatevocê não poderá dar unwatch na propriedade fornecida na primeira chamada de callback.// Isso causará um erro const unwatch = vm.$watch( 'value', function() { doSomething() unwatch() }, { immediate: true } )1
2
3
4
5
6
7
8
9Se você ainda quiser chamar uma função unwatch dentro do callback, verifique primeiro sua disponibilidade:
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
12Opção: flush
A opção
flushpermite maior controle sobre o momento de acionamento do callback. Pode ser definido como'pre','post'ou'sync'.O valor padrão é
'pre', que especifica que o callback deve ser invocado antes da renderização. Isso permite que o callback atualize outros valores antes que o template seja executado.O valor
'post'pode ser usado para adiar o callback até depois da renderização. Isso deve ser usado se o callback precisar acessar o DOM atualizado ou componentes filho por meio de$refs.Se
flushfor definido como'sync', o callback será chamado de forma síncrona, assim que o valor mudar.Para ambos
'pre'e'post', o callback é armazenado em buffer usando uma fila. O callback será adicionado à fila apenas uma vez, mesmo que o valor observado seja alterado várias vezes. Os valores provisórios serão ignorados e não serão passados para o callback.O armazenamento em buffer do callback não apenas melhora o desempenho, mas também ajuda a garantir a consistência dos dados. Os observadores não serão acionados até que o código que executa as atualizações de dados seja concluído.
Observadores
'sync'devem ser usados com moderação, pois eles não têm esses benefícios.Para obter mais informações sobre
flush, consulte Momento de Limpeza do Efeito.Ver também: Observadores
# $emit
Argumentos:
{string} eventName...args (opcional)
Acionar um evento na instância atual. Quaisquer argumentos adicionais serão passados para a função callback do escutador.
Exemplos:
Usando
$emitcom apenas um nome 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('Oi!') } } }) app.component('welcome-button', { emits: ['welcome'], template: ` <button v-on:click="$emit('welcome')"> Clique-me para as boas vindas </button> ` }) app.mount('#emit-example-simple')1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18Usando
$emitcom argumentos adicionais:<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: 'Alguns conselhos' } }, template: ` <div> <input type="text" v-model="adviceText"> <button v-on:click="$emit('advise', adviceText)"> Clique em mim para enviar conselhos </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
26Ver também:
# $forceUpdate
Uso:
Força a instância do componente a renderizar novamente. Observe que isso não afeta todos os componentes filho, apenas a própria instância e os componentes filho com conteúdo de slot inserido.
# $nextTick
Argumentos:
{Function} callback (opcional)
Uso:
Adie o callback para ser executado após o próximo ciclo de atualização do DOM. Use-o imediatamente após alterar alguns dados para aguardar a atualização do DOM. Isso é o mesmo que o
nextTickglobal, exceto que o contextothisdo callback é automaticamente vinculado à instância que chama esse método.Exemplo:
createApp({ // ... methods: { // ... example() { // modifica os dados this.message = 'changed' // DOM ainda não foi atualizado this.$nextTick(function() { // DOM agora está atualizado // `this` está vinculado à instância atual this.doSomethingElse() }) } } })1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16Ver também: nextTick