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/change-detection.md
+31-31Lines changed: 31 additions & 31 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,50 +1,50 @@
1
-
# Advertência de Alterações Detectadas no Vue 2
1
+
# Limitações na Detecção de Mudanças na v2
2
2
3
-
> Esta página se aplica apenas para o Vue 2.x e inferiores, e assume que você já tenha lido a [Seção de Reatividade](reactivity.md). Por favor leia esta seção primeiro.
3
+
> Esta página se aplica apenas ao Vue 2.x e inferiores, e assume que você já tenha lido a [Seção de Reatividade](reactivity.md). Por favor leia esta seção primeiro.
4
4
5
5
Devido a limitações no Javascript, existem alguns tipos de mudanças que o Vue **não consegue detectar**. No entanto, existem formas de contorná-las para preservar a reatividade.
6
6
7
-
### Para *Objects*
7
+
### Para Objetos
8
8
9
-
Vue não consegue detectar a inserçãoa ou remoção de propriedades. Como o Vue realiza o processo de conversão *getter*/*setter* durante a inicialização da instância, uma propriedade precisa estar presente no objeto `data` para que o Vue possa convertê-lo e torná-lo reativo. Por exemplo:
9
+
Vue não consegue detectar a inserção ou remoção de propriedades. Como o Vue realiza o processo de conversão para*getter*/*setter* durante a inicialização da instância, uma propriedade precisa estar presente no objeto `data` para que o Vue possa convertê-lo e torná-lo reativo. Por exemplo:
10
10
11
11
```js
12
12
var vm =newVue({
13
13
data: {
14
14
a:1
15
15
}
16
16
})
17
-
// `vm.a` agora é reativa
17
+
// `vm.a` agora é reativo
18
18
19
19
vm.b=2
20
-
// `vm.b` não é reativa
20
+
// `vm.b` NÃO é reativo
21
21
```
22
22
23
-
Vue não permite adicionar dinamicamente novas propriedades nível-raiz (*root-level*) a uma instância já criada. Contudo, é possível adicionar propriedades reativaas a um objeto aninhado usando o método `Vue.set(object, propertyName, value)`:
23
+
Vue não permite adicionar dinamicamente novas propriedades ao nívelraiz de uma instância já criada. Contudo, é possível adicionar propriedades reativas a um objeto aninhado usando o método `Vue.set(object, propertyName, value)`:
24
24
25
25
```js
26
26
Vue.set(vm.someObject, 'b', 2)
27
27
```
28
28
29
-
Você pode também utilizar o método da instância `vm.$set`, que é uma referência ao método global `Vue.set`:
29
+
Você também pode utilizar o método de instância `vm.$set`, que é uma referência ao método global `Vue.set`:
30
30
31
31
```js
32
32
this.$set(this.someObject, 'b', 2)
33
33
```
34
34
35
-
Às vezes você pode querer atribuir mais de uma propriedade para um objeto existente, por exemplo usando `Object.assign()` ou `_.extend()`. No entanto, novas propriedades addicionadas ao objeto não irão acionar mudanças. Nestes casos, crie um objeto novo (*fresh object*) com propriedades de ambos o origial e o alterado (*mixing object*):
35
+
Às vezes você pode querer atribuir mais de uma propriedade em um objeto existente, por exemplo usando `Object.assign()` ou `_.extend()`. No entanto, novas propriedades adicionadas ao objeto não irão acionar mudanças. Nestes casos, crie um objeto novo com propriedades de ambos o original e o alterado:
36
36
37
37
```js
38
38
// invés de `Object.assign(this.someObject, { a: 1, b: 2 })`
Vue não consegue detectar as seguintes mudanças em um *array*:
44
+
Vue não consegue detectar as seguintes mudanças em um array:
45
45
46
-
1. Quando você atribuir diretamente um item através do índice, e.g. `vm.items[indexOfItem] = newValue`
47
-
2. Quando você modifica o comprimento de um *array*, e.g. `vm.items.length = newLength`
46
+
1. Quando você atribui diretamente um item através do índice, e.g. `vm.items[indexOfItem] = newValue`
47
+
2. Quando você modifica o comprimento do array, e.g. `vm.items.length = newLength`
48
48
49
49
Por exemplo:
50
50
@@ -58,7 +58,7 @@ vm.items[1] = 'x' // NÃO é reativo
58
58
vm.items.length=2// NÃO é reativo
59
59
```
60
60
61
-
Para contornar a advertência 1, ambas instruções irão fazer o mesmo que `vm.items[indexOfItem] = newValue`, mas irão também acionar as atualizações no estado do sistema reativo:
61
+
Para contornar a limitação 1, ambas as instruções seguintes farão o mesmo que `vm.items[indexOfItem] = newValue`, mas também acionarão as atualizações no estado do sistema reativo:
62
62
63
63
```js
64
64
// Vue.set
@@ -76,20 +76,20 @@ Você pode também usar o método [`vm.$set`](https://vuejs.org/v2/api/#vm-set)
76
76
vm.$set(vm.items, indexOfItem, newValue)
77
77
```
78
78
79
-
Para lidar com a advertência 2, você pode usar o método `splice`:
79
+
Para lidar com a limitação 2, você pode usar o método `splice`:
80
80
81
81
```js
82
82
vm.items.splice(newLength)
83
83
```
84
84
85
85
## Declarando Propriedades Reativas
86
86
87
-
Como o Vue não permite inserir propriedades de nível raíz (*root-level*) dinamicamente, você tem que inicializar a instância de um componente declarando todas as propriedades de nível raíz (*root-level*) já inicializadas, mesmo que com valores vazios:
87
+
Como o Vue não permite inserir propriedades ao nível raiz dinamicamente, você tem que inicializar a instância de um componente declarando todas as propriedades de nível raiz já inicializadas, mesmo que com valores vazios:
88
88
89
89
```js
90
90
var vm =newVue({
91
91
data: {
92
-
// declara message com o valor vazio
92
+
// declara `message` com o valor vazio
93
93
message:''
94
94
},
95
95
template:'<div>{{ message }}</div>'
@@ -98,15 +98,15 @@ var vm = new Vue({
98
98
vm.message='Hello!'
99
99
```
100
100
101
-
Se você não declarar a propriedade `message` no objeto data, Vue irá avisar você que a função *render* está tenntando acessar uma propriedade que não exite.
101
+
Se você não declarar a propriedade `message` no objeto data, Vue te avisará que a função *render* está tentando acessar uma propriedade que não exite.
102
102
103
-
Existem razões técnicas por tráz desta restrição - elas eliminam um conjunto de casos extremos no sistema de rastreamento de dependências, além de fazer com que as istâncias dos componenntes funcionem melhor com o sistema de checagem de tipo. Porém há também uma consideração importante em termos de manutennção de código: o objeto `data` funciona como um *schema* para o estado do seu componente. Declarando todas as propriedades reativas inicialmente faz com que o código do componente seja mais fácil de entender quando revisitado posteriormente ou lido po outro desenvolvedor.
103
+
Existem razões técnicas por tráz desta restrição - elas eliminam um conjunto de casos extremos no sistema de rastreamento de dependências, além de fazer com que as instâncias dos componenntes funcionem melhor com sistemas de checagem de tipos. Porém há também uma consideração importante em termos de manutenção de código: o objeto `data` funciona como um *schema* para o estado do seu componente. Declarando todas as propriedades reativas inicialmente faz com que o código do componente seja mais fácil de entender quando revisitado posteriormente ou lido por outro desenvolvedor.
104
104
105
-
## Fila de Atualização Assíncrona (*Async Update Queue*)
105
+
## Fila de Atualizações Assíncrona
106
106
107
-
No caso de você não ter notado ainda, Vue realiza atualizações na DOM de forma **assíncrona**. Sempre que uma mudança de dados é observada, é aberta uma fila e armazenado em *buffer* todas as alterações que ocorreram no mesmo ciclo (*event loop*). Se o mesmo observador é acionado muitas vezes, ele será inserido na fila apenas uma vez. Essa eliminação de duplicatas em *buffer* é importante para evitar cálculos e manipulações da DOM desnecessários. Então, no próximo ciclo *"tick"*, Vue limpla a fila e executa o trabalho atual (já desduplicado). Internamente Vue tenta utilizar nativamente `Promise.then`, `MutationObserver`, e `setImmediate` para a enfileiração e retorna para o `setTimeout(fn, 0)`.
107
+
No caso de você não ter notado ainda, Vue realiza atualizações no DOM **assincronamente**. Sempre que uma mudança de dados é observada, é aberta uma fila e armazenado em *buffer* todas as alterações que ocorreram no mesmo *loop* de eventos. Se o mesmo observador é acionado muitas vezes, ele será inserido na fila apenas uma vez. Essa eliminação de duplicatas em *buffer* é importante para evitar cálculos e manipulações do DOM desnecessários. Então, no próximo *"tick"* de *loop* de eventos, Vue esvazia a fila e executa o trabalho atual (já desduplicado). Internamente o Vue tenta utilizar nativamente `Promise.then`, `MutationObserver`, e `setImmediate` para a enfileiração e retorna para o `setTimeout(fn, 0)` em caso de pouco suporte.
108
108
109
-
Por exemplo, quando você atribui `vm.someData = 'new value'`, o componente não irá renderizar novamente de imadiato. Ele irá atualizar no próximo *"tick"*, quando a fila for limpa. Na maioria dos casos nós não precisamos nos preocupar com isso, mas isto pode complicar quando você quer fazer algo que dependa da pós-atualização do estado da DOM (*post-update DOM state*). Contudo Vue.js geralmente encoraja os desenvolvedores a pensar de um modo *"data-driven"* e evitar tocar na DOM diretamente, em alguns casos pode ser necessário sujar as mãos. A fim de esperar até o Vue.js ter finalizado a atualização da DOM depois de uma mudança de *data*, você pode usar `Vue.nextTick(callback)` imediatamente depois da mudança de *data*. O *callback* irá ser chamado depois que a DOM for atualizada. Por exemplo:
109
+
Por exemplo, quando você atribui `vm.someData = 'new value'`, o componente não renderizará novamente de imediato. Ele irá atualizar no próximo *"tick"*, quando a fila for esvaziada. Na maioria dos casos nós não precisamos nos preocupar com isso, mas isto pode complicar quando você quer fazer algo que dependa do estado do DOM pós-atualização. Apesar de Vue.js geralmente encorajar os desenvolvedores a pensar de um modo *"data-driven"* e evitar tocar no DOM diretamente, em alguns casos pode ser necessário sujar as mãos. A fim de esperar até o Vue.js ter finalizado a atualização do DOM depois de uma mudança de dados, você pode usar `Vue.nextTick(callback)` imediatamente depois da mudança dos dados. O *callback* irá ser chamado depois que o DOM for atualizado. Por exemplo:
110
110
111
111
```html
112
112
<divid="example">{{ message }}</div>
@@ -119,27 +119,27 @@ var vm = new Vue({
119
119
message:'123'
120
120
}
121
121
})
122
-
vm.message='new message'//altera data
123
-
vm.$el.textContent==='new message'//falso
122
+
vm.message='new message'//modifica dados
123
+
vm.$el.textContent==='new message'//false
124
124
Vue.nextTick(function() {
125
-
vm.$el.textContent==='new message'//verdadeiro
125
+
vm.$el.textContent==='new message'//true
126
126
})
127
127
```
128
128
129
-
Existe também o método da instância `vm.$nextTick()`, que é especialmente eficaz dentro de componentes, pois não precisa da global `Vue` e seus *calback's* e o contexto da variável `this`será automaticamente se limitar ao componente atual:
129
+
Existe também o método de instância `vm.$nextTick()`, que é especialmente conveniente dentro de componentes, pois não precisa da global `Vue` e seus *callback's* e o contexto da variável `this`será automaticamente vinculado ao componente atual:
Como `$nextTick()` retorna uma *promise*, você pode ter o mesmo efeito acima usando a nova sitaxe[ES2017 async/await](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function):
151
+
Como `$nextTick()` retorna uma *promise*, você pode ter o mesmo efeito que acima usando a nova sintaxe[ES2017 async/await](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function):
0 commit comments