Olá, Reinaldo!
Essa é uma dúvida muito comum e a resposta é: depende. Ambas as abordagens têm suas vantagens e desvantagens e a escolha entre uma ou outra depende do contexto do seu projeto.
A abordagem que você escolhe depende muito do contexto e da preferência pessoal. Ambas têm seus méritos.
Opção 1:
- Granularidade: Cada campo tem seu próprio state, tornando mais simples a atualização e validação individual.
- Explicitidade: Fica claro quais informações estão sendo gerenciadas.
Opção 2:
- Organização: Todos os dados relacionados estão agrupados. Isso pode tornar o código mais limpo, especialmente quando se tem muitos campos.
- Facilidade para operações em lote: Se quiser resetar ou atualizar muitos campos de uma vez, essa abordagem facilita.
Dito isso, ambas as opções são aceitáveis.
A segunda opção não é contra as boas práticas, mas é um pouco menos comum em componentes React, já que a granularidade pode oferecer um controle mais fino. Se decidir pela Opção 2, só fique ligado para não mutar o state diretamente; sempre retorne um novo objeto ao atualizar.
Mas se liga, desde a introdução dos Hooks no React (na versão 16.8), a tendência tem sido uma abordagem mais funcional em vez da orientação a objetos com as classes. Mas isso não significa que você não possa (ou não deva) usar classes em suas aplicações React. No entanto, quando se trata do gerenciamento de estado em componentes, os hooks trouxeram uma forma mais concisa e flexível de fazer isso.
Vamos falar sobre o exemplo que você trouxe. Se você estiver pensando em usar uma classe para representar um usuário, você poderia ter algo assim:
class Usuario {
constructor(nome, email, endereco, complemento, cep, senha, senhaConfirmada) {
this.nome = nome;
this.email = email;
this.endereco = endereco;
this.complemento = complemento;
this.cep = cep;
this.senha = senha;
this.senhaConfirmada = senhaConfirmada;
}
}
Se decidir adotar uma abordagem mais funcional com um objeto simples, pode fazer algo assim:
const usuarioInicial = {
nome: '',
email: '',
endereco: '',
complemento: '',
cep: '',
senha: '',
senhaConfirmada: ''
};
Para o setUsuario com o useState, fica assim:
const [usuario, setUsuario] = useState(usuarioInicial);
Se você quiser atualizar o nome do usuário, por exemplo, evitando mutações diretas (que são uma má prática no React), você pode fazer assim:
setUsuario(prevUsuario => ({ ...prevUsuario, nome: 'Novo Nome' }));
Nesse exemplo, eu usei o spread operator (...
) para copiar todas as propriedades do estado anterior (prevUsuario
) e depois atualiza a propriedade nome. O prefixo prev vem da palavra previous, que indica que é o usuário "anterior", assim temos acesso a todos o objeto com todos os dados e alteramos somente o que é necessário.