React Hooks nos fornece a opção useState, e eu sempre vejo comparações Hooks vs Class-State. Mas e Hooks e algumas variáveis regulares?
Por exemplo,
function Foo() {
let a = 0;
a = 1;
return <div>{a}</div>;
}
Eu não usei Hooks, e ele me dará os mesmos resultados que:
function Foo() {
const [a, setA] = useState(0);
if (a != 1) setA(1); // to avoid infinite-loop
return <div>{a}</div>;
}
Então, qual é a diferença? Usando Hooks ainda mais complexo para esse caso ... Então, por que começar a usá-lo?
javascript
node.js
reactjs
react-hooks
Moshe Nagar
fonte
fonte
let a = 1; return <div>{a}</div>
e obterá o mesmo resultado.Respostas:
O motivo é se você
useState
renderiza novamente a exibição. As variáveis por si só alteram os bits da memória e o estado do seu aplicativo pode ficar fora de sincronia com a exibição.Compare estes exemplos:
Nos dois casos, as
a
alterações são feitas no clique, mas somente quando você usauseState
a exibição corretamente mostraa
o valor atual.fonte
a
será coletada como lixo após concluir a execução, enquanto no primeiro, uma vez que aproveitauseState
, preservará o valor dea
useRef
se não quisesse renderizar novamente a exibição. A questão permanece se ele deve usar variáveis locais ou referências a reagir. Por exemplo, se você tiver um tempo limite que precisa limpar ou uma solicitação http em andamento usando axios, você armazena a fonte de tempo limite ou axios em uma variável ou em uma ref React?useRef
(se você não quiser renderizar novamente) ouuseState
(se você quiser renderizar novamente). No caso de temporizadores, por serem efeitos colaterais, eles devem ser iniciados nouseEffect
gancho. Se você desejatimerId
apenas para fins de limpeza, pode mantê-lo na variável local do manipulador . Se você deseja limpar o cronômetro de outro local do componente, use-ouseRef
. ArmazenartimerId
na variável local de um componente seria um erro, pois os vars locais são "redefinidos" em cada renderização.A atualização do estado fará com que o componente volte a renderizar novamente, mas os valores locais não.
No seu caso, você renderizou esse valor em seu componente. Isso significa que, quando o valor é alterado, o componente deve ser renderizado novamente para mostrar o valor atualizado.
Portanto, será melhor usar do
useState
que o valor local normal.fonte
Seu primeiro exemplo funciona apenas porque os dados basicamente nunca são alterados. O ponto de entrada do uso
setState
é renderizar novamente todo o componente quando o estado travar. Portanto, se seu exemplo exigir algum tipo de alteração ou gerenciamento de estado, você perceberá rapidamente que os valores de alteração serão necessários e, para atualizar a visualização com o valor da variável, será necessário o estado e a nova renderização.fonte
é equivalente a
Quais
useState
retornos são duas coisas:se você ligar,
setA(1)
você ligariathis.setState({ a: 1 })
e acionaria uma nova renderização.fonte
As variáveis locais serão redefinidas a cada renderização após a mutação, enquanto o estado será atualizado:
fonte