À medida que a sua aplicação cresce, ajuda ser mais intencional sobre como o seu estado é organizado e como os dados fluem entre os seus componentes. O estado redundante ou duplicado é uma fonte comum de bugs. Neste capítulo, você aprenderá como estruturar bem o seu estado, como manter a lógica de atualização do seu estado e como compartilhar o estado entre componentes distantes.
Neste capítulo
- Como pensar sobre as mudanças de IU como mudanças de estado
- Como estruturar bem o estado
- Como “levantar estado” para compartilhá-lo entre componentes
- Como controlar se o estado é preservado ou reiniciado
- Como consolidar uma lógica de estado complexa em uma função
- Como passar informação sem “prop drilling”
- Como escalar a gestão do estado à medida que o seu aplicativo cresce
Reagindo à inserção de dados com o estado
Com React, você não modificará a UI a partir do código diretamente. Por exemplo, você não vai escrever comandos como “desativar o botão”, “ativar o botão”, “mostrar a mensagem de sucesso”, etc. Em vez disso, você descreverá a UI que deseja ver para os diferentes estados visuais de seu componente (“estado inicial”, “estado de digitação”, “estado de sucesso”) e então acionará as mudanças de estado em resposta à inserção de dados do usuário. Isto é semelhante a como os designers pensam sobre a UI.
Aqui está um formulário de questionário construído usando React. Observe como ele utiliza a variável status
para determinar se deve habilitar ou desabilitar o botão de submeter, e se deve mostrar a mensagem de sucesso no seu lugar.
Ready to learn this topic?
Leia Reagindo à inserção de dados com o estado para aprender como abordar as interações com uma mentalidade orientada ao estado.
Read MoreComo estruturar bem o estado
A boa estruturação do estado pode fazer a diferença entre um componente que é agradável de modificar e debugar e um que é uma fonte contínua de bugs. O princípio mais importante é que o estado não deve conter informações redundantes ou duplicadas. Se houver algum estado desnecessário, é fácil esquecer de atualizá-lo e introduzir bugs!
Por exemplo, este formulário tem uma variável de estado redundante fullName
:
Você pode removê-lo e simplificar o código calculando fullName
enquanto o componente está renderizando:
Isto pode parecer uma pequena mudança mas muitos bugs em aplicações React são corrigidos desta forma.
Ready to learn this topic?
Leia Escolhendo a estrutura do estado para aprender como modelar a forma do estado para evitar bugs.
Read MoreCompartilhando o estado entre componentes
Às vezes, você quer que o estado de dois componentes mude sempre em conjunto. Para fazer isso, remova o estado de ambos, mova-o para seu parente comum mais próximo e depois passe-o para eles por meio de props. Isto é conhecido como “levantar o estado” e é uma das coisas mais comuns que você fará escrevendo código React.
Neste exemplo, apenas um painel deve estar ativo de cada vez. Para conseguir isto, em vez de manter o estado ativo dentro de cada painel individual, o componente parente possui o estado e especifica os adereços para seus filhos.
Ready to learn this topic?
Leia Compartilhando o estado entre componentes para aprender como levantar o estado e manter os componentes em sincronia.
Read MorePreservando e reinicializando o estado
Quando você renderiza novamente um componente, o React precisa decidir quais partes da árvore manter (e atualizar) e quais partes descartar ou recriar do zero. Na maioria dos casos, o comportamento automático do React funciona suficientemente bem. Por padrão, o React preserva as partes da árvore que “combinam” com a árvore de componentes anteriormente renderizada.
No entanto, às vezes isso não é o que se deseja. Por exemplo, neste aplicativo, digitar uma mensagem e depois trocar o destinatário não reinicia a caixa de texto. Isto pode fazer com que o usuário acidentalmente envie uma mensagem para a pessoa errada:
React permite que você sobreponha o comportamento padrão e force um componente para repor seu estado passando-lhe uma key
diferente, como <Chat key={email} />
. Isto diz ao React que se o destinatário for diferente, deve ser considerado um componente Chat
diferente que precisa ser recriado a partir do zero com os novos dados (e UI como campos de entrada). Agora, a troca entre os destinatários sempre redefine o campo de entrada - mesmo que você renderize o mesmo componente.
Ready to learn this topic?
Leia Preservando e reinicializando o estado para aprender a vida útil do estado e como controlá-lo.
Read MoreExtraindo a lógica de estado para um redutor
Componentes com muitas atualizações de estado espalhados por muitos manipuladores de evento podem apresentar uma complexidade avassaladora. Para estes casos, você pode consolidar toda a lógica de atualização do estado fora de seu componente em uma única função, chamada de “redutor”. Os seus manipuladores de eventos tornam-se concisos porque eles especificam apenas as “ações” do usuário. Na parte inferior do arquivo, a função redutor especifica como o estado deve ser atualizado em resposta a cada ação!
Ready to learn this topic?
Leia Extraindo a lógica de estado para um redutor para aprender como consolidar a lógica numa função redutora.
Read MorePassando os dados profundamente com o contexto
Normalmente, você passará informações de um componente parente para um componente descendente através de props. Mas a passagem de props pode tornar-se inconveniente se você precisar passar algum prop por muitos componentes ou se muitos componentes precisarem da mesma informação. O contexto permite que o componente parente torne alguma informação disponível para qualquer componente da árvore abaixo dele - não importa quão profundo seja - sem passá-lo explicitamente através de props.
Aqui, o componente “Heading” determina seu nível de cabeçalho ao “perguntar” à “Seção” mais próxima pelo seu nível. Cada “Section” monitora seu próprio nível, perguntando à “Section” parente e acrescentando-lhe um nível. Cada “Section” fornece informações a todos os componentes abaixo dela sem passar props - faz isso através do contexto.
Ready to learn this topic?
Leia Passando os dados profundamente com o contexto para aprender sobre o uso do contexto como uma alternativa à passagem de props.
Read MoreEscalonamento com redutor e contexto
Redutores permitem consolidar a lógica de atualização do estado de um componente. O contexto permite que você transmita informações em profundidade para outros componentes. Você pode combinar redutores e contexto juntos para gerenciar o estado de uma tela complexa.
Com esta abordagem, um componente parente com estado complexo, o gerencia com um redutor. Outros componentes em qualquer parte profunda da árvore podem ler seu estado através do contexto. Eles também podem despachar ações para atualizar esse estado.
Ready to learn this topic?
Leia Escalonamento com redutor e contexto para aprender como a gestão do estado escala numa aplicação em crescimento.
Read MoreO que vem a seguir?
Vá até Reagindo à inserção de dados com o estado para começar a ler este capítulo página por página!
Ou, se você já está familiarizado com estes tópicos, por que não ler sobre Escape Hatches?