Eu estava percorrendo algum código e me deparei com o seguinte snippet para evitar que o StrictMode chame um efeito duas vezes. Embora geralmente não seja recomendado implementar tal recurso, fiquei mais confuso sobre o porquê de ele realmente funcionar. Veja o seguinte:
export const useApiDemo = (param: string) => {
let strictModeRerun = false;
useEffect(() => {
!strictModeRerun && fetchApi(param);
return () => {
strictModeRerun = true;
};
}, [param]);
};
Pelo que entendi, em strictmode, ganchos e componentes são chamados duas vezes para que possamos identificar quaisquer configurações incorretas ou limpezas defeituosas. Se useApiDemo (ou o componente em que é usado) renderiza duas vezes, eu presumo que strictModeRerun
também seria falso duas vezes porque é definido em linha no escopo de renderização. Ele não é persistido entre renderizações, então eu presumo que isso faz com que a segunda execução também chame a API. No entanto, a chamada da API é disparada apenas uma vez. Se eu remover a strictModeRerun
API, ela dispara duas vezes. Por que isso realmente funciona?
O React 18 tem algumas peculiaridades somente de dev. As duas com as quais estamos preocupados aqui são:
Eles são independentes. Por exemplo:
A saída da renderização dos componentes acima no log é:
Isso prova que primeiro acontece a renderização dupla. E só depois disso o efeito roda. De qualquer forma, o efeito deve rodar logo antes da pintura.
Link da caixa de areia
rerender
é registrado duas vezes com ambos os valores derenderCount
. E então o efeito é executado. Como você está definindo o valor false, ele nunca mais é executado como você imaginou.