|
2 | 2 | title: Componentes com estado
|
3 | 3 | description: Um framework web full stack produtivo não deve forçar você a pensar sobre detalhes de estrutura
|
4 | 4 | ---
|
| 5 | +Componentes com estado são classes que estendem nullstack e são capazes de manter o estado que reflete na interface do usuário. |
5 | 6 |
|
6 | 7 | Um framework web full stack produtivo não deve forçar você a pensar sobre detalhes de estrutura.
|
7 | 8 |
|
@@ -45,6 +46,44 @@ export default Counter;
|
45 | 46 |
|
46 | 47 | > 💡 As atualizações são feitas em lotes, geralmente enquanto aguardam chamadas assíncronas, portanto, fazer várias atribuições não tem custos de desempenho!
|
47 | 48 |
|
| 49 | +## Array de Eventos |
| 50 | + |
| 51 | +Você pode passar um array de eventos como prop e eles serão executados em paralelo |
| 52 | + |
| 53 | +Você também pode passar valores falsos para pular eventos condicionalmente. |
| 54 | + |
| 55 | +```jsx |
| 56 | +import Nullstack from 'nullstack'; |
| 57 | + |
| 58 | +class Counter extends Nullstack { |
| 59 | + |
| 60 | + count = 0; |
| 61 | + |
| 62 | + increment() { |
| 63 | + this.count++; |
| 64 | + } |
| 65 | + |
| 66 | + log() { |
| 67 | + console.log(this.count); |
| 68 | + } |
| 69 | + |
| 70 | + logUnlessZero() { |
| 71 | + console.log(this.count > 0); |
| 72 | + } |
| 73 | + |
| 74 | + render() { |
| 75 | + return ( |
| 76 | + <button onclick={[this.increment, this.log, this.count > 0 && this.logUnlessZero]}> |
| 77 | + {this.count} |
| 78 | + </button> |
| 79 | + ) |
| 80 | + } |
| 81 | + |
| 82 | +} |
| 83 | + |
| 84 | +export default Counter; |
| 85 | +``` |
| 86 | + |
48 | 87 | ## Objeto de Eventos
|
49 | 88 |
|
50 | 89 | Você pode criar atalho em eventos que são simples atribuições passando um objeto para o evento.
|
@@ -159,6 +198,123 @@ class Form extends Nullstack {
|
159 | 198 | export default Form;
|
160 | 199 | ```
|
161 | 200 |
|
| 201 | +## Eventos Debounced |
| 202 | + |
| 203 | +Você pode usar o atributo `debounce` passando um número de milissegundos para atrasar os eventos desse elemento |
| 204 | + |
| 205 | +```jsx |
| 206 | +import Nullstack from 'nullstack'; |
| 207 | + |
| 208 | +class Counter extends Nullstack { |
| 209 | + |
| 210 | + count = 0 |
| 211 | + |
| 212 | + increment() { |
| 213 | + this.count++ |
| 214 | + } |
| 215 | + |
| 216 | + render() { |
| 217 | + return ( |
| 218 | + <button onclick={this.increment} debounce={2000}> |
| 219 | + increment |
| 220 | + </button> |
| 221 | + ) |
| 222 | + } |
| 223 | + |
| 224 | +} |
| 225 | + |
| 226 | +export default Counter; |
| 227 | +``` |
| 228 | + |
| 229 | + |
| 230 | +## TypeScript |
| 231 | + |
| 232 | +Componentes com estado aceitam um genérico que reflete nas props que sua tag aceitará |
| 233 | + |
| 234 | +```tsx |
| 235 | +// src/Counter.tsx |
| 236 | +import Nullstack, { NullstackClientContext } from 'nullstack'; |
| 237 | + |
| 238 | +interface CounterProps { |
| 239 | + multiplier: number |
| 240 | +} |
| 241 | + |
| 242 | +class Counter extends Nullstack<CounterProps> { |
| 243 | + |
| 244 | + // ... |
| 245 | + |
| 246 | + render({ multiplier }: NullstackClientContext<CounterProps>) { |
| 247 | + return <div> {multiplier} </div> |
| 248 | + } |
| 249 | + |
| 250 | +} |
| 251 | + |
| 252 | +export default Counter; |
| 253 | +``` |
| 254 | + |
| 255 | +```tsx |
| 256 | +// src/Application.tsx |
| 257 | +import Counter from './Counter' |
| 258 | + |
| 259 | +export default function Application() { |
| 260 | + return <Counter multiplier={4} /> |
| 261 | +} |
| 262 | +``` |
| 263 | + |
| 264 | +## Componentes internos |
| 265 | + |
| 266 | +Em vez de criar um novo componente apenas para organizar a divisão de código, você pode criar um componente interno. |
| 267 | + |
| 268 | +Componentes internos são qualquer método cujo nome comece com `render` seguido por um caractere maiúsculo. |
| 269 | + |
| 270 | +Os componentes internos compartilham a mesma instância e escopo do componente principal, portanto, são muito convenientes para evitar problemas como perfuração de escoras. |
| 271 | + |
| 272 | +Para invocar o componente interno, use uma tag JSX com o nome do método sem o prefixo `render`. |
| 273 | + |
| 274 | +```tsx |
| 275 | +import Nullstack, { NullstackClientContext, NullstackNode } from 'nullstack'; |
| 276 | + |
| 277 | +interface CounterProps { |
| 278 | + multiplier: number |
| 279 | +} |
| 280 | + |
| 281 | +interface CounterButtonProps { |
| 282 | + delta: number |
| 283 | +} |
| 284 | + |
| 285 | +declare function Button(context: CounterProps): NullstackNode |
| 286 | + |
| 287 | +class Counter extends Nullstack<CounterProps> { |
| 288 | + |
| 289 | + count = 0; |
| 290 | + |
| 291 | + increment({ delta, multiplier }: NullstackClientContext<CounterProps & CounterButtonProps>) { |
| 292 | + this.count += delta * multiplier; |
| 293 | + } |
| 294 | + |
| 295 | + renderButton({ delta = 1 }: NullstackClientContext<CounterProps & CounterButtonProps>) { |
| 296 | + return ( |
| 297 | + <button onclick={this.increment} delta={delta}> |
| 298 | + {this.count} |
| 299 | + </button> |
| 300 | + ) |
| 301 | + } |
| 302 | + |
| 303 | + render() { |
| 304 | + return ( |
| 305 | + <div> |
| 306 | + <Button /> |
| 307 | + <Button delta={2} /> |
| 308 | + </div> |
| 309 | + ) |
| 310 | + } |
| 311 | + |
| 312 | +} |
| 313 | + |
| 314 | +export default Counter; |
| 315 | +``` |
| 316 | +> 💡 Nullstack will inject a constant reference to the function at transpile time in order to completely skip the runtime lookup process! |
| 317 | +
|
162 | 318 | ## Próximos passos
|
163 | 319 |
|
164 | 320 | ⚔ Aprenda sobre o [ciclo da vida full-stack](/pt-br/ciclo-de-vida-full-stack).
|
0 commit comments