Update Docs CI with mdbook translation support (#516)

* Update Docs CI with mdbook translation support #514

* install mdbook with --rev
This commit is contained in:
Marco Godoy authored and GitHub committed 2022-08-04 10:26:04 -05:00
1 parent df5338f4e6
commit 9538cfe733
37 files changed
+151 -145

No files matched your search

+3 -3
View File
@@ -3,7 +3,7 @@
Os **"hooks"** `use_future` e `use_coroutine` são úteis se você quiser gerar incondicionalmente o `Future`. Às vezes, porém, você desejará apenas gerar um `Future` em resposta a um evento, como um clique do mouse. Por exemplo, suponha que você precise enviar uma solicitação quando o usuário clicar em um botão "log in". Para isso, você pode usar `cx.spawn`:
```rust
{{#include ../../examples/spawn.rs:spawn}}
{{#include ../../../examples/spawn.rs:spawn}}
```
> Nota: `spawn` sempre gerará um _novo_ `Future`. Você provavelmente não quer chamá-lo em cada renderização.
@@ -15,7 +15,7 @@ No entanto, como você normalmente precisa de uma maneira de atualizar o valor d
Para tornar isso um pouco menos detalhado, o Dioxus exporta a macro `to_owned!` que criará uma ligação como mostrado acima, o que pode ser bastante útil ao lidar com muitos valores.
```rust
{{#include ../../examples/spawn.rs:to_owned_macro}}
{{#include ../../../examples/spawn.rs:to_owned_macro}}
```
Calling `spawn` will give you a `JoinHandle` which lets you cancel or pause the future.
@@ -25,5 +25,5 @@ Calling `spawn` will give you a `JoinHandle` which lets you cancel or pause the
Às vezes, você pode querer gerar uma tarefa em segundo plano que precise de vários _threads_ ou conversar com o hardware que pode bloquear o código do seu aplicativo. Nesses casos, podemos gerar diretamente uma tarefa Tokio do nosso `Future`. Para Dioxus-Desktop, sua tarefa será gerada no tempo de execução Multi-Tarefado do Tokio:
```rust
{{#include ../../examples/spawn.rs:tokio}}
{{#include ../../../examples/spawn.rs:tokio}}
```
+3 -3
View File
@@ -5,7 +5,7 @@
Por exemplo, podemos fazer uma solicitação de API dentro de `use_future`:
```rust
{{#include ../../examples/use_future.rs:use_future}}
{{#include ../../../examples/use_future.rs:use_future}}
```
O código dentro de `use_future` será enviado ao agendador do Dioxus assim que o componente for renderizado.
@@ -15,7 +15,7 @@ Podemos usar `.value()` para obter o resultado do `Future`. Na primeira execuç
Podemos então renderizar esse resultado:
```rust
{{#include ../../examples/use_future.rs:render}}
{{#include ../../../examples/use_future.rs:render}}
```
## Reiniciando o `Future`
@@ -27,5 +27,5 @@ O identificador `UseFuture` fornece um método `restart`. Ele pode ser usado par
Muitas vezes, você precisará executar o `Future` novamente toda vez que algum valor (por exemplo, uma prop) mudar. Ao invés de `.restart` manualmente, você pode fornecer uma tupla de "dependências" para o gancho. Ele executará automaticamente o `Future` quando qualquer uma dessas dependências for alterada. Exemplo:
```rust
{{#include ../../examples/use_future.rs:dependency}}
{{#include ../../../examples/use_future.rs:dependency}}
```
@@ -9,7 +9,7 @@ Os fragmentos não montam um elemento físico no DOM imediatamente, então o Dio
Apenas os nós Componente e Fragmento são suscetíveis a esse problema. O Dioxus atenua isso com componentes fornecendo uma API para registrar o estado compartilhado sem o padrão _Context Provider_.
```rust
{{#include ../../examples/anti_patterns.rs:nested_fragments}}
{{#include ../../../examples/anti_patterns.rs:nested_fragments}}
```
## Chaves do Iterador Incorretas
@@ -17,7 +17,7 @@ Apenas os nós Componente e Fragmento são suscetíveis a esse problema. O Dioxu
Conforme descrito no capítulo de renderização condicional, os itens da lista devem ter _keys_ exclusivas associadas aos mesmos itens nas renderizações. Isso ajuda o Dioxus a associar o estado aos componentes contidos e garante um bom desempenho de diferenciação. Não omita as _keys_, a menos que você saiba que a lista é estática e nunca será alterada.
```rust
{{#include ../../examples/anti_patterns.rs:iter_keys}}
{{#include ../../../examples/anti_patterns.rs:iter_keys}}
```
## Evite Mutabilidade Interior em `Props`
@@ -3,13 +3,13 @@
Em alguns casos, você pode desejar criar um componente que atue como um contêiner para algum outro conteúdo, sem que o componente precise saber qual é esse conteúdo. Para conseguir isso, crie uma _prop_ do tipo `Element`:
```rust
{{#include ../../examples/component_element_props.rs:Clickable}}
{{#include ../../../examples/component_element_props.rs:Clickable}}
```
Então, ao renderizar o componente, você pode passar a saída de `cx.render(rsx!(...))`:
```rust
{{#include ../../examples/component_element_props.rs:Clickable_usage}}
{{#include ../../../examples/component_element_props.rs:Clickable_usage}}
```
> Nota: Como `Element<'a>` é uma _prop_ emprestado, não haverá memoização.
@@ -21,11 +21,11 @@ Então, ao renderizar o componente, você pode passar a saída de `cx.render(rsx
Em vez de passar o `RSX` através de uma _prop_ regular, você pode querer aceitar filhos da mesma forma que os elementos podem ter filhos. O prop "mágico" `children` permite que você consiga isso:
```rust
{{#include ../../examples/component_children.rs:Clickable}}
{{#include ../../../examples/component_children.rs:Clickable}}
```
Isso torna o uso do componente muito mais simples: basta colocar o `RSX` dentro dos colchetes `{}` – e não há necessidade de uma chamada `render` ou outra macro!
```rust
{{#include ../../examples/component_children.rs:Clickable_usage}}
{{#include ../../../examples/component_children.rs:Clickable_usage}}
```
@@ -20,13 +20,13 @@ Existem 2 tipos de estruturas Props:
_Props_ próprios são muito simples – eles não emprestam nada. Exemplo:
```rust
{{#include ../../examples/component_owned_props.rs:Likes}}
{{#include ../../../examples/component_owned_props.rs:Likes}}
```
Você pode então passar valores de _prop_ para o componente da mesma forma que você passaria atributos para um elemento:
```rust
{{#include ../../examples/component_owned_props.rs:App}}
{{#include ../../../examples/component_owned_props.rs:App}}
```
![Screenshot: Likes component](./images/component_owned_props_screenshot.png)
@@ -38,13 +38,13 @@ Possuir _props_ funciona bem se seus _props_ forem fáceis de copiar – como um
Rust permite algo mais eficiente – emprestar a `String` como um `&str` – é para isso que servem as _props emprestadas_!
```rust
{{#include ../../examples/component_borrowed_props.rs:TitleCard}}
{{#include ../../../examples/component_borrowed_props.rs:TitleCard}}
```
Podemos então usar o componente assim:
```rust
{{#include ../../examples/component_borrowed_props.rs:App}}
{{#include ../../../examples/component_borrowed_props.rs:App}}
```
![Screenshot: TitleCard component](./images/component_borrowed_props_screenshot.png)
@@ -58,13 +58,13 @@ A macro `#[derive(Props)]` tem alguns recursos que permitem personalizar o compo
Você pode criar campos opcionais usando o tipo `Option<…>` para um campo:
```rust
{{#include ../../examples/component_props_options.rs:OptionalProps}}
{{#include ../../../examples/component_props_options.rs:OptionalProps}}
```
Em seguida, você pode optar por fornecê-los ou não:
```rust
{{#include ../../examples/component_props_options.rs:OptionalProps_usage}}
{{#include ../../../examples/component_props_options.rs:OptionalProps_usage}}
```
### `Option` Explicitamente Obrigatórias
@@ -72,13 +72,13 @@ Em seguida, você pode optar por fornecê-los ou não:
Se você quiser exigir explicitamente uma `Option`, e não uma _prop_ opcional, você pode anotá-la com `#[props(!optional)]`:
```rust
{{#include ../../examples/component_props_options.rs:ExplicitOption}}
{{#include ../../../examples/component_props_options.rs:ExplicitOption}}
```
Então, você tem que passar explicitamente `Some("str")` ou `None`:
```rust
{{#include ../../examples/component_props_options.rs:ExplicitOption_usage}}
{{#include ../../../examples/component_props_options.rs:ExplicitOption_usage}}
```
### Props Padrão
@@ -86,13 +86,13 @@ Então, você tem que passar explicitamente `Some("str")` ou `None`:
Você pode usar `#[props(default = 42)]` para tornar um campo opcional e especificar seu valor padrão:
```rust
{{#include ../../examples/component_props_options.rs:DefaultComponent}}
{{#include ../../../examples/component_props_options.rs:DefaultComponent}}
```
Então, da mesma forma que _props_ opcionais, você não precisa fornecê-lo:
```rust
{{#include ../../examples/component_props_options.rs:DefaultComponent_usage}}
{{#include ../../../examples/component_props_options.rs:DefaultComponent_usage}}
```
### Conversão Automática com `.into`
@@ -100,13 +100,13 @@ Então, da mesma forma que _props_ opcionais, você não precisa fornecê-lo:
É comum que as funções Rust aceitem `impl Into<SomeType>` em vez de apenas `SomeType` para suportar uma ampla gama de parâmetros. Se você quiser uma funcionalidade semelhante com _props_, você pode usar `#[props(into)]`. Por exemplo, você pode adicioná-lo em uma prop `String` – e `&str` também será aceito automaticamente, pois pode ser convertido em `String`:
```rust
{{#include ../../examples/component_props_options.rs:IntoComponent}}
{{#include ../../../examples/component_props_options.rs:IntoComponent}}
```
Então, você pode usá-lo assim:
```rust
{{#include ../../examples/component_props_options.rs:IntoComponent_usage}}
{{#include ../../../examples/component_props_options.rs:IntoComponent_usage}}
```
## A macro `inline_props`
@@ -5,7 +5,7 @@ Assim como você não gostaria de escrever um programa complexo em uma única e
Um componente é uma função Rust, nomeada em _UpperCammelCase_, que recebe um parâmetro `Scope` e retorna um `Element` descrevendo a interface do usuário que deseja renderizar. Na verdade, nossa função `App` é um componente!
```rust
{{#include ../../examples/hello_world_desktop.rs:component}}
{{#include ../../../examples/hello_world_desktop.rs:component}}
```
> Você provavelmente desejará adicionar `#![allow(non_snake_case)]` no topo de sua caixa para evitar avisos sobre o nome da função
@@ -13,13 +13,13 @@ Um componente é uma função Rust, nomeada em _UpperCammelCase_, que recebe um
Um Componente é responsável por alguma tarefa de renderização – normalmente, renderizando uma parte isolada da interface do usuário. Por exemplo, você pode ter um componente `About` que renderiza uma breve descrição do Dioxus Labs:
```rust
{{#include ../../examples/components.rs:About}}
{{#include ../../../examples/components.rs:About}}
```
Em seguida, você pode renderizar seu componente em outro componente, da mesma forma que os elementos são renderizados:
```rust
{{#include ../../examples/components.rs:App}}
{{#include ../../../examples/components.rs:App}}
```
![Captura de tela contendo o componente Sobre duas vezes](./images/screenshot_about_component.png)
+8 -8
View File
@@ -5,7 +5,7 @@ Dioxus é uma estrutura _declarativa_. Isso significa que, em vez de dizer ao Di
Você já viu um exemplo simples ou sintaxe `RSX` no aplicativo "hello world":
```rust
{{#include ../../examples/hello_world_desktop.rs:component}}
{{#include ../../../examples/hello_world_desktop.rs:component}}
```
Aqui, usamos a macro `rsx!` para _declarar_ que queremos um elemento `div`, contendo o texto `"Hello, world!"`. Dioxus pega o RSX e constrói uma interface do usuário a partir dele.
@@ -15,7 +15,7 @@ Aqui, usamos a macro `rsx!` para _declarar_ que queremos um elemento `div`, cont
O RSX é muito semelhante ao HTML, pois descreve elementos com atributos e filhos. Aqui está um elemento `div` vazio no RSX, bem como o HTML resultante:
```rust
{{#include ../../examples/rsx_overview.rs:empty}}
{{#include ../../../examples/rsx_overview.rs:empty}}
```
```html
@@ -27,7 +27,7 @@ O RSX é muito semelhante ao HTML, pois descreve elementos com atributos e filho
Para adicionar filhos a um elemento, coloque-os dentro dos colchetes `{}`. Eles podem ser outros elementos ou texto. Por exemplo, você pode ter um elemento `ol` (lista ordenada), contendo 3 elementos `li` (item da lista), cada um dos quais contém algum texto:
```rust
{{#include ../../examples/rsx_overview.rs:children}}
{{#include ../../../examples/rsx_overview.rs:children}}
```
```html
@@ -45,7 +45,7 @@ Você também pode "agrupar" elementos envolvendo-os em `Fragment {}`. Isso não
> Nota: você também pode renderizar vários elementos no nível superior de `rsx!` e eles serão agrupados automaticamente – não há necessidade de um `Fragment {}` explícito lá.
```rust
{{#include ../../examples/rsx_overview.rs:fragments}}
{{#include ../../../examples/rsx_overview.rs:fragments}}
```
```html
@@ -61,7 +61,7 @@ Você também pode "agrupar" elementos envolvendo-os em `Fragment {}`. Isso não
Os atributos também são especificados dentro dos colchetes `{}`, usando a sintaxe `name: value`. Você pode fornecer o valor como um literal no RSX:
```rust
{{#include ../../examples/rsx_overview.rs:attributes}}
{{#include ../../../examples/rsx_overview.rs:attributes}}
```
```html
@@ -80,7 +80,7 @@ Os atributos também são especificados dentro dos colchetes `{}`, usando a sint
Dioxus tem um conjunto pré-configurado de atributos que você pode usar. O RSX é validado em tempo de compilação para garantir que você não especificou um atributo inválido. Se você quiser substituir esse comportamento por um nome de atributo personalizado, especifique o atributo entre aspas:
```rust
{{#include ../../examples/rsx_overview.rs:custom_attributes}}
{{#include ../../../examples/rsx_overview.rs:custom_attributes}}
```
```html
@@ -92,7 +92,7 @@ Dioxus tem um conjunto pré-configurado de atributos que você pode usar. O RSX
Da mesma forma que você pode [formatar](https://doc.rust-lang.org/rust-by-example/hello/print/fmt.html) Rust _strings_, você também pode interpolar no texto RSX. Use `{variable}` para exibir o valor de uma variável em uma _string_, ou `{variable:?}` para usar a representação `Debug`:
```rust
{{#include ../../examples/rsx_overview.rs:formatting}}
{{#include ../../../examples/rsx_overview.rs:formatting}}
```
```html
@@ -108,7 +108,7 @@ Da mesma forma que você pode [formatar](https://doc.rust-lang.org/rust-by-examp
Você pode incluir expressões Rust arbitrárias dentro do RSX, mas deve escapá-las entre colchetes `[]`:
```rust
{{#include ../../examples/rsx_overview.rs:expression}}
{{#include ../../../examples/rsx_overview.rs:expression}}
```
```html
@@ -9,7 +9,7 @@ Se você estiver trabalhando com itens pré-renderizados, modelos ou uma bibliot
Por exemplo, enviar um conversor de markdown para Dioxus pode aumentar significativamente o tamanho final do aplicativo. Em vez disso, você desejará pré-renderizar sua remarcação para HTML e, em seguida, incluir o HTML diretamente em sua saída. Usamos essa abordagem para a [página inicial do Dioxus](https://dioxuslabs.com):
```rust
{{#include ../../examples/dangerous_inner_html.rs:dangerous_inner_html}}
{{#include ../../../examples/dangerous_inner_html.rs:dangerous_inner_html}}
```
> Nota! Esse atributo é chamado de "dangerous_inner_html" porque é **perigoso** passar dados que você não confia. Se você não for cuidadoso, poderá facilmente expor ataques de [cross-site scripting (XSS)](https://en.wikipedia.org/wiki/Cross-site_scripting) aos seus usuários.
@@ -23,7 +23,7 @@ A maioria dos atributos, quando renderizados, serão renderizados exatamente com
Portanto, este RSX não renderizaria o atributo `hidden`:
```rust
{{#include ../../examples/boolean_attribute.rs:boolean_attribute}}
{{#include ../../../examples/boolean_attribute.rs:boolean_attribute}}
```
```html
@@ -42,5 +42,5 @@ cargo add dioxus --features desktop
Edite seu `main.rs`:
```rust
{{#include ../../examples/hello_world_desktop.rs:all}}
{{#include ../../../examples/hello_world_desktop.rs:all}}
```
+2 -2
View File
@@ -23,7 +23,7 @@ cargo add dioxus --features tui
Em seguida, edite seu `main.rs` com o modelo básico.
```rust
{{#include ../../examples/hello_world_tui.rs}}
{{#include ../../../examples/hello_world_tui.rs}}
```
Para executar nosso aplicativo:
@@ -35,7 +35,7 @@ cargo run
Pressione "ctrl-c" para fechar o aplicativo. Para mudar de "ctrl-c" para apenas "q" para sair, você pode iniciar o aplicativo com uma configuração para desativar o sair padrão e usar a raiz TuiContext para sair por conta própria.
```rust
{{#include ../../examples/hello_world_tui_no_ctrl_c.rs}}
{{#include ../../../examples/hello_world_tui_no_ctrl_c.rs}}
```
## Notas
+1 -1
View File
@@ -64,7 +64,7 @@ Adicione um `index.html` para o `Trunk` usar. Certifique-se de que seu elemento
Edite seu `main.rs`:
```rust
{{#include ../../examples/hello_world_web.rs}}
{{#include ../../../examples/hello_world_web.rs}}
```
E para servir nosso aplicativo:
@@ -9,7 +9,7 @@ Para evitar a repetição, você pode encapsular a lógica de negócios com base
Por exemplo, se muitos componentes precisam acessar uma _struct_ `AppSettings`, você pode criar um gancho de "atalho":
```rust
{{#include ../../examples/hooks_composed.rs:wrap_context}}
{{#include ../../../examples/hooks_composed.rs:wrap_context}}
```
## Lógica de Hook Personalizada
@@ -7,7 +7,7 @@
Para renderizar diferentes elementos com base em uma condição, você pode usar uma instrução `if-else`:
```rust
{{#include ../../examples/conditional_rendering.rs:if_else}}
{{#include ../../../examples/conditional_rendering.rs:if_else}}
```
> Você também pode usar instruções `match`, ou qualquer função Rust para renderizar condicionalmente coisas diferentes.
@@ -17,7 +17,7 @@ Para renderizar diferentes elementos com base em uma condição, você pode usar
Como `Element` é uma `Option<VNode>`, os componentes que aceitam `Element` como _prop_ podem realmente inspecionar seu conteúdo e renderizar coisas diferentes com base nisso. Exemplo:
```rust
{{#include ../../examples/component_children_inspect.rs:Clickable}}
{{#include ../../../examples/component_children_inspect.rs:Clickable}}
```
Você não pode modificar o `Element`, mas se precisar de uma versão modificada dele, você pode construir um novo baseado em seus atributos/filhos/etc.
@@ -27,7 +27,7 @@ Você não pode modificar o `Element`, mas se precisar de uma versão modificada
Para renderizar nada, você pode retornar `None` de um componente. Isso é útil se você deseja ocultar algo condicionalmente:
```rust
{{#include ../../examples/conditional_rendering.rs:conditional_none}}
{{#include ../../../examples/conditional_rendering.rs:conditional_none}}
```
Isso funciona porque o tipo `Element` é apenas um alias para `Option<VNode>`
@@ -48,7 +48,7 @@ Para isso, o Dioxus aceita iteradores que produzem `Element`s. Então precisamos
Exemplo: suponha que você tenha uma lista de comentários que deseja renderizar. Então, você pode renderizá-los assim:
```rust
{{#include ../../examples/rendering_lists.rs:render_list}}
{{#include ../../../examples/rendering_lists.rs:render_list}}
```
### O Atributo `key`
@@ -9,7 +9,7 @@ Os manipuladores de eventos são semelhantes aos atributos regulares, mas seus n
Por exemplo, para manipular cliques em um elemento, podemos especificar um manipulador `onclick`:
```rust
{{#include ../../examples/event_click.rs:rsx}}
{{#include ../../../examples/event_click.rs:rsx}}
```
## O Objeto `Evento`
@@ -30,7 +30,7 @@ Para saber o que os diferentes tipos de eventos fornecem, leia os [documentos do
Quando você tem, por exemplo um `button` dentro de um `div`, qualquer clique no `button` também é um clique no `div`. Por esta razão, Dioxus propaga o evento click: primeiro, ele é acionado no elemento alvo, depois nos elementos pai. Se você quiser evitar esse comportamento, você pode chamar `cancel_bubble()` no evento:
```rust
{{#include ../../examples/event_click.rs:rsx}}
{{#include ../../../examples/event_click.rs:rsx}}
```
## Prevenir o Padrão
@@ -40,7 +40,7 @@ Alguns eventos têm um comportamento padrão. Para eventos de teclado, isso pode
Em alguns casos, você pode querer evitar esse comportamento padrão. Para isso, você pode adicionar o atributo `prevent_default` com o nome do manipulador cujo comportamento padrão você deseja interromper. Este atributo é especial: você pode anexá-lo várias vezes para vários atributos:
```rust
{{#include ../../examples/event_prevent_default.rs:prevent_default}}
{{#include ../../../examples/event_prevent_default.rs:prevent_default}}
```
Quaisquer manipuladores de eventos ainda serão chamados.
@@ -52,13 +52,13 @@ Quaisquer manipuladores de eventos ainda serão chamados.
Às vezes, você pode querer criar um componente que aceite um manipulador de eventos. Um exemplo simples seria um componente `FancyButton`, que aceita um manipulador `on_click`:
```rust
{{#include ../../examples/event_handler_prop.rs:component_with_handler}}
{{#include ../../../examples/event_handler_prop.rs:component_with_handler}}
```
Então, você pode usá-lo como qualquer outro manipulador:
```rust
{{#include ../../examples/event_handler_prop.rs:usage}}
{{#include ../../../examples/event_handler_prop.rs:usage}}
```
> Nota: assim como qualquer outro atributo, você pode nomear os manipuladores como quiser! Embora eles devam começar com `on`, para que o prop seja automaticamente transformado em um `EventHandler` no local da chamada.
+7 -7
View File
@@ -15,7 +15,7 @@ Para lógica com estado, você pode usar _hooks_. _Hooks_ são funções Rust qu
Por exemplo, você pode ter visto o exemplo do contador, no qual o estado (um número) é rastreado usando o _hook_ `use_state`:
```rust
{{#include ../../examples/hooks_counter.rs:component}}
{{#include ../../../examples/hooks_counter.rs:component}}
```
![Screenshot: counter app](./images/counter.png)
@@ -27,7 +27,7 @@ Toda vez que o estado do componente muda, ele é renderizado novamente e a funç
Você pode usar vários _hooks_ no mesmo componente se quiser:
```rust
{{#include ../../examples/hooks_counter_two_state.rs:component}}
{{#include ../../../examples/hooks_counter_two_state.rs:component}}
```
![Screenshot: app with two counters](./images/counter_two_state.png)
@@ -39,7 +39,7 @@ O exemplo acima pode parecer um pouco mágico, já que as funções Rust normalm
Mas como Dioxus pode diferenciar entre vários _hooks_ no mesmo componente? Como você viu no segundo exemplo, ambas as funções `use_state` foram chamadas com os mesmos parâmetros, então como elas podem retornar coisas diferentes quando os contadores são diferentes?
```rust
{{#include ../../examples/hooks_counter_two_state.rs:use_state_calls}}
{{#include ../../../examples/hooks_counter_two_state.rs:use_state_calls}}
```
Isso só é possível porque os dois _hooks_ são sempre chamados na mesma ordem, então Dioxus sabe qual é qual. Portanto, a ordem em que você chama os _hooks_ é importante, e é por isso que você deve seguir certas regras ao usar os _hooks_:
@@ -55,19 +55,19 @@ Essas regras significam que há certas coisas que você não pode fazer com _hoo
### Sem Hooks em Condicionais
```rust
{{#include ../../examples/hooks_bad.rs:conditional}}
{{#include ../../../examples/hooks_bad.rs:conditional}}
```
### Sem Hooks em Closures
```rust
{{#include ../../examples/hooks_bad.rs:closure}}
{{#include ../../../examples/hooks_bad.rs:closure}}
```
### Sem Hooks em Loops
```rust
{{#include ../../examples/hooks_bad.rs:loop}}
{{#include ../../../examples/hooks_bad.rs:loop}}
```
## Gancho `use_ref`
@@ -81,7 +81,7 @@ Felizmente, existe outro _hook_ para isso, `use_ref`! É semelhante ao `use_stat
Aqui está um exemplo simples que mantém uma lista de eventos em um `use_ref`. Podemos adquirir acesso de escrita ao estado com `.write()`, e então apenas `.push` um novo valor para o estado:
```rust
{{#include ../../examples/hooks_use_ref.rs:component}}
{{#include ../../../examples/hooks_use_ref.rs:component}}
```
> Os valores de retorno de `use_state` e `use_ref`, (`UseState` e `UseRef`, respectivamente) são de alguma forma semelhantes a [`Cell`](https://doc.rust-lang.org/std/ cell/) e [`RefCell`](https://doc.rust-lang.org/std/cell/struct.RefCell.html) – eles fornecem mutabilidade interior. No entanto, esses _wrappers_ do Dioxus também garantem que o componente seja renderizado novamente sempre que você alterar o estado.
@@ -13,7 +13,7 @@ Por exemplo, suponha que queremos construir um editor de memes. Queremos ter uma
Começamos com um componente `Meme`, responsável por renderizar um meme com uma determinada legenda:
```rust
{{#include ../../examples/meme_editor.rs:meme_component}}
{{#include ../../../examples/meme_editor.rs:meme_component}}
```
> Observe que o componente `Meme` não sabe de onde vem a legenda – ela pode ser armazenada em `use_state`, `use_ref` ou uma constante. Isso garante que seja muito reutilizável - o mesmo componente pode ser usado para uma galeria de memes sem nenhuma alteração!
@@ -21,13 +21,13 @@ Começamos com um componente `Meme`, responsável por renderizar um meme com uma
Também criamos um editor de legendas, totalmente desacoplado do meme. O editor de legendas não deve armazenar a legenda em si – caso contrário, como iremos fornecê-la ao componente `Meme`? Em vez disso, ele deve aceitar a legenda atual como um suporte, bem como um manipulador de eventos para delegar eventos de entrada para:
```rust
{{#include ../../examples/meme_editor.rs:caption_editor}}
{{#include ../../../examples/meme_editor.rs:caption_editor}}
```
Finalmente, um terceiro componente renderizará os outros dois como filhos. Ele será responsável por manter o estado e passar os _props_ relevantes.
```rust
{{#include ../../examples/meme_editor.rs:meme_editor}}
{{#include ../../../examples/meme_editor.rs:meme_editor}}
```
![Captura de tela do editor de memes: Um velho esqueleto de plástico sentado em um banco de parque. Legenda: "eu esperando por um recurso de idioma"](./images/meme_editor_screenshot.png)
@@ -47,19 +47,19 @@ A Dioxus oferece uma solução melhor do que esta "perfuração com hélice" –
Primeiro, temos que criar um _struct_ para nossa configuração de modo escuro:
```rust
{{#include ../../examples/meme_editor_dark_mode.rs:DarkMode_struct}}
{{#include ../../../examples/meme_editor_dark_mode.rs:DarkMode_struct}}
```
Agora, em um componente de nível superior (como `App`), podemos fornecer o contexto `DarkMode` para todos os componentes filhos:
```rust
{{#include ../../examples/meme_editor_dark_mode.rs:context_provider}}
{{#include ../../../examples/meme_editor_dark_mode.rs:context_provider}}
```
Como resultado, qualquer componente filho de `App` (direto ou não), pode acessar o contexto `DarkMode`.
```rust
{{#include ../../examples/meme_editor_dark_mode.rs:use_context}}
{{#include ../../../examples/meme_editor_dark_mode.rs:use_context}}
```
> `use_context` retorna `Option<UseSharedState<DarkMode>>` aqui. Se o contexto foi fornecido, o valor é `Some(UseSharedState)`, que você pode chamar `.read` ou `.write`, similarmente a `UseRef`. Caso contrário, o valor é `None`.
@@ -67,5 +67,5 @@ Como resultado, qualquer componente filho de `App` (direto ou não), pode acessa
Por exemplo, aqui está como implementaríamos a alternância do modo escuro, que lê o contexto (para determinar a cor que deve renderizar) e grava nele (para alternar o modo escuro):
```rust
{{#include ../../examples/meme_editor_dark_mode.rs:toggle}}
{{#include ../../../examples/meme_editor_dark_mode.rs:toggle}}
```
@@ -7,7 +7,7 @@ As interfaces geralmente precisam fornecer uma maneira de inserir dados: por exe
Com entradas controladas, você fica diretamente responsável pelo estado da entrada. Isso lhe dá muita flexibilidade e facilita manter as coisas em sincronia. Por exemplo, é assim que você criaria uma entrada de texto controlada:
```rust
{{#include ../../examples/input_controlled.rs:component}}
{{#include ../../../examples/input_controlled.rs:component}}
```
Observe a flexibilidade - você pode:
@@ -25,7 +25,7 @@ Como alternativa às entradas controladas, você pode simplesmente deixar a plat
Como você não tem necessariamente o valor atual da entrada não controlada no estado, você pode acessá-lo ouvindo os eventos `oninput` (de maneira semelhante aos componentes controlados) ou, se a entrada for parte de um formulário, você pode acessar os dados do formulário nos eventos do formulário (por exemplo, `oninput` ou `onsubmit`):
```rust
{{#include ../../examples/input_uncontrolled.rs:component}}
{{#include ../../../examples/input_uncontrolled.rs:component}}
```
```