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/reactivity.md
+18-18Lines changed: 18 additions & 18 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,12 +1,12 @@
1
1
# Aprofundando-se na Reatividade
2
2
3
-
Agora é o momento de mergulhar fundo! Uma das características mais distintas do Vue é o seu discreto sistema de reatividade. Models são _proxies_ de objetos JavaScript. Quando você os modifica, a _view_ é atualizada. Isso faz com que a administração de estado seja simples e intuitiva, porém é importante entender como isso funciona para evitar algumas pegadinhas. Nesta seção, vamos nos aprofundar em alguns dos detalhes de baixo nível do sistema de reatividade do Vue.
3
+
Agora é o momento de mergulhar fundo! Uma das características mais distintas do Vue é o seu discreto sistema de reatividade. Os modelos de dados são _proxies_ de objetos JavaScript. Quando você os modifica, a _view_ é atualizada. Isso faz com que a administração de estado seja simples e intuitiva, mas também é importante entender como isso funciona para evitar algumas pegadinhas. Nesta seção, vamos nos aprofundar em alguns dos detalhes de baixo nível do sistema de reatividade do Vue.
4
4
5
5
<VideoLessonhref="https://www.vuemastery.com/courses/vue-3-reactivity/vue3-reactivity"title="Aprenda a fundo como a reatividade funciona com o Vue Mastery">Assista um vídeo gratuito sobre Aprofundando-se na Reatividade no Vue Mastery</VideoLesson>
6
6
7
7
## O Que é Reatividade?
8
8
9
-
Esse termo aparece na programação com uma certa frequência atualmente, mas o que é que as pessoas entendem por isso? Reatividade é um paradigma de programação que nos permite nos ajustar a mudanças de uma maneira declarativa. O exemplo canônico geralmente mostrado, por ser um ótimo exemplo, é uma planilha do excel.
9
+
Esse termo aparece na programação com uma certa frequência atualmente, mas o que realmente significa quando as pessoas o dizem? Reatividade é um paradigma da programação que permite nos ajustarmos à mudanças de uma maneira declarativa. O exemplo canônico geralmente mostrado, por ser ótimo, é uma planilha do excel.
Ao atualizarmos o primeiro valor, a soma não é ajustada.
35
35
36
-
Então, como fazemos isso em JavaScript?
36
+
Então, como faríamos isso em JavaScript?
37
37
38
38
- Detecte quando há uma mudança em algum dos valores
39
39
- Rastreie a função que o modifica
40
40
- Dispare a função de modo que ela possa atualizar o valor final
41
41
42
42
## Como o Vue Rastreia Essas Mudanças
43
43
44
-
Quando você passa um objeto Javascript simples para uma aplicação ou instância de componente, como sua opção `data`, o Vue irá iterar sobre todas as suas propriedades e irá convertê-las em [Proxies](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy) utilizando um _handler_ com getters e setters. Isso é uma _feature_ do ES6, somente, mas nós oferecemos uma versão do Vue 3 que utiliza o `Object.defineProperty` mais antigo, para dar suporte a navegadores IE. Ambas possuem a mesma API, na superfície, mas a versão com Proxy é mais elegante e oferece melhor performance.
44
+
Quando você passa um objeto Javascript simples para uma aplicação ou instância de componente, como sua opção `data`, o Vue irá iterar sobre todas as suas propriedades e convertê-las em [Proxies](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy) utilizando um _handler_ com getters e setters. Isso é uma _feature_ do ES6, somente, mas nós oferecemos uma versão do Vue 3 que utiliza o `Object.defineProperty` mais antigo, para dar suporte à navegadores IE. Ambas possuem a mesma API, na superfície, mas a versão com Proxy é mais elegante e oferece melhor performance.
45
45
46
46
<divclass="reactivecontent">
47
47
<iframeheight="500"style="width: 100%;"scrolling="no"title="Proxies e a Reatividade do Vue Explicados Visualmente"src="https://codepen.io/sdras/embed/zYYzjBg?height=500&theme-id=light&default-tab=result"frameborder="no"allowtransparency="true"allowfullscreen="true">
@@ -71,7 +71,7 @@ console.log(proxy.meal)
71
71
// tacos
72
72
```
73
73
74
-
Ok, até agora, estamos apenas encapsulando o objeto e o retornando. Legal, mas ainda não muito útil. Mas observe isso, nós também podemos interceptar esse objeto enquanto temos ele encapsulado no Proxy. Essa interceptação é chamada de armadilha (_trap_).
74
+
Ok, até agora, estamos apenas encapsulando o objeto e o retornando. Legal, mas ainda não tão útil. Mas observe isso, nós também podemos interceptar esse objeto enquanto temos ele encapsulado no Proxy. Essa interceptação é chamada de armadilha (_trap_).
75
75
76
76
```js
77
77
constdinner= {
@@ -80,21 +80,21 @@ const dinner = {
80
80
81
81
consthandler= {
82
82
get(target, prop) {
83
-
console.log(‘intercepted!’)
83
+
console.log(‘interceptado!’)
84
84
return target[prop]
85
85
}
86
86
}
87
87
88
88
constproxy=newProxy(dinner, handler)
89
89
console.log(proxy.meal)
90
90
91
-
//intercepted!
91
+
//interceptado!
92
92
// tacos
93
93
```
94
94
95
-
Indo além de um _console log_, nós poderíamos fazer aqui qualquer coisa que desejássemos. Poderíamos até mesmo _não_ retornar o valor real se quiséssemos. Isso é o que torna os Proxies tão poderosos para a criação de APIs.
95
+
Indo além de um `console.log`, nós poderíamos fazer aqui qualquer coisa que desejássemos. Poderíamos até mesmo _não_ retornar o valor real se quiséssemos. Isso é o que torna os Proxies tão poderosos para a criação de APIs.
96
96
97
-
Além disso, há uma outra _feature_ que os Proxies nos oferecem. Ao invés de apenas retornar valores como esse: `target[prop]`, nós poderíamos levar isso um passo adiante e usar uma _feature_ chamada `Reflect`, que nos permite fazer a interligação apropriada do `this`. Isso leva a algo parecido com isso:
97
+
Além disso, há uma outra _feature_ que os Proxies nos oferecem. Ao invés de apenas retornar valores como esse: `target[prop]`, nós poderíamos levar isso um passo adiante e usar uma _feature_ chamada `Reflect`, que nos permite fazer a interligação apropriada do `this`. Isso leva à algo parecido com isso:
98
98
99
99
```js{7}
100
100
const dinner = {
@@ -110,7 +110,7 @@ const handler = {
110
110
const proxy = new Proxy(dinner, handler)
111
111
console.log(proxy.meal)
112
112
113
-
// intercepted!
113
+
// interceptado!
114
114
// tacos
115
115
```
116
116
@@ -131,7 +131,7 @@ const handler = {
131
131
const proxy = new Proxy(dinner, handler)
132
132
console.log(proxy.meal)
133
133
134
-
// intercepted!
134
+
// interceptado!
135
135
// tacos
136
136
```
137
137
@@ -156,7 +156,7 @@ const handler = {
156
156
constproxy=newProxy(dinner, handler)
157
157
console.log(proxy.meal)
158
158
159
-
//intercepted!
159
+
//interceptado!
160
160
// tacos
161
161
```
162
162
@@ -168,7 +168,7 @@ Lembra-se desta lista de alguns parágrafos atrás? Agora nós temos algumas res
168
168
169
169
O objeto com o _proxy_ aplicado é invisível para o usuário, mas por baixo dos panos ele possibilita que o Vue faça o rastreamento-de-dependência (_dependency-tracking_) e a notificação-de-mudança (_change-notification_) quando propriedades são acessadas ou modificadas. A partir do Vue 3, nossa reatividade está agora disponível em um [pacote separado](https://github.com/vuejs/vue-next/tree/master/packages/reactivity). Um problema é que o _console_ de navegadores formatam diferentemente quando objetos de dados convertidos são registrados no _log_, então pode ser que você queria instalar o [vue-devtools](https://github.com/vuejs/vue-devtools) para uma interface mais amigável à inspeção.
170
170
171
-
### Objetos com o Proxy aplicado
171
+
### Objetos com Proxy Aplicado
172
172
173
173
O Vue rastreia internamente todos os objetos que foram transformados em reativos, então ele sempre retorna o mesmo proxy de um mesmo objeto.
174
174
@@ -189,7 +189,7 @@ const handler = {
189
189
}
190
190
```
191
191
192
-
### Proxy vs. identidade original
192
+
### Proxy vs. Identidade Original
193
193
194
194
O uso do Proxy de fato introduz um novo empecilho a ser considerado: o objeto com o proxy aplicado não é igual ao objeto original em termos de comparação de identidade (`===`). Por exemplo:
A versão original e a versão encapsulada se comportarão da mesma forma na maioria dos casos, mas esteja ciente de que elas irão falhar em operações que dependem de comparações fortes de identidade, como `.filter()` ou `.map()`. Esse empecilho tem pouca chance de ocorrer quando a API de opções estiver sendo utilizada, porque todo o estado reativo é acessado a partir do `this` e é garantido que já sejam _proxies_.
204
204
205
-
Entretanto, quanto estiver utilizando a API de composição para criar objetos reativos explicitamente, a melhor prática é a de nunca guardar uma referência para o objeto cru original e trabalhar somente com a versão reativa:
205
+
Entretanto, quanto estiver utilizando a API de composição para criar objetos reativos explicitamente, a melhor prática é a de nunca guardar uma referência para o puro objeto original e trabalhar somente com a versão reativa:
206
206
207
207
```js
208
208
constobj=reactive({
@@ -223,8 +223,8 @@ Toda instância de componente tem uma instância de observador correspondente, q
223
223
224
224
Quando você passa um objeto para uma instância de um componente como _data_, o Vue o converte em um proxy. Esse proxy permite ao Vue realizar o rastreamento-de-dependência (_dependency-tracking_) e a notificação-de-mudança (_change-notification_), quando as propriedades são acessadas ou modificadas. Cada propriedade é considerada uma dependência.
225
225
226
-
Após a primeira renderização, um componente teria rastreado a lista de dependências — as propriedades que acessou durante a renderização. Inversamente, o componente se torna um assinante de cada uma dessas propriedades. Quando um proxy intercepta uma operação _set_, a propriedade notificará cada um de seus componentes assinantes para re-renderizarem.
226
+
Após a primeira renderização, um componente teria rastreado uma lista de dependências — as propriedades que acessou durante a renderização. Inversamente, o componente se torna um assinante de cada uma dessas propriedades. Quando um proxy intercepta uma operação _set_, a propriedade notificará cada um de seus componentes assinantes para re-renderizarem.
227
227
228
-
[//]: #'TODO: Diagrama de Insert'
228
+
[//]: #'TODO: Inserir diagrama'
229
229
230
-
> Se você está utilizando Vue 2.x e abaixo, pode estar interessado em alguns empecilhos de detecção de mudanças que existem nessas versões, [explorados em mais detalhes aqui](change-detection.md).
230
+
> Se você está utilizando Vue v2.x ou mais antigo, pode estar interessado em alguns empecilhos da detecção de mudanças que existem nessas versões, [explorados em mais detalhes aqui](change-detection.md).
0 commit comments