You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: src/guide/render-function.md
+45-44Lines changed: 45 additions & 44 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,24 +1,24 @@
1
1
# Funções de Renderização
2
2
3
-
Vue recomenda o uso de templates para construir aplicações na grande maioria dos casos. No entanto, existem situações onde precisamos de todo o poder programático do JavaScript. É aí onde podemos utilizar a **função de renderização**.
3
+
Vue recomenda o uso de _templates_ para construir aplicações na grande maioria dos casos. No entanto, existem situações onde precisamos de todo o poder programático do JavaScript. É aí onde podemos utilizar a **função de renderização**.
4
4
5
-
Vamos mergulhar em um exemplo onda uma função `render()` seria prática. Digamos que queremos gerar um título ancorado:
5
+
Vamos mergulhar em um exemplo onde uma função `render()` seria prática. Digamos que queremos gerar um título ancorados:
6
6
7
7
```html
8
8
<h1>
9
9
<aname="hello-world"href="#hello-world">
10
-
Hello world!
10
+
Olá mundo!
11
11
</a>
12
12
</h1>
13
13
```
14
14
15
-
Títulos ancorados são usados frequentemente, nós poderíamos criar um componente:
15
+
Títulos ancorados são usados frequentemente, deveríamos criar um componente:
Este template não parece bom. Não apenas é verboso, como também estamos duplicando o `<slot></slot>` para cada nível de título. E quando adicionarmos o elemento de âncora, teríamos que duplicá-lo em cada ramo `v-if/v-else-if`.
56
+
Este _template_ não parece bom. Não apenas é verboso, como também estamos duplicando o `<slot></slot>` para cada nível de título. E quando adicionarmos o elemento de âncora, teríamos que duplicá-lo em cada ramo `v-if/v-else-if`.
57
57
58
-
Enquanto que templates funcionam muito bem para a maioria dos componentes, fica claro que este não é um deles. Então, vamos tentar reescreve-lo com uma função `render()`:
58
+
Enquanto que _templates_ funcionam muito bem para a maioria dos componentes, fica claro que este não é um deles. Então, vamos tentar reescrevê-lo com uma função `render()`:
A implementação da função `render()` é muito mais simples, mas também requer mais familiaridade com as propriedades das instâncias de componentes. Nesse caso, você deve saber que quando você passar filhos sem uma diretiva `v-slot` para um componente, como o `Hello world!` dentro do `anchored-heading`, esses filhos serão armazenados na instância do componente em `$slots.default()`. Se você já não tiver feito ainda.**é recomendado ler a [API de propriedades de instância](../api/instance-properties.html) antes de mergulhar nas funções de renderização.**
82
+
A implementação da função `render()` é muito mais simples, mas também requer mais familiaridade com as propriedades das instâncias dos componentes. Nesse caso, você deve saber que quando você passar filhos sem uma diretiva `v-slot` para um componente, como o `Olá mundo!` dentro do `anchored-heading`, esses filhos serão armazenados na instância do componente em `$slots.default()`. Se você já não tiver feito ainda,**é recomendado ler a [API de propriedades de instância](../api/instance-properties.html) antes de mergulhar nas funções de renderização.**
83
83
84
-
## A árvore DOM
84
+
## A Árvore DOM
85
85
86
-
Antes de adentrarmos nas funções de renderização, é importante conhecer um pouco sobre como os navegadores funcionam. Veja esse exemplo de HTML:
86
+
Antes de mergulharmos nas funções de renderização, é importante conhecer um pouco sobre como os navegadores funcionam. Veja esse HTML como exemplo:
87
87
88
88
```html
89
89
<div>
90
-
<h1>My title</h1>
91
-
Some text content
92
-
<!-- TODO: Add tagline-->
90
+
<h1>Meu título</h1>
91
+
Algum conteúdo em texto
92
+
<!-- TODO: Adicionar slogan-->
93
93
</div>
94
94
```
95
95
96
96
Quando um navegador lê este código, ele compila uma [árvore de "nós DOM"](https://javascript.info/dom-nodes) para ajudá-lo a acompanhar tudo.
97
97
98
98
A árvore de nós DOM para o HTML acima se parece com isso:
99
99
100
-

100
+

101
101
102
-
Cada elemento é uma nó. Cada trecho de texto é um nó. Até mesmo comentários são nós! Cada nó pode possuír filhos (i.e. cada nó pode conter outros nós).
102
+
Cada elemento é um nó. Cada trecho de texto é um nó. Até mesmo comentários são nós! Cada nó pode possuír filhos (i.e. cada nó pode conter outros nós).
103
103
104
-
Atualizar todos esses nós eficientemente pode ser difícil, mas felizmente, nós nunca precisamos fazê-lo manualmente. Ao invés disso, nós dizemos ao Vue qual HTML nós queremos na página, em um template:
104
+
Atualizar todos esses nós eficientemente pode ser difícil, mas felizmente, nós nunca precisamos fazê-lo manualmente. Ao invés disso, nós dizemos ao Vue qual HTML nós queremos na página, em um _template_:
105
105
106
106
```html
107
107
<h1>{{ blogTitle }}</h1>
@@ -115,19 +115,19 @@ render() {
115
115
}
116
116
```
117
117
118
-
E em ambos os casos, o Vue automaticamente mantem a página atualizada, até mesmo quando o `blogTitle` muda.
118
+
E em ambos os casos, o Vue automaticamente mantém a página atualizada, até mesmo quando o `blogTitle` muda.
119
119
120
-
## A árvore Virtual DOM
120
+
## A Árvore Virtual DOM
121
121
122
-
Vue mantem a página atualizada compilando um **DOM virtual** para acompanhar as mudanças que necessita para fazer o DOM real. Olhando a seguinte linha mais de perto:
122
+
Vue mantém a página atualizada compilando um **DOM virtual** para acompanhar as mudanças que necessita para fazer o DOM real. Olhando a seguinte linha mais de perto:
123
123
124
124
```js
125
125
returnVue.h('h1', {}, this.blogTitle)
126
126
```
127
127
128
-
O que função `h()` retorna? Não é _exatamente_ um elemento DOM real. Ela retorna um objeto que contém informações que descrevem para o Vue que tipo de nó deve ser renderizado na página, incluíndo descrições de qualquer nó filho. Chamamos essa descrição do nó de "nó virtual", geralmente abreviado para **_VNode_**. "Virtual DOM" é como chamamos toda a árvore de _VNodes_, constituída de uma árvore de componentes Vue.
128
+
O que a função `h()` retorna? Não é _exatamente_ um elemento DOM real. Ela retorna um objeto que contém informações que descrevem para o Vue que tipo de nó deve ser renderizado na página, incluíndo descrições de qualquer nó filho. Chamamos essa descrição do nó de "nó virtual", geralmente abreviado para **_VNode_**. "Virtual DOM" é como chamamos toda a árvore de _VNodes_, constituída de uma árvore de componentes Vue.
129
129
130
-
## Argumentos de`h()`
130
+
## Argumentos do`h()`
131
131
132
132
A função `h()`é um utilitário para criar _VNodes_. Poderia, talvez, ser nomeado com mais precisão como `createVNode()`, mas é chamada `h()` devido ao uso frequente e por brevidade. Ela aceita três argumentos:
133
133
@@ -150,7 +150,7 @@ h(
150
150
151
151
// {String | Array | Object} children
152
152
// VNodes filhos, construídos usando `h()`,
153
-
// ou usando strings to obter 'VNodes de texto' ou
153
+
// ou usando strings para obter 'VNodes de texto' ou
154
154
// um objeto com slots.
155
155
//
156
156
// Opcional.
@@ -164,7 +164,7 @@ h(
164
164
)
165
165
```
166
166
167
-
## Exemplo completo
167
+
## Exemplo Completo
168
168
169
169
Com este conhecimento, podemos agora finalizar o componente que começamos:
Todos os _VNodes_ na árvore de componentes devem ser únicos. Isso significa que a função de renderização a seguir é inválida:
220
220
221
221
```js
222
222
render() {
223
223
constmyParagraphVNode=Vue.h('p', 'hi')
224
224
returnVue.h('div', [
225
-
//Éca - VNodes duplicados!
225
+
//Eita - VNodes duplicados!
226
226
myParagraphVNode, myParagraphVNode
227
227
])
228
228
}
@@ -240,10 +240,11 @@ render() {
240
240
}
241
241
```
242
242
243
-
## Substituíndo Templates de recursos por JavaScript Simples
243
+
## Substituíndo Recursos de _Templates_ com JavaScript Simples
244
+
244
245
### `v-if` e `v-for`
245
246
246
-
Sempre que algo for facilmente realizado usando JavaScript simples, as funções de renderização do Vue não são uma alternativa apropriada. Por exemplo, em um template usando `v-if` e `v-for`:
247
+
Sempre que algo for facilmente realizado usando JavaScript simples, as funções de renderização do Vue não são uma alternativa apropriada. Por exemplo, em um _template_ usando `v-if` e `v-for`:
247
248
248
249
```html
249
250
<ulv-if="items.length">
@@ -252,7 +253,7 @@ Sempre que algo for facilmente realizado usando JavaScript simples, as funções
252
253
<pv-else>Não foram encontrados itens.</p>
253
254
```
254
255
255
-
Pode ser rescrito usando usando `if`/`else` e `map()` com JavaScript em uma função de renderização:
256
+
Pode ser rescrito usando `if`/`else` e `map()` com JavaScript em uma função de renderização:
256
257
257
258
```js
258
259
props: ['items'],
@@ -269,7 +270,7 @@ render() {
269
270
270
271
### `v-model`
271
272
272
-
A diretiva `v-model` é expandida para as propriedades `modelValue`e `onUpdate:modelValue` durante a compilação do template - nós mesmos teremos que prover essas propriedades:
273
+
A diretiva `v-model` é expandida para as propriedades `modelValue`e `onUpdate:modelValue` durante a compilação do _template_ - nós mesmos teremos que prover essas propriedades:
273
274
274
275
```js
275
276
props: ['modelValue'],
@@ -283,7 +284,7 @@ render() {
283
284
284
285
### `v-on`
285
286
286
-
Temos que prover o propriedade com nome apropriado para o manipulador do evento, e.g., para manipular um evento de `click`, o nome da propriedade deve ser `onClick`.
287
+
Temos que prover um nome de propriedade adequado para o manipulador do evento, e.g., para manipular um evento de `click`, o nome da propriedade deve ser `onClick`.
287
288
288
289
```js
289
290
render() {
@@ -295,7 +296,7 @@ render() {
295
296
296
297
#### Modificadores de Eventos
297
298
298
-
Os modificadores de evento `.passive`, `.capture` e `.once`, podem ser concatenados após o nome do evento usando grafia camelo (_camel case_).
299
+
Os modificadores de evento `.passive`, `.capture` e `.once`, podem ser concatenados após o nome do evento usando _camel case_.
299
300
300
301
Por exemplo:
301
302
@@ -316,7 +317,7 @@ Para todos os outros modificadores de evento, não é necessária nenhuma API es
| Teclas:<br>`.enter`, `.13`|`if (event.keyCode !== 13) return` (mude `13` para [outro código de tecla](http://keycode.info/) para outro modificador de tecla) |
320
+
| Teclas:<br>`.enter`, `.13`|`if (event.keyCode !== 13) return` (mude `13` para [outro código de tecla](http://keycode.info/) para outros modificadores de teclas) |
320
321
| Modificadores de teclas:<br>`.ctrl`, `.alt`, `.shift`, `.meta`|`if (!event.ctrlKey) return` (mude `ctrlKey` para `altKey`, `shiftKey`, ou `metaKey`, respectivamente) |
321
322
322
323
Aqui temos um exemplo de todos esses modificadores sendo usados juntos:
@@ -326,7 +327,7 @@ render() {
326
327
returnVue.h('input', {
327
328
onKeyUp:event=> {
328
329
// Aborta se o elemento emitindo o evento não é
329
-
// o elemento em qual o evento é ligado
330
+
// o elemento em qual o evento está ligado
330
331
if (event.target!==event.currentTarget) return
331
332
// Aborta se a tecla que foi pressionada não é a tecla enter
332
333
// (13) e a tecla shift não está sendo segurada
@@ -388,17 +389,17 @@ Vue.h(
388
389
{
389
390
level:1
390
391
},
391
-
[Vue.h('span', 'Hello'), 'world!']
392
+
[Vue.h('span', 'Olá'), 'mundo!']
392
393
)
393
394
```
394
395
395
-
Especialmente quando a versão usando template é mais concisa em comparação:
396
+
Especialmente quando a versão usando _template_ é mais concisa em comparação:
É por isso que existe um [_plugin_ Babel](https://github.com/vuejs/jsx-next) para usar JSX com Vue, nos colocando em uma sintaxe que é mais próxima dos templates:
402
+
É por isso que existe um [_plugin_ Babel](https://github.com/vuejs/jsx-next) para usar JSX com Vue, nos colocando em uma sintaxe que é mais próxima dos _templates_:
402
403
403
404
```jsx
404
405
importAnchoredHeadingfrom'./AnchoredHeading.vue'
@@ -407,7 +408,7 @@ const app = createApp({
407
408
render() {
408
409
return (
409
410
<AnchoredHeading level={1}>
410
-
<span>Hello</span>world!
411
+
<span>Olá</span>mundo!
411
412
</AnchoredHeading>
412
413
)
413
414
}
@@ -418,8 +419,8 @@ app.mount('#demo')
418
419
419
420
Para saber mais sobre como JSX mapeia para o JavaScript, veja a [documentação de uso](https://github.com/vuejs/jsx-next#installation).
420
421
421
-
## Compilação de Template
422
+
## Compilação de _Template_
422
423
423
-
Pode ser que você esteja interessando em saber que o Vue, na verdade, compila os templates em funções de renderização. Isso é um detalhe de implementação que, geralmente, você não precisa saber, porém, se você quiser ver como especificamente templates são compilados, você pode achar interessante. Abaixo temos uma pequena demonstração de uso de `Vue.compile` para compilar em tempo real (_live-compile_) uma string de template:
424
+
Pode ser que você esteja interessando em saber que o Vue, na verdade, compila os _templates_ em funções de renderização. Isso é um detalhe de implementação que, geralmente, você não precisa saber, porém, se você quiser ver como recursos específicos de _templates_são compilados, você pode achar interessante. Abaixo temos uma pequena demonstração de uso de `Vue.compile` para compilar em tempo real uma string de _template_:
0 commit comments