```
Um bloco filho é rastreado dentro do arranjo de descendentes dinâmicos do bloco pai. Isto conserva uma estrutura estável para o bloco pai.
### Impacto na Hidratação de SSR {#impact-on-ssr-hydration}
Tanto as opções de remendo quanto o aplainamento de árvore também melhoram grandemente o desempenho da [Hidratação de SSR](/guide/scaling-up/ssr#client-hydration) da Vue:
- A hidratação de um único elemento pode pegar caminhos rápidos baseado na opção de remendo do `vnode` correspondente.
- Apenas nós de bloco e seus descendentes dinâmicos precisam de ser atravessados durante a hidratação, alcançando efetivamente a hidratação parcial no nível do modelo de marcação.
---
---
url: /guide/components/v-model.md
---
# Modelo Virtual do Componente {#component-v-model}
## Uso Básico {#basic-usage}
A `v-model` pode ser usada num componente para implementar um vínculo bidirecional.
Desde a Vue 3.4, a abordagem recomendada para alcançar isto é usar a macro [`defineModel()`](/api/sfc-script-setup#definemodel):
```vue
Parent bound v-model is: {{ model }}
```
O pai pode então vincular um valor com `v-model`:
```vue-html
```
O valor retornado por `defineModel()` é uma referência. Esta pode ser acessada e alterada como qualquer outra referência, exceto que comporta-se como um vínculo bidirecional entre um valor pai e um valor local:
- Seu `.value` é sincronizado com o valor vinculado pela `v-model` do pai;
- Quando é alterada pelo filho, faz com que o valor vinculado ao pai também seja atualizado.
Isto significa que também podemos vincular esta referência a um elemento de entrada nativo com `v-model`, simplificando o embrulhar de elementos de entrada nativos enquanto fornecemos o mesmo uso de `v-model`:
```vue
```
[Exemplo de Testes](https://play.vuejs.org/#eNqFUtFKwzAU/ZWYl06YLbK30Q10DFSYigq+5KW0t11mmoQknZPSf/cm3eqEsT0l555zuefmpKV3WsfbBuiUpjY3XDtiwTV6ziSvtTKOLNZcFKQ0qiZRnATkG6JB0BIDJen2kp5iMlfSOlLbisw8P4oeQAhFPpURxVV0zWSa9PNwEgIHtRaZA0SEpOvbeduG5q5LE0Sh2jvZ3tSqADFjFHlGSYJkmhz10zF1FseXvIo3VklcrfX9jOaq1lyAedGOoz1GpyQwnsvQ3fdTqDnTwPhQz9eQf52ob+zO1xh9NWDBbIHRgXOZqcD19PL9GXZ4H0h03whUnyHfwCrReI+97L6RBdo+0gW3j+H9uaw+7HLnQNrDUt6oV3ZBzyhmsjiz+p/dSTwJfUx2+IpD1ic+xz5enwQGXEDJJaw8Gl2I1upMzlc/hEvdOBR6SNKAjqP1J6P/o6XdL11L5h4=)
### Nos Bastidores {#under-the-hood}
A `defineModel` é uma macro de conveniência. O compilador expande-a ao seguinte:
- Uma propriedade com o nome de `modelValue`, com a qual o valor da referência local é sincronizado;
- Um evento com o nome de `update:modelValue`. que é emitido quando o valor da referência local é alterado.
É assim que implementaríamos o mesmo componente filho mostrado acima antes da versão 3.4:
```vue
```
Como podemos ver, é um pouco mais verboso. No entanto, é útil para compreender o que acontece nos bastidores.
Uma vez que `defineModel` declara uma propriedade, podemos então declarar as opções da propriedade subjacente passando-a a `defineModel`:
```js
// tornar o `v-model` obrigatório
const model = defineModel({ required: true })
// fornecer um valor padrão
const model = defineModel({ default: 0 })
```
:::warning AVISO
Se tivermos um valor `default` para a propriedade `defineModel` e não fornecermos nenhum valor para esta propriedade do componente pai, isto pode causar uma dessincronização entre os componentes pai e filho. No exemplo abaixo, a `myRef` do componente pai é `undefined`, mas `model` do componente filho é `1`:
```js
// componente filho:
const model = defineModel({ default: 1 })
// componente pai:
const myRef = ref()
```
```html
```
:::
Primeiro, revisitaremos como a `v-model` é usada sobre um elemento nativo:
```vue-html
```
Nos bastidores, o compilador do modelo de marcação expande `v-model` ao equivalente mais verboso por nós: Então o código acima faz o mesmo que o seguinte:
```vue-html
```
Quando usada sobre um componente, `v-model` expande-se para isto:
```vue-html
searchText = newValue"
/>
```
Para que isto realmente funcione, o componente `` deve fazer duas coisas:
1. Vincular o atributo `value` de um elemento nativo ` ` à propriedade `modelValue`.
2. Quando um evento de `input` nativo é acionado, emitir um evento personalizado `update:modelValue` com o novo valor.
Eis o que se passa em ação:
```vue
```
Agora a `v-model` deve funcionar perfeitamente com este componente:
```vue-html
```
[Experimentar na Zona de Testes](https://play.vuejs.org/#eNqFkctqwzAQRX9lEAEn4Np744aWrvoD3URdiHiSGvRCHpmC8b93JDfGKYGCkJjXvTrSJF69r8aIohHtcA69p6O0vfEuELzFgZx5tz4SXIIzUFT1JpfGCmmlxe/c3uFFRU0wSQtwdqxh0dLQwHSnNJep3ilS+8PSCxCQYrC3CMDgMKgrNlB8odaOXVJ2TgdvvNp6vSwHhMZrRcgRQLs1G5+M61A/S/ErKQXUR5immwXMWW1VEKX4g3j3Mo9QfXCeKU9FtvpQmp/lM0Oi6RP/qYieebHZNvyL0acLLODNmGYSxCogxVJ6yW1c2iWz/QOnEnY48kdUpMIVGSllD8t8zVZb+PkHqPG4iw==)
Uma outra maneira de implementar a `v-model` dentro deste componente é usar uma propriedade `computed` gravável com um recuperador e um definidor. O método `get` deve retornar a propriedade `modelValue` e o método `set` deve emitir o evento correspondente:
```vue
```
## Argumentos da `v-model` {#v-model-arguments}
A `v-model` sobre um componente também pode aceitar um argumento:
```vue-html
```
No componente filho, podemos suportar o argumento correspondente passando uma sequência de caracteres à `defineModel()` como seu primeiro argumento:
```vue
```
[Experimentar na Zona de Testes](https://play.vuejs.org/#eNqFkl9PwjAUxb9K05dhglsMb2SQqOFBE9Soj31Zxh0Uu7bpHxxZ9t29LWOiQXzaes7p2a+9a+mt1unOA53S3JaGa0csOK/nTPJaK+NISwxUpCOVUTVJMJoM1nJ/r/BNgnS9nWYnWujFMCFMlkpaRxx3AsgsFI6S3XWtViBIYda+Dg3QFLUWkFwxmWcHFqTAhQPUCwe4IiTf3Mzbtq/qujzDddRPYfruaUzNGI1PRkmG0Twb+uiY/sI9cw0/0VdQcQnL0D5KovgfL5fa4/69jiDQOOTo+S6SOYtfrvg63VolkauNN0lLxOUCzLN2HMkYnZLoBK8QQn0+Rs0ZD+OjXm6g/Dijb20TNEZfDFgwOwQZPIdzAWQN9uLtKXIPJtL7gH3BfAWrhA+Mh9idlyvEPslF2of4J3G5freLxoG0x0MF0JDsYp5RHE6Y1F9H/8adpJO4j8mOdl/Hw/nf)
Se as opções de propriedade também forem necessárias, devem ser passadas depois do nome do modelo:
```js
const title = defineModel('title', { required: true })
```
Uso antes da 3.4
```vue
```
[Experimentar na Zona de Testes](https://play.vuejs.org/#eNp9kE1rwzAMhv+KMIW00DXsGtKyMXYc7D7vEBplM8QfOHJoCfnvk+1QsjJ2svVKevRKk3h27jAGFJWoh7NXjmBACu4kjdLOeoIJPHYwQ+ethoJLi1vq7fpi+WfQ0JI+lCstcrkYQJqzNQMBKeoRjhG4LcYHbVvsofFfQUcCXhrteix20tRl9sIuOCBkvSHkCKD+fjxN04Ka57rkOOlrMwu7SlVHKdIrBZRcWpc3ntiLO7t/nKHFThl899YN248ikYpP9pj1V60o6sG1TMwDU/q/FZRxgeIPgK4uGcQLSZGlamz6sHKd1afUxOoGeeT298A9bHCMKxBfE3mTSNjl1vud5x8qNa76)
Neste caso, ao invés da propriedade `modelValue` e evento `update:modelValue` padrão, o componente filho deve esperar uma propriedade `title` e emitir um evento `update:title` para atualizar o valor do pai:
```vue
```
[Experimentar na Zona de Testes](https://play.vuejs.org/#eNqFUNFqwzAM/BVhCm6ha9hryMrGnvcFdR9Mo26B2DGuHFJC/n2yvZakDAohtuTTne5G8eHcrg8oSlFdTr5xtFe2Ma7zBF/Xz45vFi3B2XcG5K6Y9eKYVFZZHBK8xrMOLcGoLMDphrqUMC6Ypm18rzXp9SZjATxS8PZWAVBDLZYg+xfT1diC9t/BxGEctHFtlI2wKR78468q7ttzQcgoTcgVQPXzuh/HzAnTVBVcp/58qz+lMqHelEinElAwtCrufGIrHhJYBPdfEs53jkM4yEQpj8k+miYmc5DBcRKYZeXxqZXGukDZPF1dWhQHUiK3yl63YbZ97r6nIe6uoup6KbmFFfbRCnHGyI4iwyaPPnqffgGMlsEM)
## Vários Vínculos de `v-model` {#multiple-v-model-bindings}
Com o aproveitamento da capacidade de mirar uma propriedade e um evento em particular, como aprendemos anteriormente com os argumentos da `v-model`, podemos agora criar vários vínculos de `v-model` numa única instância de componente.
Cada `v-model` sincronizar-se-á com uma propriedade diferente, sem a necessidade de opções adicionais no componente:
```vue-html
```
```vue
```
[Experimentar na Zona de Testes](https://play.vuejs.org/#eNqFkstuwjAQRX/F8iZUAqKKHQpIfbAoUmnVx86bKEzANLEt26FUkf+9Y4MDSAg2UWbu9fjckVv6oNRw2wAd08wUmitLDNhGTZngtZLakpZoKIkjpZY1SdCadNK3Ab3IazhowzQ2/ES0MVFIYSwpucbvxA/qJXO5FsldlKr8qDxL8EKW7kEQAQsLtapyC1gRkq3vp217mOccwf8wwLksRSlYIoMvCNkOarmEahyODAT2J4yGgtFzhx8UDf5/r6c4NEs7CNqnpxkvbO0kcVjNhCyh5AJe/SW9pBPOV3DJGvu3dsKFaiyxf8qTW9gheQwVs4Z90BDm5oF47cF/Ht4aZC75argxUmD61g9ktJC14hXoN2U5ZmJ0TILitbyq5O889KxuoB/7xRqKnwv9jdn5HqPvGnDVWwTpNJvrFSCul2efi4DeiRigqdB9RfwAI6vGM+5tj41YIvaJL9C+hOfNxerLzHYWhImhPKh3uuBnFJ/A05XoR9zRcBTOMeGo+wcs+yse)
Uso antes da 3.4
```vue
```
[Experimentar na Zona de Testes](https://play.vuejs.org/#eNqNUc1qwzAMfhVjCk6hTdg1pGWD7bLDGIydlh1Cq7SGxDaOEjaC332yU6cdFNpLsPRJ348y8idj0qEHnvOi21lpkHWAvdmWSrZGW2Qjs1Azx2qrWyZoVMzQZwf2rWrhhKVZbHhGGivVTqsOWS0tfTeeKBGv+qjEMkJNdUaeNXigyCYjZIEKhNY0FQJVjBXHh+04nvicY/QOBM4VGUFhJHrwBWPDutV7aPKwslbU35Q8FCX/P+GJ4oB/T3hGpEU2m+ArfpnxytX2UEsF71abLhk9QxDzCzn7QCvVYeW7XuGyWSpH0eP6SyuxS75Eb/akOpn302LFYi8SiO8bJ5PK9DhFxV/j0yH8zOnzoWr6+SbhbifkMSwSsgByk1zzsoABFKZY2QNgGpiW57Pdrx2z3JCeI99Svvxh7g8muf2x)
```vue
```
[Experimentar na Zona de Testes](https://play.vuejs.org/#eNqNkk1rg0AQhv/KIAETSJRexYYWeuqhl9JTt4clmSSC7i7rKCnif+/ObtYkELAiujPzztejQ/JqTNZ3mBRJ2e5sZWgrVNUYbQm+WrQfskE4WN1AmuXRwQmpUELh2Qv3eJBdTTAIBbDTLluhoraA4VpjXHNwL0kuV0EIYJE6q6IFcKhsSwWk7/qkUq/nq5be+aa5JztGfrmHu8t8GtoZhI2pJaGzAMrT03YYQk0YR3BnruSOZe5CXhKnC3X7TaP3WBc+ZaOc/1kk3hDJvYILRQGfQzx3Rct8GiJZJ7fA7gg/AmesNszMrUIXFpxbwCfZSh09D0Hc7tbN6sAWm4qZf6edcZgxrMHSdA3RF7PTn1l8lTIdhbXp1/CmhOeJRNHLupv4eIaXyItPdJEFD7R8NM0Ce/d/ZCTtESnzlVZXhP/vHbeZaT0tPdf59uONfx7mDVM=)
## Manipulação de Modificadores da `v-model` {#handling-v-model-modifiers}
Quando aprendemos sobre os vínculos de entrada de formulário, vimos que a `v-model` tem [modificadores embutidos](/guide/essentials/forms#modifiers) — `.trim`, `.number` e `.lazy`. Em alguns casos, também podemos querer que a `v-model` sobre o nosso componente de entrada personalizado suporte modificadores personalizados.
Criaremos um exemplo de modificador personalizado, `capitalize`, que transforma a primeira letra da sequência de caracteres fornecida pelo vínculo de `v-model` em maiúscula:
```vue-html
```
Os modificadores adicionados a `v-model` de um componente podem ser acessados no componente filho através da desestruturação do valor de retorno da `defineModel()` da seguinte maneira:
```vue{4}
```
Para ajustar condicionalmente como o valor de ser lido ou escrito baseado nos modificadores, podemos passar as opções `get` e `set` a `defineModel()`. Estas duas opções recebem o valor na recuperação ou definição da referência do modelo e devem retornar um valor transformado. É assim que podemos usar a opção `set` para implementar o modificador `capitalize`:
```vue{6-8}
```
[Experimentar na Zona de Testes](https://play.vuejs.org/#eNp9UsFu2zAM/RVClzhY5mzoLUgHdEUPG9Bt2LLTtIPh0Ik6WxIkyosb5N9LybFrFG1OkvgeyccnHsWNtXkbUKzE2pdOWQKPFOwnqVVjjSM4gsMKTlA508CMqbMRuu9uDd80ajrD+XISi3WZDCB1abQnaLoNHgiuY8VsNptLvV72TbkdPwgbWxeE/ALY7JUHpW0gKAurqKjVI3rAFl1He6V30JkA3AbdKvLXUzXt+8Zssc6fM6+l6NtLAUtusF6O3cRCvFB9yY2SiYFw+8KSYcY/qfEC+FCVQuf/8rxbrJTG+4hkxyiWq2ZtUQecQ3oDqAqyMWeieyQAu0bBaUh5ebkv3A1lH+Y5md/WorstPGZzeHfGfa1KzD6yxzH11B/TCjHC4dPlX1j3P0CdjQ5S79/Z3WhpPF91lDz7Uald/uCNZj/TFFJE91SN7rslxX5JsRrmk6Koa/P/a4qRC7gY4uUey3+vxB/8Icak+OHQo2tRihGjwu2QtUb47te3pHsEWXWomX0B/Ine1CFq7Gmfg96y7Akvqf2StoKXcePvDoTaD0NFocnhxJeClyRu2FujP8u9yq+GnxGnJxSEO+M=)
Uso antes da 3.4
```vue{11-13}
```
[Experimentar na Zona de Testes](https://play.vuejs.org/#eNp9Us1Og0AQfpUJF5ZYqV4JNTaNxyYmVi/igdCh3QR2N7tDIza8u7NLpdU0nmB+v5/ZY7Q0Jj10GGVR7iorDYFD6sxDoWRrtCU4gsUaBqitbiHm1ngqrfuV5j+Fik7ldH6R83u5GaBQlVaOoO03+Emw8BtFHCeFyucjKMNxQNiapiTkCGCzlw6kMh1BVRpJZSO/0AEe0Pa0l2oHve6AYdBmvj+/ZHO4bfUWm/Q8uSiiEb6IYM4A+XxCi2bRH9ZX3BgVGKuNYwFbrKXCZx+Jo0cPcG9l02EGL2SZ3mxKr/VW1hKty9hMniy7hjIQCSweQByHBIZCDWzGDwi20ps0Yjxx4MR73Jktc83OOPFHGKk7VZHUKkyFgsAEAqcG2Qif4WWYUml3yOp8wldlDSLISX+TvPDstAemLeGbVvvSLkncJSnpV2PQrkqHLOfmVHeNrFDcMz3w0iBQE1cUzMYBbuS2f55CPj4D6o0/I41HzMKsP+u0kLOPoZWzkx1X7j18A8s0DEY=)
Os modificadores adicionados a uma `v-model` de um componente serão fornecidos ao componente através da propriedade `modelModifiers`. No exemplo abaixo, criamos um componente que contém uma propriedade `modelModifiers` que tem como padrão um objeto vazio:
```vue{11}
```
Observemos que a propriedade `modelModifiers` do componente contém `capitalize` e seu valor é `true` — devido ao fato de ter sido definida sobre o vínculo da `v-model` `v-model.capitalize="myText"`.
Agora temos a nossa propriedade configurada, podemos verificar as chaves do objeto `modelModifiers` e escrever um manipulador para alterar o valor emitido. No código abaixo, transformaremos a primeira letra da sequência de caracteres em maiúscula sempre que o elemento ` ` disparar um evento `input`.
```vue{13-15}
```
[Experimentar na Zona de Testes](https://play.vuejs.org/#eNqFks1qg0AQgF9lkIKGpqa9iikNOefUtJfaw6KTZEHdZR1DbPDdO7saf0qgIq47//PNXL2N1uG5Ri/y4io1UtNrUspCK0Owa7aK/0osCQ5GFeCHq4nMuvlJCZCUeHEOGR5EnRNcrTS92VURXGex2qXVZ4JEsOhsAQxSbcrbDaBo9nihCHyXAaC1B3/4jVdDoXwhLHQuCPkGsD/JCmSpa4JUaEkilz9YAZ7RNHSS5REaVQPXgCay9vG0rPNToTLMw9FznXhdHYkHK04Qr4Zs3tL7g2JG8B4QbZS2LLqGXK5PkdcYwTsZrs1R6RU7lcmDRDPaM7AuWARMbf0KwbVdTNk4dyyk5f3l15r5YjRm8b+dQYF0UtkY1jo4fYDDLAByZBxWCmvAkIQ5IvdoBTcLeYCAiVbhvNwJvEk4GIK5M0xPwmwoeF6EpD60RrMVFXJXj72+ymWKwUvfXt+gfVzGB1tzcKfDZec+o/LfxsTdtlCj7bSpm3Xk4tjpD8FZ+uZMWTowu7MW7S+CWR77)
### Modificadores para `v-model` com Argumentos {#modifiers-for-v-model-with-arguments}
Para vínculos de `v-model` com ambos argumento e modificadores, o nome da propriedade gerada será `argumento + "Modificadores"`. Por exemplo:
```vue-html
```
As declarações correspondentes devem ser:
```js
export default {
props: ['title', 'titleModifiers'],
emits: ['update:title'],
created() {
console.log(this.titleModifiers) // { capitalize: true }
}
}
```
Eis um outro exemplo de uso de modificadores com várias `v-model` com diferentes argumentos:
```vue-html
```
```vue
```
Uso antes da 3.4
```vue{5,6,10,11}
```
```vue{15,16}
```
---
---
url: /guide/essentials/watchers.md
---
# Observadores {#watchers}
## Exemplo Básico {#basic-example}
As propriedades computadas permite-nos calcular declarativamente valores derivados. No entanto, existêm casos onde precisamos realizar "efeitos colaterais" em reação as mudanças de estado - por exemplo, alterando o DOM, ou mudando um outro pedaço do estado baseado no resultado de uma operação assíncrona.
Com a API de Opções, podemos utilizar a [opção `watch`](/api/options-state#watch) para acionar uma função sempre que uma propriedade reativa mudar:
```js
export default {
data() {
return {
question: '',
answer: 'Questions usually contain a question mark. ;-)'
}
},
watch: {
// sempre que `question` mudar, esta função executará
question(newQuestion, oldQuestion) {
if (newQuestion.indexOf('?') > -1) {
this.getAnswer()
}
}
},
methods: {
async getAnswer() {
this.answer = 'Thinking...'
try {
const res = await fetch('https://yesno.wtf/api')
this.answer = (await res.json()).answer
} catch (error) {
this.answer = 'Error! Could not reach the API. ' + error
}
}
}
}
```
```vue-html
Ask a yes/no question:
{{ answer }}
```
[Experimente-o na Zona de Testes](https://play.vuejs.org/#eNptUk2PmzAQ/SuvXAA1sdVrmt0qqnroqa3UIxcLhuCGjKk/wkYR/70OBJLuroRkPDPvzbznuSS7rhOnQMkm2brS6s4/F0wvnbEeFdUqtB6XgoFKeZXl0z9gyQfL8w34G8h5bXiDNF3NQcWuJxtDv25Zh+CCatszSsNeaYZakDgqexD4vM7TCT9cj2Ek65Uvm83cTUr0DTGdyN7RZaN4T24F32iHOnA5hnvdtrCBJ+RcnTH180wrmLaaL4s+QNd4LBOaK3r5UWfplzTHM9afHmoxdhV78rtRcpbPmVHEf1qO5BtTuUWNcmcu8QC9046kk4l4Qvq70XzQvBdC3CyKJfb8OEa01fn4OC7Wq15pj5qidVnaeN+5jZRncmxE72upOp0uY77ulU3gSCT+uOhXnt9yiy6U1zdBRtYa+9aK+9TfrgUf8NWEtgKbK6mKQN8Qdj+/C6T4iJHkXcsKjt9WLpsZL56OXas8xRuw7cYD2LlDXKYoT7K5b+OU22rugsdpfTQVtU9FMueLBHKikRNPpLtcbnuLYZjCW7m0TIZ/92UFiQ==))
A opção `watch` também suporta um caminho delimitado por ponto como chave:
```js
export default {
watch: {
// Nota: apenas caminhos simples. Expressões não são suportados.
'some.nested.key'(newValue) {
// ...
}
}
}
```
Com a API de Composição, podemos utilizar a [função `watch`](/api/reactivity-core#watch) para acionar uma resposta sempre que um pedaço do estado reativo mudar:
```vue
Ask a yes/no question:
{{ answer }}
```
[Experimente-o na Zona de Testes](https://play.vuejs.org/#eNplkkGPmzAQhf/KKxdA3Rj1mpJUUdVDT22lHrlYxDRuYOzaJjRC/PcdxyGr3b2A7PfmmzcMc3awVlxGlW2z2rdO2wCvwmj3DenBGhcww6nuCZMM7QkLOmcG5FyRN9RQa8gH/BuVD9oQdtFb5Hm5KpL8pNx6/+vu8xj9KPv+CnYFqQnyhTFIdxb4vCkjpaFb32JVnyD9lVoUpKaVVmK3x9wQoLtXgtB0VP9/cOMveYk9Np/K5MM9l7jIflScLv990nTW9EcIwXNFR3DX1YwYk4dxyrNXTlIHdCrGyk8hWL+tqqvyZMQUukpaHYOnujdtilTLHPHXGyrKUiRH8i9obx+5UM4Z98j6Pu23qH/AVzP2R5CJRMl14aRw+PldIMdH3Bh3bnzxY+FcdZW2zPvlQ1CD7WVQfALquPToP/gzL4RHqsg89rJNWq3JjgGXzWCOqt812ao3GaqEqRKHcfO8/gDLkq7r6tEyW54Bf5TTlg==)
### Observar Tipos de Fonte {#watch-source-types}
O primeiro argumento do `watch` pode ser de diferentes tipos de "fontes" reativas: pode ser uma referência (incluindo referências computadas), um objeto reativo, uma função recuperada, ou um arranjo de várias fontes:
```js
const x = ref(0)
const y = ref(0)
// referência única
watch(x, (newX) => {
console.log(`x is ${newX}`)
})
// recuperador
watch(
() => x.value + y.value,
(sum) => {
console.log(`sum of x + y is: ${sum}`)
}
)
// arranjo de várias fontes
watch([x, () => y.value], ([newX, newY]) => {
console.log(`x is ${newX} and y is ${newY}`)
})
```
Tome nota de que não podes observar uma propriedade de um objeto reativo desta maneira:
```js
const obj = reactive({ count: 0 })
// isto não funcionará porque estamos passando um número para `watch()`
watch(obj.count, (count) => {
console.log(`count is: ${count}`)
})
```
Ao invés daquilo, utilize um recuperador:
```js
// Ao invés daquilo, utilize um recuperador:
watch(
() => obj.count,
(count) => {
console.log(`count is: ${count}`)
}
)
```
## Observadores Profundos {#deep-watchers}
A `watch` é superficial por padrão: a resposta só acionará quando a propriedade observada for atribuida um valor novo - ele não acionará sobre mudanças de propriedade encaixada.
```js
export default {
watch: {
someObject: {
handler(newValue, oldValue) {
// Nota: cá `newValue` será igual ao `oldValue`
// sobre as mutações encaixadas enquanto o próprio objeto
// não for substítuido.
},
deep: true
}
}
}
```
Quando chamares `watch()` diretamente sobre um objeto reativo, ela criará implicitamente um observador profundo - a resposta será acionada sobre todas as mutações encaixadas:
```js
const obj = reactive({ count: 0 })
watch(obj, (newValue, oldValue) => {
// dispara sobre mutações de propriedade encaixada
// Nota: cá `newValue` será igual ao `oldValue`
// porque ambos eles apontam para o mesmo objeto!
})
obj.count++
```
Isto deve ser distinguido de um recuperador que retorna um objeto reativo - no recente caso, a resposta só disparará se o recuperador retornar um objeto diferente:
```js
watch(
() => state.someObject,
() => {
// dispara só quando `state.someObject` for substituido
}
)
```
Tu podes, no entanto, forçar o segundo caso para um observador profundo utilizando explicitamente a opção `deep`:
```js
watch(
() => state.someObject,
(newValue, oldValue) => {
// Nota: cá `newValue` será igual ao `oldValue`
// *a menos que* `state.someObject` tenha sido substituido
},
{ deep: true }
)
```
:::warning USE COM CAUTELA
A observação profunda precisa percorrer todas propriedades encaixadas dentro do objeto observado, e pode ser caro quando utilizada sobre grandes estruturas de dados. Utilize-a só quando necessário e esteja ciente das implicações de desempenho.
:::
## Observadores Incansáveis {#eager-watchers}
O `watch` é preguiçoso por padrão: a resposta não será chamada até que a fonte observada tenha mudado. Mas em alguns casos podemos querer que a mesma lógica de resposta seja executada incansavelmente - por exemplo, podemos querer pedir alguns dados iniciais, e depois pedir novamente os dados sempre que o estado relevante mudar.
Nós podemos forçar que uma resposta do observador seja executada imediatamente declarando-a utilizando um objeto com uma função `handler` e a opção `immediate: true`:
```js
export default {
// ...
watch: {
question: {
handler(newQuestion) {
// isto será executado imediatamente sobre a criação do componente.
},
// forçar a execução incansável da resposta
immediate: true
}
}
// ...
}
```
Nós podemos forçar uma resposta do observador a ser executada imediatamente passando a opção `immediate: true`:
```js
watch(source, (newValue, oldValue) => {
// executado imediatamente, depois novamente quando `source` mudar
}, { immediate: true })
```
## `watchEffect()` \*\* {#watcheffect}
É comum para a função de resposta do observador usar exatamente o mesmo estado reativo como fonte. Por exemplo, considere o seguinte código, que usa um observador para carregar um recurso remoto sempre que a referência `todoId` mudar:
```js
const todoId = ref(1)
const data = ref(null)
watch(todoId, async () => {
const response = await fetch(
`https://jsonplaceholder.typicode.com/todos/${todoId.value}`
)
data.value = await response.json()
}, { immediate: true })
```
Em particular, repare em como o observador usa o `todoId` duas vezes, uma vez como fonte e depois novamente dentro da função de resposta.
Isto pode ser simplificado com [`watchEffect()`](/api/reactivity-core#watcheffect). A `watchEffect()` permite-nos rastrear as dependências reativas da função de resposta automaticamente. O observador acima pode ser reescrito como:
```js
watchEffect(async () => {
const response = await fetch(
`https://jsonplaceholder.typicode.com/todos/${todoId.value}`
)
data.value = await response.json()
})
```
Aqui, a função de resposta executará imediatamente, não há necessidade de especificar `immediate: true`. Durante a sua execução, ela rastreará automaticamente o `todoId.value` como uma dependência (similar as propriedades computadas). Sempre que `todoId.value` mudar, a função de resposta será executada novamente. Com a `watchEffect()`, já não precisamos passar `todoId` explicitamente como valor de fonte.
Tu podes consultar [este exemplo](/examples/#fetching-data) de `watchEffect` e da requisição reativa de dados em ação.
Para exemplos como este, com apenas uma dependência, o benefício da `watchEffect()` é relativamente pequeno. Mas para os observadores que têm várias dependências, usar `watchEffect()` remove o fardo de ter que manter a lista de dependências manualmente. Além disto, se precisares observar várias propriedades em uma estrutura encaixada, a `watchEffect()` pode provar-se mais eficiente do que um observador profundo, já que ele apenas rastreará as propriedades que são usadas na função de resposta, em vez de rastrear recursivamente todos eles.
:::tip DICA
A `watchEffect` só rastreia dependências durante sua execução **síncrona**. Quando estiveres utilizando-a com uma resposta assíncrona, apenas as propriedades acessadas antes do primeiro visto `await` serão executadas.
:::
### `watch` vs. `watchEffect` {#watch-vs-watcheffect}
Ambos `watch` e `watchEffect` permitem-nos realizar efeitos colaterais de maneira reativa. A principal diferença entre elas está na maneira de como elas rasteiam as dependências reativas:
- `watch` só rastreia a fonte observada explicitamente. Ela não rastreiará nada acessado dentro da resposta. Além disto, a resposta só aciona quando a fonte tiver sido de fato mudada. `watch` separa rastreiamente de dependência do efeito colateral, dando-nos controlo mais preciso sobre quando a resposta deveria disparar.
- `watchEffect`, por outro lado, combina o rastreiamente de dependência e efeito colateral em uma fase. Ela rastreia automaticamente toda propriedade reativa acessada durante sua execução síncrona. Isto é mais conveniente e normalmente resulta em um código mais conciso, mas torna as suas dependências reativas menos explícitas.
## Tempo de Fluxo de Resposta {#callback-flush-timing}
Quando alterares o estado reativo, ele pode acionar tanto as atualizações de componente de Vue e respostas de observador criadados por ti.
Por padrão, respostas de observador criadas pelo utilizador são chamadas **antes** das atualização de componente de Vue. Isto significa que se tentares acessar o DOM de dentro de uma resposta de observador, o DOM estará no estado antes da Vue tiver aplicado quaisquer atualizações.
Se quiseres acessar o DOM em uma resposta de observador **depois** da Vue tiver atualizado-o, precisas especificar a opção `flush: 'post'`:
```js
export default {
// ...
watch: {
key: {
handler() {},
flush: 'post'
}
}
}
```
```js
watch(source, callback, {
flush: 'post'
})
watchEffect(callback, {
flush: 'post'
})
```
A `watchEffect()` pós-fluxo também tem um pseudónimo de conveniência, `watchPostEffect()`:
```js
import { watchPostEffect } from 'vue'
watchPostEffect(() => {
/* executada depois das atualizações de Vue */
})
```
## `this.$watch()` \* {#this-watch}
Também é possível criar observadores imperativamente utilizando o [método de instância `$watch()`](/api/component-instance#watch):
```js
export default {
created() {
this.$watch('question', (newQuestion) => {
// ...
})
}
}
```
Isto é útil para quando precisares definir um observador condicionalmente, ou apenas observar algo em resposta à interação do utilizador. Ele também permite-te parar o observador de maneira prematura.
## Parando um Observador {#stopping-a-watcher}
Os observadores declarados utilizando a opção `watch` ou o método de instância `$watch` são paradas automaticamente quando o componente proprietário for desmontado, assim na maioria dos casos não precisas te preocupares acerca de parar o observador por ti mesmo.
Em caso raro onde precisas parar um observador antes do componente proprietário ser desmontado, a API de `$watch()` retorna uma função para isto:
```js
const unwatch = this.$watch('foo', callback)
// ...quando o observador não é mais necessário:
unwatch()
```
Os observadores declarados sincronamente dentro de `setup()` ou `
```
Para parar manualmente um observado, utilize a função retornada para lidar com isto. Isto funciona para ambos `watch` e `watchEffect`:
```js
const unwatch = watchEffect(() => {})
// ...mais tarde, quando for mais necessária
unwatch()
```
Nota que deve haver muito poucos casos onde precisas criar observadores assincronamente, e criação síncrona deve ser a preferida sempre que possível. Se precisares esperar por algum dado assíncrono, podes tornar a tua lógica de observação condicional:
```js
// dados a serem carregados assincronamente
const data = ref(null)
watchEffect(() => {
if (data.value) {
// faça algo quando os dados forem carregados
}
})
```
---
---
url: /api/compile-time-flags.md
---
# Opções de Compilação {#compile-time-flags}
:::tip DICA
As opções de compilação apenas aplicam-se quando usamos a construção de `esm-bundler` da Vue (isto é, `vue/dist/vue.esm-bundler.js`).
:::
Quando usamos a Vue com uma etapa de construção, é possível configurar um número de opções de compilação para ativar ou desativar certas funcionalidades. O benefício de usar as opções de compilação é que as funcionalidades desativadas desta maneira podem ser removidas do pacote final através da agitação da árvore.
A Vue funcionará mesmo se estas opções não forem explicitamente configuradas. No entanto, é recomendado sempre configurá-las para que as funcionalidades relevantes podem ser removidas corretamente quando possível.
Consultar os [Guias de Configuração](#configuration-guides) sobre como configurá-las dependendo da nossa ferramenta de construção.
## `__VUE_OPTIONS_API__` {#VUE_OPTIONS_API}
- **Predefinida como:** `true`
Ativa ou desativa o suporte da API de Opções. Desativar isto resultará em pacotes menores, mas pode afetar a compatibilidade com as bibliotecas de terceiros se estas dependerem da API de Opções.
## `__VUE_PROD_DEVTOOLS__` {#VUE_PROD_DEVTOOLS}
- **Predefinida como:** `false`
Ativa ou desativa o suporta das ferramentas de programação nas construções de produção. Isto resultará em mais código incluído no pacote, então é recomendado ativar isto apenas para fins de depuração.
## `__VUE_PROD_HYDRATION_MISMATCH_DETAILS__`
{#VUE_PROD_HYDRATION_MISMATCH_DETAILS}
- **Predefinida como:** `false`
Ativa ou desativa avisos detalhados para as disparidades de hidratação nas construções de produção. Isto resultará em mais código incluído no pacote, então é recomendado ativar isto apenas para fins de depuração.
## Guias de Configuração {#configuration-guides}
### Vite {#vite}
A `@vitejs/plugin-vue` fornece automaticamente valores padrão para estas opções. Para mudar os valores padrão, usamos a [opção de configuração `define`](https://pt.vitejs.dev/config/shared-options#define) da Vite:
```js
// vite.config.js
import { defineConfig } from 'vite'
export default defineConfig({
define: {
// ativar detalhes de disparidade de hidratação na
// construção de produção
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'true'
}
})
```
### `vue-cli` {#vue-cli}
A `@vue/cli-service` fornece automaticamente os valores padrão para algumas destas opções. Para configurar ou mudar os valores:
```js
// vue.config.js
module.exports = {
chainWebpack: (config) => {
config.plugin('define').tap((definitions) => {
Object.assign(definitions[0], {
__VUE_OPTIONS_API__: 'true',
__VUE_PROD_DEVTOOLS__: 'false',
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'false'
})
return definitions
})
}
}
```
### `webpack` {#webpack}
As opções devem ser definidas usando a [`DefinePlugin`](https://webpack.js.org/plugins/define-plugin/) da Webpack:
```js
// webpack.config.js
module.exports = {
// ...
plugins: [
new webpack.DefinePlugin({
__VUE_OPTIONS_API__: 'true',
__VUE_PROD_DEVTOOLS__: 'false',
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'false'
})
]
}
```
### Rollup {#rollup}
As opções devem ser definidas usando [`@rollup/plugin-replace`](https://github.com/rollup/plugins/tree/master/packages/replace):
```js
// rollup.config.js
import replace from '@rollup/plugin-replace'
export default {
plugins: [
replace({
__VUE_OPTIONS_API__: 'true',
__VUE_PROD_DEVTOOLS__: 'false',
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'false'
})
]
}
```
---
---
url: /api/options-lifecycle.md
---
# Opções: Ciclo de Vida {#options-lifecycle}
:::info Consulte também
Para uso partilhado dos gatilhos do ciclo de vida, consulte o [Guia - Gatilhos do Ciclo de Vida](/guide/essentials/lifecycle).
:::
## `beforeCreate` {#beforecreate}
Chamada quando a instância for inicializada.
- **Tipo**
```ts
interface ComponentOptions {
beforeCreate?(this: ComponentPublicInstance): void
}
```
- **Detalhes**
Chamada imediatamente quando a instância for inicializada e as propriedades forem resolvidas.
Depois as propriedades serão definidas como propriedades reativas e o estado tais como `data()` ou `computed` serão configurados.
Nota que o gatilho `setup()` da API de Composição é chamado antes de quaisquer gatilhos da API de Opções, até mesmo antes de `beforeCreate()`.
## `created` {#created}
Chamada depois da instância ter terminado de processar todas as opções relacionadas ao estado.
- **Tipo**
```ts
interface ComponentOptions {
created?(this: ComponentPublicInstance): void
}
```
- **Detalhes**
Quando este gatilho é chamado, os seguintes foram configurados: dados reativos, propriedades computadas, métodos, e observadores. No entanto, a fase de montagem ainda não foi começada, e a propriedade `$el` ainda não estará disponível.
## `beforeMount` {#beforemount}
Chamada bem antes do componente ser montado.
- **Tipo**
```ts
interface ComponentOptions {
beforeMount?(this: ComponentPublicInstance): void
}
```
- **Detalhes**
Quando este gatilho é chamado, o componente terminou de configurar o seu estado reativo, mas ainda nenhum dos nós de DOM foi criado. Está prestes a executar o seu efeito de interpretação de DOM pela primeira vez.
**Este gatilho não é chamado durante a interpretação no lado do servidor.**
## `mounted` {#mounted}
Chamado depois do componente ter sido montado.
- **Tipo**
```ts
interface ComponentOptions {
mounted?(this: ComponentPublicInstance): void
}
```
- **Detalhes**
Um componente é considerado montado depois:
- De todos os seus componentes filhos síncronos terem sido montados (isto não inclui componentes assíncronos ou componentes dentro das árvores do `
`).
- Da sua própria árvore do DOM ter sido criada e inserida no contentor pai. Nota que isto apenas garante que a árvore do DOM do componente está no documento se o contentor da raiz da aplicação também estiver no documento.
Este gatilho é normalmente usado para executar os efeitos colaterais que precisam do acesso ao DOM interpretado do componente, ou para limitar o código relacionado ao DOM para o cliente numa [aplicação interpretada no servidor](/guide/scaling-up/ssr).
**Este gatilho não é chamado durante a interpretação no lado do servidor.**
## `beforeUpdate` {#beforeupdate}
Chamada bem antes do componente estiver prestes a atualizar a sua árvore do DOM devido à uma mudança de estado reativo.
- **Tipo**
```ts
interface ComponentOptions {
beforeUpdate?(this: ComponentPublicInstance): void
}
```
- **Detalhes**
Este gatilho pode ser usado para acessar o estado do DOM antes da Vue atualizar o DOM. Também é seguro modificar o estado do componente dentro deste gatilho.
**Este gatilho não é chamado durante a interpretação no lado do servidor.**
## `updated` {#updated}
Chamada depois do componente ter atualizado a sua árvore do DOM devido à uma mudança de estado reativo.
- **Tipo**
```ts
interface ComponentOptions {
updated?(this: ComponentPublicInstance): void
}
```
- **Detalhes**
Uma gatilho `updated` dum componente pai é chamado depois do `updated` dos seus componentes filhos.
Este gatilho é chamado depois de qualquer atualização do DOM do componente, que pode ser causada por diferentes mudanças de estado. Se precisarmos acessar o DOM atualizado depois duma mudança de estado específica, devemos usar [`nextTick()`](/api/general#nexttick).
**Este gatilho não é chamado durante a interpretação no lado do servidor.**
:::warning AVISO
Não altere o estado do componente no gatilho `updated` - isto provavelmente conduzirá à um laço de atualização infinita!
:::
## `beforeUnmount` {#beforeunmount}
Chamada bem antes duma instância de componente estiver a ser desmontada.
- **Tipo**
```ts
interface ComponentOptions {
beforeUnmount?(this: ComponentPublicInstance): void
}
```
- **Detalhes**
Quando este gatilho é chamado, a instância do componente permanece completamente funcional.
**Este gatilho não é chamado durante a interpretação no lado do servidor.**
## `unmounted` {#unmounted}
Chamada depois do componente ter sido desmontado.
- **Tipo**
```ts
interface ComponentOptions {
unmounted?(this: ComponentPublicInstance): void
}
```
- **Detalhes**
Um componente é considerado desmontado depois:
- De todos os seus componentes filhos terem sido desmontados.
- De todos os seus efeitos reativos associados (efeito de interpretação e computado ou observadores criados durante a `setup()`) terem sido interrompidos.
Use este gatilho para limpar os efeitos colaterais criados manualmente tais como temporizadores, ouvintes de eventos de DOM oou conexões de servidor.
**Este gatilho não é chamado durante a interpretação no lado do servidor.**
## `errorCaptured` {#errorcaptured}
Chamada quando um erro propagando-se a partir dum componente descendente tiver sido capturado.
- **Tipo**
```ts
interface ComponentOptions {
errorCaptured?(
this: ComponentPublicInstance,
err: unknown,
instance: ComponentPublicInstance | null,
info: string
): boolean | void
}
```
- **Detalhes**
Os erros podem ser capturados a partir das seguintes fontes:
- Interpretadores de componente
- Manipuladores de evento
- Gatilhos do ciclo de vida
- função `setup()`
- Observadores
- Gatilhos de diretiva personalizada
- Gatilhos de transição
O gatilho recebe três argumentos: o erro, a instância do componente que acionou o erro, e uma sequência de caracteres de informação especificando o tipo da fonte do erro.
:::tip DICA
Em produção, o terceiro argumento (`info`) será um código encurtado ao invés da sequência de caracteres da informação completa. Nós podemos encontrar o código ao mapeamento da sequência de caracteres na [Referência do Código de Erro de Produção](/error-reference/#runtime-errors).
:::
Nós podemos modificar o estado do componente na `errorCaptured()` para exibir um estado de erro ao utilizador. No entanto, é importante que o estado de erro não interprete o conteúdo original que causou o erro; de outro modo o componente será lançado para um laço de interpretação infinita.
O gatilho pode retornar `false` para impedir o erro de propagar-se mais. Consulte os detalhes sobre a propagação de erro abaixo.
**Regras de Propagação de Erros**
- Por padrão, todos os erros ainda serão enviados para o nível de aplicação [`app.config.errorHandler`](/api/application#app-config-errorhandler) se for definido, para que estes erros possam ser relatados à um serviço de análises num único lugar.
- Se vários gatilhos de `errorCaptured` existirem numa cadeia de herança de componentes ou em uma cadeia de pais, todos serão invocados com o mesmo erro, na ordem de baixo para cima. Isto é semelhante ao mecanismo borbulhante de eventos de DOM nativos.
- Se o próprio gatilho `errorCaptured` lançar um erro, tanto este erro quanto o erro original capturado serão enviados à `app.config.errorHandler`.
- Um gatilho `errorCaptured` pode retornar `false` para evitar que o erro continue a propagar-se. Isto significa essencialmente que "este erro já foi manipulado e deve ser ignorado". Ele evitará quaisquer gatilhos `errorCaptured` adicionais ou `app.config.errorHandler` de serem invocados por este erro.
## `renderTracked` {#rendertracked}
Chamada quando uma dependência reativa tiver sido rastreada pelo efeito de interpretação do componente.
**Este gatilho é apenas para o modo de desenvolvimento e não é chamado durante a interpretação no lado do servidor.**
- **Tipo**
```ts
interface ComponentOptions {
renderTracked?(this: ComponentPublicInstance, e: DebuggerEvent): void
}
type DebuggerEvent = {
effect: ReactiveEffect
target: object
type: TrackOpTypes /* 'get' | 'has' | 'iterate' */
key: any
}
```
- **Consulte também** [Reatividade em Profundidade](/guide/extras/reactivity-in-depth)
## `renderTriggered` {#rendertriggered}
Chamada quando uma dependência reativa acionar o efeito de interpretação do componente a ser executado novamente.
**Este gatilho é apenas para o modo de desenvolvimento e não é chamado durante a interpretação no lado do servidor.**
- **Tipo**
```ts
interface ComponentOptions {
renderTriggered?(this: ComponentPublicInstance, e: DebuggerEvent): void
}
type DebuggerEvent = {
effect: ReactiveEffect
target: object
type: TriggerOpTypes /* 'set' | 'add' | 'delete' | 'clear' */
key: any
newValue?: any
oldValue?: any
oldTarget?: Map | Set
}
```
- **Consulte também** [Reatividade em Profundidade](/guide/extras/reactivity-in-depth)
## `activated` {#activated}
Chamada depois da instância do componente for inserida no DOM como parte duma árvore armazenada para consulta imediata pelo [``](/api/built-in-components#keepalive).
**Este gatilho não é chamado durante a interpretação no lado do servidor.**
- **Tipo**
```ts
interface ComponentOptions {
activated?(this: ComponentPublicInstance): void
}
```
- **Consulte também** [Guia - Ciclo de Vida da Instância Armazenada para Consulta Imediata](/guide/built-ins/keep-alive#lifecycle-of-cached-instance)
## `deactivated` {#deactivated}
Chamada depois da instância do componente ser removida do DOM como parte duma árvore armazenada para consulta imediata pelo [``](/api/built-in-components#keepalive).
**Este gatilho não é chamado durante a interpretação no lado do servidor.**
- **Tipo**
```ts
interface ComponentOptions {
deactivated?(this: ComponentPublicInstance): void
}
```
- **Consulte também** [Guia - Ciclo de Vida da Instância Armazenada para Consulta Imediata](/guide/built-ins/keep-alive#lifecycle-of-cached-instance)
## `serverPrefetch` {#serverprefetch}
Função assíncrona a ser resolvida antes da instância do componente estiver à ser interpretada no servidor.
- **Tipo**
```ts
interface ComponentOptions {
serverPrefetch?(this: ComponentPublicInstance): Promise
}
```
- **Detalhes**
Se um gatilho retornar uma promessa, o interpretador do servidor aguardará até a promessa ser resolvida antes de interpretar o componente.
Este gatilho é chamado apenas durante a interpretação no lado do servidor e pode ser usado para realizar requisição de dados apenas no servidor.
- **Exemplo**
```js
export default {
data() {
return {
data: null
}
},
async serverPrefetch() {
// componente é interpretado como parte da requisição inicial
// pré-requisita dados no servidor pois é mais rápido do que no cliente
this.data = await fetchOnServer(/* ... */)
},
async mounted() {
if (!this.data) {
// se data for null ao montar, significa que o componente
// é interpretado dinamicamente no cliente.
// Realizar uma requisição no lado do cliente.
this.data = await fetchOnClient(/* ... */)
}
}
}
```
- **Consulte também** [Interpretação no Lado do Servidor](/guide/scaling-up/ssr)
---
---
url: /api/options-composition.md
---
# Opções: Composição {#options-composition}
## `provide` {#provide}
Fornece valores que podem ser injetados pelos componentes descendentes.
- **Tipo**
```ts
interface ComponentOptions {
provide?: object | ((this: ComponentPublicInstance) => object)
}
```
- **Detalhes**
`provide` e [`inject`](#inject) são usadas ao mesmo tempo para permitir um componente ancestral servir como um injetor de dependência para todos os seus descendentes, independentemente de quão profunda é a hierarquia do componente, enquanto estiverem na mesma cadeia primaria.
A opção `provide` deve ser ou um objeto ou uma função que retorna um objeto. Este objeto contém as propriedades que estão disponíveis para a injeção para os seus descendentes. Nós podemos usar símbolos como chaves neste objeto.
- **Exemplo**
Uso básico:
```js
const s = Symbol()
export default {
provide: {
foo: 'foo',
[s]: 'bar'
}
}
```
Usando uma função para fornecer o estado por componente:
```js
export default {
data() {
return {
msg: 'foo'
}
}
provide() {
return {
msg: this.msg
}
}
}
```
Nota que no exemplo acima, a `msg` fornecida NÃO será reativa. Consulte [Trabalhando com a Reatividade](/guide/components/provide-inject#working-with-reactivity) por mais detalhes.
- **Consulte também** [Fornecer ou Injetar](/guide/components/provide-inject)
## `inject` {#inject}
Declara as propriedades a injetar no componente atual localizando-as a partir dos fornecedores ancestrais.
- **Tipo**
```ts
interface ComponentOptions {
inject?: ArrayInjectOptions | ObjectInjectOptions
}
type ArrayInjectOptions = string[]
type ObjectInjectOptions = {
[key: string | symbol]:
| string
| symbol
| { from?: string | symbol; default?: any }
}
```
- **Detalhes**
A opção `inject` deve ser:
- Um vetor de sequências de caracteres, ou
- Um objeto onde as chaves são o nome de vínculo local e o valor é ou:
- A chave (sequência de caracteres ou símbolo) à procurar nas injeções disponíveis, ou
- Um objeto onde:
- A propriedade `from` é a chave (sequência de caracteres ou símbolo) à procurar nas injeções disponíveis, e
- A propriedade `default` é usada como valor de retrocesso. Semelhante aos valores padrão das propriedades, uma função de fábrica é necessária para os tipos de objeto para impedir a partilha de valor entre várias instância do componente.
Uma propriedade injetada será `undefined` se nenhuma propriedade correspondente e nem um valor padrão foi fornecido.
Nota que os vínculos injetados NÃO são reativos. Isto é intencional. No entanto, se o valor injetado for um objeto reativo, as propriedades deste objeto permanecem reativas. Consulte [Trabalhando com a Reatividade](/guide/components/provide-inject#working-with-reactivity) por mais detalhes.
- **Exemplo**
Uso básico:
```js
export default {
inject: ['foo'],
created() {
console.log(this.foo)
}
}
```
Usando um valor injetado como padrão para uma propriedade:
```js
const Child = {
inject: ['foo'],
props: {
bar: {
default() {
return this.foo
}
}
}
}
```
Usando um valor injetado como entrada de dados:
```js
const Child = {
inject: ['foo'],
data() {
return {
bar: this.foo
}
}
}
```
As injeções podem ser opcionais com valor padrão:
```js
const Child = {
inject: {
foo: { default: 'foo' }
}
}
```
Se precisar ser injetado a partir duma propriedade com um nome diferente, use `from` para denotar a propriedade da fonte:
```js
const Child = {
inject: {
foo: {
from: 'bar',
default: 'foo'
}
}
}
```
Semelhante aos padrões de propriedade, precisamos usar uma função de fábrica para os valores não primitivos:
```js
const Child = {
inject: {
foo: {
from: 'bar',
default: () => [1, 2, 3]
}
}
}
```
- **Consulte também** [Fornecer ou Injetar](/guide/components/provide-inject)
## `mixins` {#mixins}
Uma vetor de objetos opcionais a serem misturados no componente atual.
- **Tipo**
```ts
interface ComponentOptions {
mixins?: ComponentOptions[]
}
```
- **Detalhes**
A opção `mixins` aceita um vetor de objetos de mistura. Estes objetos de mistura podem conter opções de instância como objetos de instância normais, e serão combinadas contra as opções eventuais usando a lógica de combinação de opção certa. Por exemplo, se a nossa mistura contiver um gatilho `updated` e o próprio componente também tiver um, ambas funções serão chamadas.
Os gatilhos da mistura são chamados na ordem que são fornecidos, e chamados bem antes dos gatilhos do próprio componente.
:::warning NÃO É MAIS RECOMENDADO
Na Vue 2, as misturas eram o mecanismo primário para criação de pedaços reutilizáveis da lógica do componente. Embora as misturas continuam a ser suportadas na Vue 3, as [Funções de Composição usando a API de Composição](/guide/reusability/composables) agora são a abordagem preferida para reutilização de código entre os componentes.
:::
- **Exemplo**
```js
const mixin = {
created() {
console.log(1)
}
}
createApp({
created() {
console.log(2)
},
mixins: [mixin]
})
// => 1
// => 2
```
## `extends` {#extends}
Um componente de "classe de base" a partir do qual estender.
- **Type:**
```ts
interface ComponentOptions {
extends?: ComponentOptions
}
```
- **Detalhes**
Permite que um componente estenda outro, herdando suas opções de componente.
A partir duma perspetiva de implementação, `extends` é quase idêntico à `mixins`. O componente especificado pela `extends` será tratado como se fosse a primeira mistura.
No entanto, `extends` e `mixins` expressam diferentes intenções. A opção `mixins` é primariamente usada para compor pedaços de funcionalidade, ao passo que `extends` está primariamente preocupada com a herança.
Tal como acontece com a `mixins`, quaisquer opções (exceto para `setup()`) serão combinadas usando a estratégia de combinação relevante.
- **Exemplo**
```js
const CompA = { ... }
const CompB = {
extends: CompA,
...
}
```
:::warning NÃO RECOMENDADA PARA API DE COMPOSIÇÃO
`extends` está desenhada para a API de Opções e não lida com a combinação do gatilho `setup()`.
Na API de Composição, o modelo mental preferido para reutilização da lógica é "composição" acima da "herança". Se tivermos lógica dum componente que precisa ser reutilizada num outro, consideramos extrair a lógica relevante para uma [Função de Composição](/guide/reusability/composables#composables).
Se ainda tencionamos "estender" um componente usando a API de Composição, podemos chamar a `setup()` do componente de base na `setup()` do componente que se estende:
```js
import Base from './Base.js'
export default {
extends: Base,
setup(props, ctx) {
return {
...Base.setup(props, ctx),
// vínculos locais
}
}
}
```
:::
---
---
url: /api/options-state.md
---
# Opções: Estado {#options-state}
## `data` {#data}
Uma função que retorna o estado reativo inicial para a instância do componente.
- **Tipo**
```ts
interface ComponentOptions {
data?(
this: ComponentPublicInstance,
vm: ComponentPublicInstance
): object
}
```
- **Detalhes**
Espera-se que a função retorne um objeto de JavaScript simples, que será tornado reativo pela Vue. Depois da instância ser criada, o objeto de dados reativo pode ser acessado com `this.$data`. A instância do componente também delega todas as propriedades encontradas no objeto de dados, então `this.a` será equivalente à `this.$data.a`.
Todas as propriedades de dados de alto nível devem ser incluídas no objeto de dados retornado. A adição de novas propriedades à `this.$data` é possível, mas *não* é recomendada. Se o valor desejado duma propriedade ainda não estiver disponível, então um valor vazio tal como `undefined` ou `null` deveria ser incluído como preservador de lugar para garantir que a Vue saiba que a propriedade existe.
As propriedades que começam com `_` ou `$` **não** serão delegadas na instância do componente porque podem entrar em conflito com as propriedades internas e métodos da API da Vue. Nós teremos de acessá-las como `this.$data._property`.
**Não** é recomendado retornar objetos com os seus próprios comportamentos de estado, como objetos da API do navegador e propriedades do protótipo. O objeto retornado deveria ser idealmente um objeto simples que apenas representa o estado do componente.
- **Exemplo**
```js
export default {
data() {
return { a: 1 }
},
created() {
console.log(this.a) // 1
console.log(this.$data) // { a: 1 }
}
}
```
Nota que se usarmos uma função de seta com a propriedade `data`, o `this` não será a instância do componente, mas ainda podemos acessar a instância como o primeiro argumento da função:
```js
data: (vm) => ({ a: vm.myProp })
```
- **Consulte também** a [Reatividade em Profundidade](/guide/extras/reactivity-in-depth)
## `props` {#props}
Declara as propriedades dum componente.
- **Tipo**
```ts
interface ComponentOptions {
props?: ArrayPropsOptions | ObjectPropsOptions
}
type ArrayPropsOptions = string[]
type ObjectPropsOptions = { [key: string]: Prop }
type Prop = PropOptions | PropType | null
interface PropOptions {
type?: PropType
required?: boolean
default?: T | ((rawProps: object) => T)
validator?: (value: unknown, rawProps: object) => boolean
}
type PropType = { new (): T } | { new (): T }[]
```
> Os tipos estão simplificados por questões de legibilidade.
- **Detalhes**
Na Vue, todas as propriedades do componente precisam ser explicitamente declaradas. As propriedades podem ser declaradas de duas formas:
- De forma simples usando um vetor de sequências de caracteres
- De forma completa usando um objeto onde cada chave de propriedade é o nome da propriedade, e o valor é o tipo da propriedade (uma função construtura) ou opções avançadas.
Com a sintaxe baseada em objetos, cada propriedade pode ainda definir as seguintes opções:
- **`type`**: Pode ser um dos seguintes construtores nativos: `String`, `Number`, `Boolean`, `Array`, `Object`, `Date`, `Function`, `Symbol`, qualquer função construtora personalizada ou um vetor destes. No modo de desenvolvimento, a Vue verificará se o valor duma propriedade corresponde o tipo declarado, e lançará um aviso se não corresponder. Consulte a [Validação de Propriedade](/guide/components/props#prop-validation) por mais detalhes.
Além disto nota que uma propriedade com o tipo `Boolean` afeta o seu comportamento de moldagem de valores em ambos desenvolvimento e produção. Consulte a [Moldagem Booleana](/guide/components/props#boolean-casting) por mais detalhes.
- **`default`**: Especifica o valor padrão duma propriedade quando não é passada pelo pai ou quando tem o valor `undefined`. Os valores padrão de objeto ou vetor devem ser retornados usando uma função de fábrica. A função de fábrica também recebe o objeto de propriedades puro como argumento.
- **`required`**: Define se a propriedade é obrigatória. Num ambiente que não é de produção, um aviso na consola será lançado se este valor for verdadeiro e a propriedade não for passada.
- **`validator`**: Função de validação personalizada que recebe o valor da propriedade como o único argumento. No modo de desenvolvimento, um aviso da consola será lançado se esta função retornar um valor falso (por exemplo, se a validação falhar).
- **Exemplo**
Declaração simples:
```js
export default {
props: ['size', 'myMessage']
}
```
Declaração de objeto com validações:
```js
export default {
props: {
// verificação de tipo
height: Number,
// verificação de tipo mais outras validações
age: {
type: Number,
default: 0,
required: true,
validator: (value) => {
return value >= 0
}
}
}
}
```
- **Consulte também:**
- [Guia - Propriedades](/guide/components/props)
- [Guia - Tipos para as Propriedades dos Componentes](/guide/typescript/options-api#typing-component-props)
## `computed` {#computed}
Declara propriedades computadas a serem expostas na instância do componente.
- **Tipo**
```ts
interface ComponentOptions {
computed?: {
[key: string]: ComputedGetter | WritableComputedOptions
}
}
type ComputedGetter = (
this: ComponentPublicInstance,
vm: ComponentPublicInstance
) => T
type ComputedSetter = (
this: ComponentPublicInstance,
value: T
) => void
type WritableComputedOptions = {
get: ComputedGetter
set: ComputedSetter
}
```
- **Detalhes**
A opção aceita um objeto onde a chave é o nome da propriedade computada, e o valor é ou um recuperador computado, ou um objeto com métodos `get` e `set` (para as propriedades computadas graváveis).
Todos os recuperadores e definidores têm o seu próprio contexto de `this` automaticamente vinculado à instância do componente.
Nota que se estivermos a usar uma função de seta com uma propriedade computada, `this` não apontará para a instância do componente, mas ainda podemos acessar a instância como o primeiro argumento da função:
```js
export default {
computed: {
aDouble: (vm) => vm.a * 2
}
}
```
- **Exemplo**
```js
export default {
data() {
return { a: 1 }
},
computed: {
// somente leitura
aDouble() {
return this.a * 2
},
// gravável
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
}
}
```
- **Consulte também**
- [Guia - Propriedades Computadas](/guide/essentials/computed)
- [Guia - Tipos para as Propriedades Computadas](/guide/typescript/options-api#typing-computed-properties)
## `methods` {#methods}
Declara métodos a serem misturados à instância do componente.
- **Tipo**
```ts
interface ComponentOptions {
methods?: {
[key: string]: (this: ComponentPublicInstance, ...args: any[]) => any
}
}
```
- **Detalhes**
Os métodos declarados podem ser acessados diretamente na instância do componente, ou usados nas expressões do modelo de marcação. Todos os métodos têm o seu contexto de `this` automaticamente vinculado à instância do componente, mesmo quando passados.
Devemos evitar funções de seta quando declaramos métodos, porque não terão acesso à instância do componente através de `this`.
- **Exemplo**
```js
export default {
data() {
return { a: 1 }
},
methods: {
plus() {
this.a++
}
},
created() {
this.plus()
console.log(this.a) // => 2
}
}
```
- **Consulte também** a [Manipulação de Evento](/guide/essentials/event-handling)
## `watch` {#watch}
Declara as funções de resposta de observação a serem invocadas sobre a mudança de dados.
- **Tipo**
```ts
interface ComponentOptions {
watch?: {
[key: string]: WatchOptionItem | WatchOptionItem[]
}
}
type WatchOptionItem = string | WatchCallback | ObjectWatchOptionItem
type WatchCallback = (
value: T,
oldValue: T,
onCleanup: (cleanupFn: () => void) => void
) => void
type ObjectWatchOptionItem = {
handler: WatchCallback | string
immediate?: boolean // predefinido como: false
deep?: boolean // predefinido como: false
flush?: 'pre' | 'post' | 'sync' // predefinido como: 'pre'
onTrack?: (event: DebuggerEvent) => void
onTrigger?: (event: DebuggerEvent) => void
}
```
> Os tipos estão simplificados por questões de legibilidade.
- **Detalhes**
A opção `watch` espera um objeto onde as chaves estão as propriedades reativas da instância do componente a serem observadas (por exemplo, as propriedades declaradas através da `data` ou `computed`) — e os seus valores são as funções de resposta correspondentes. A função de resposta recebe o novo valor e o valor antigo da fonte observada.
Além das propriedades do nível da raiz, a chave também pode ser um caminho simples delimitado por pontos, por exemplo, `a.b.c`. Nota que este uso **não** suporta expressões complexas - apenas caminhos delimitados por ponto são suportados. Se precisarmos de observar fontes de dados complexas, devemos usar a API [`$watch()`](/api/component-instance#watch) imperativa.
O valor também pode ser a sequência de caracteres dum nome de método (declarado através dos `methods`), ou um objeto que contém opções adicionais. Quando usamos a sintaxe de objeto, a função de resposta deve ser declarada sob o campo `handler`. As propriedades adicionais incluem:
- **`immediate`**: aciona a função de resposta imediatamente sobre a criação do observador. O valor antigo será `undefined` na primeira chamada.
- **`deep`**: força a travessia profunda da fonte se for um objeto ou um vetor, para que a função de resposta dispare sobre as mutações profundas. Consulte os [Observadores Profundos](/guide/essentials/watchers#deep-watchers).
- **`flush`**: ajusta o tempo de descarga da função de resposta. Consulte o [Tempo de Descarga da Função de Resposta](/guide/essentials/watchers#callback-flush-timing) e a [`watchEffect()`](/api/reactivity-core#watcheffect).
- **`onTrack / onTrigger`**: depura as dependências do observador. Consulte a [Depuração do Observador](/guide/extras/reactivity-in-depth#watcher-debugging).
Devemos evitar usar funções de seta quando declaramos funções de resposta de observação porque não terão acesso à instância do componente através de `this`.
- **Exemplo**
```js
export default {
data() {
return {
a: 1,
b: 2,
c: {
d: 4
},
e: 5,
f: 6
}
},
watch: {
// observando uma propriedade de alto nível
a(val, oldVal) {
console.log(`nova: ${val}, antiga: ${oldVal}`)
},
// sequência de caracteres do nome do método
b: 'someMethod',
// a função de resposta será chamada sempre que alguma
// das propriedades do objeto observado mudar independente da
// sua profundidade encaixada.
c: {
handler(val, oldVal) {
console.log('c mudou')
},
deep: true
},
// observando uma única propriedade encaixada:
'c.d': function (val, oldVal) {
// fazer alguma coisa
},
// a função de resposta será chamada imediatamente
// após o início da observação
e: {
handler(val, oldVal) {
console.log('e mudou')
},
immediate: true
},
// podemos passar um vetor de funções de respostas,
// serão chamados um atrás do outro
f: [
'handle1',
function handle2(val, oldVal) {
console.log('handle2 disparado')
},
{
handler: function handle3(val, oldVal) {
console.log('handle3 disparado')
}
/* ... */
}
]
},
methods: {
someMethod() {
console.log('b mudou')
},
handle1() {
console.log('handle 1 disparado')
}
},
created() {
this.a = 3 // => novo: 3, antigo: 1
}
}
```
- **Consulte também** [Observadores](/guide/essentials/watchers)
## `emits` {#emits}
Declara os eventos personalizados emitidos pelo componente.
- **Tipo**
```ts
interface ComponentOptions {
emits?: ArrayEmitsOptions | ObjectEmitsOptions
}
type ArrayEmitsOptions = string[]
type ObjectEmitsOptions = { [key: string]: EmitValidator | null }
type EmitValidator = (...args: unknown[]) => boolean
```
- **Detalhes**
Os eventos emitidos podem ser declarados de duas formas:
- De forma simples usando um vetor de sequências de caracteres
- De forma completa usando um objeto onde cada chave de propriedade é o nome do evento, e o valor ou é `null` ou é uma função de validação.
A função de validação receberá argumentos adicionais passados para a chamada de `$emit` do componente. Por exemplo, se `this.$emit('foo', 1)` for chamado, a função de validação correspondente para `foo` receberá o argumento `1`. A função de validação deve retornar um booleano para indicar se os argumentos do evento são válidos.
Nota que a opção `emits` afeta os ouvintes de eventos que são considerados ouvintes de eventos do componente, em vez de ouvintes de eventos nativos do DOM. Os ouvintes para eventos declarados serão removidos do objeto `$attrs` do componente, assim não serão passados ao elemento raiz do componente. Consulte os [Atributos](/guide/components/attrs) por mais detalhes.
- **Exemplo**
Sintaxe de vetor:
```js
export default {
emits: ['check'],
created() {
this.$emit('check')
}
}
```
Sintaxe de objeto:
```js
export default {
emits: {
// sem validação
click: null,
// com validação
submit: (payload) => {
if (payload.email && payload.password) {
return true
} else {
console.warn(`Invalid submit event payload!`)
return false
}
}
}
}
```
- **Consulte também**
- [Guia - Atributos](/guide/components/attrs)
- [Guia - Tipos para as Emissões do Componente](/guide/typescript/options-api#typing-component-emits)
## `expose` {#expose}
Declara as propriedades públicas expostas quando a instância do componente for acessada por um pai através das referências do modelo de marcação.
- **Tipo**
```ts
interface ComponentOptions {
expose?: string[]
}
```
- **Detalhes**
Por padrão, uma instância de componente expõe todas as propriedades da instância ao pai quando acessada através de `$parent`, `$root`, ou referências do modelo de marcação. Isto pode ser indesejável, visto que um componente provavelmente possui estado interno ou métodos que devem permanecer privados para evitar associação rigorosa.
A opção `expose` espera uma lista de sequências de caracteres de nomes de propriedade. Quando `expose` for usada, apenas as propriedades explicitamente listadas serão expostas sobre a instância pública do componente.
`expose` apenas afeta as propriedades definidas pelo utilizador - não filtra as propriedades da instância do componente embutido.
- **Exemplo**
```js
export default {
// apenas `publicMethod` estará disponível na instância pública
expose: ['publicMethod'],
methods: {
publicMethod() {
// ...
},
privateMethod() {
// ...
}
}
}
```
---
---
url: /api/options-rendering.md
---
# Opções: Interpretação {#options-rendering}
## `template` {#template}
Um modelo de marcação de sequência de caracteres para o componente.
- **Type**
```ts
interface ComponentOptions {
template?: string
}
```
- **Detalhes**
Um modelo de marcação fornecido através da opção `template` que será compilada instantaneamente em tempo de execução. É suportado apenas quando usamos uma construção de Vue que inclui o compilador de modelo de marcação. O compilador de modelo de marcação **NÃO** está incluído nas construções de Vue que têm a palavra `runtime` em seus nomes, por exemplo. `vue.runtime.esm-bundler.js`. Consulte o [guia de ficheiro de distribuição](https://github.com/vuejs/core/tree/main/packages/vue#which-dist-file-to-use) por mais detalhes sobre as diferentes construções.
Se a sequência de caracteres começar com `#` será usada como uma `querySelector` e usará o `innerHTML` do elemento selecionado como modelo de marcação de sequência de caracteres. Isto permite o modelo de marcação da fonte ser escrito usando elementos `` nativos.
Se a opção `render` também estiver presente no mesmo componente, o `template` será ignorado.
Se o componente de raiz da nossa aplicação não tiver uma opção `template` ou `render` especificada, a Vue tentará usar o `innerHTML` do elemento montado como modelo de marcação.
:::warning Aviso de Segurança
Só deveríamos usar modelos de marcação de fontes que possamos confiar. Não devemos usar conteúdo fornecido pelo utilizador como nosso modelo de marcação. Consulte o [Guia de Segurança](/guide/best-practices/security#rule-no-1-never-use-non-trusted-templates) por mais detalhes.
:::
## `render` {#render}
Uma função que retorna programaticamente a árvore de DOM virtual do componente.
- **Tipo**
```ts
interface ComponentOptions {
render?(this: ComponentPublicInstance) => VNodeChild
}
type VNodeChild = VNodeChildAtom | VNodeArrayChildren
type VNodeChildAtom =
| VNode
| string
| number
| boolean
| null
| undefined
| void
type VNodeArrayChildren = (VNodeArrayChildren | VNodeChildAtom)[]
```
- **Detalhes:**
`render` é uma alternativa aos modelos de marcação de sequência de caracteres que permite-nos influenciar todo o poder programático da JavaScript de declarar a saída da interpretação do componente.
Os modelos de marcação pré-compilados, por exemplo aqueles nos Componentes de Ficheiro Único, são compilados para a opção `render` em tempo de construção. Se ambos `render` e `template` estiverem presentes num componente, `render` receberá prioridade mais alta.
- **Consulte também**
- [Mecanismo de Interpretação](/guide/extras/rendering-mechanism)
- [Funções de Interpretação](/guide/extras/render-function)
## `compilerOptions` {#compileroptions}
Configura as opções do compilador de tempo de execução para o modelo de marcação do componente.
- **Tipo**
```ts
interface ComponentOptions {
compilerOptions?: {
isCustomElement?: (tag: string) => boolean
whitespace?: 'condense' | 'preserve' // predefinido como: 'condense'
delimiters?: [string, string] // predefinido como: ['{{', '}}']
comments?: boolean // predefinido como: false
}
}
```
- **Detalhes**
Esta opção de configuração só é respeitada quando usamos a construção completa (por exemplo, o `.vue.js` autónomo que pode compilar modelos de marcação no navegador). Ela suporta as mesmas opções que o [`app.config.compilerOptions`](/api/application#app-config-compileroptions) do nível de aplicação, e tem prioridade mais alta para o componente atual.
- **Consulte também** [`app.config.compilerOptions`](/api/application#app-config-compileroptions)
## `slots` {#slots}
Uma opção para ajudar com a inferência de tipo quando usamos ranhuras programaticamente nas funções de interpretação. Apenas suportado na 3.3+.
- **Detalhes**
Este valor de tempo de execução da opção não é usado. Os tipos verdadeiros devem ser declarados através da moldagem de tipo usando o tipo auxiliar `SlotsType`:
```ts
import { SlotsType } from 'vue'
defineComponent({
slots: Object as SlotsType<{
default: { foo: string; bar: number }
item: { data: number }
}>,
setup(props, { slots }) {
expectType<
undefined | ((scope: { foo: string; bar: number }) => any)
>(slots.default)
expectType any)>(
slots.item
)
}
})
```
---
---
url: /api/options-misc.md
---
# Opções: Outros {#options-misc}
## `name` {#name}
Explicitamente declara um nome de exibição para o componente.
Declara explicitamente um nome de exibição para o componente.
- **Tipo**
```ts
interface ComponentOptions {
name?: string
}
```
- **Detalhes**
O nome dum componente é usado para o seguinte:
- Auto-referência recursiva no modelo de marcação do próprio componente
- Exibição na árvore de inspeção de componentes das ferramentas de programação da Vue
- Exibição em traços de componentes de aviso
Quando usamos os componentes de ficheiro único, o componente já infere o seu próprio nome a partir do nome do ficheiro. Por exemplo, um ficheiro chamado `MyComponent.vue` terá o nome de exibição inferido "MyComponent".
Um outro caso é que quando um componente é registado globalmente com [`app.component`](/api/application#app-component), o identificador global é definido automaticamente como seu nome.
A opção `name` permite-nos sobrepor o nome inferido, ou explicitamente fornecer um nome quando nenhum nome puder ser inferido (por exemplo, quando não estamos usando ferramentas de construção, ou um componente que não é de ficheiro único embutido).
Existe um caso onde `name` é explicitamente necessário: quando correspondemos contra componentes passíveis de armazenamento de consulta imediata no [``](/guide/built-ins/keep-alive) através das suas propriedades `include / exclude`.
:::tip DICA
Desde a versão 3.2.34, um componente de ficheiro único usando `
{{ label }}
```
- **Consultar também** [Atributos de Passagem](/guide/components/attrs)
## `components` {#components}
Um objeto que regista os componentes a serem disponibilizados à instância do componente.
- **Tipo**
```ts
interface ComponentOptions {
components?: { [key: string]: Component }
}
```
- **Exemplo**
```js
import Foo from './Foo.vue'
import Bar from './Bar.vue'
export default {
components: {
// abreviatura
Foo,
// registar sob um nome diferente
RenamedBar: Bar
}
}
```
- **Consultar também** [Registo de Componente](/guide/components/registration)
## `directives` {#directives}
Um objeto que regista as diretivas a serem disponibilizadas à instância do componente.
- **Tipo**
```ts
interface ComponentOptions {
directives?: { [key: string]: Directive }
}
```
- **Exemplo**
```js
export default {
directives: {
// ativa `v-focus` no modelo de marcação
focus: {
mounted(el) {
el.focus()
}
}
}
}
```
```vue-html
```
Um dicionário de diretivas a serem disponibilizadas à instância do componente.
- **Consultar também** [Diretivas Personalizadas](/guide/reusability/custom-directives)
---
---
url: /guide/built-ins/keep-alive.md
---
# Preservação de Componente {#keepalive}
O `