Executando verificação de segurança...
2

[React.js] Como "reiniciar" uma página com "useNavigate"?

react

Como "reiniciar" o useEffect de uma página como se estivessemos recarregando a mesma?

Talvez você já se deparou querendo disparar uma função novamente, refazer algum Fetch de dados e entre outros, e chegou a pensar que precisava "atualizar" a página, o que seria um refresh/reload - famoso F5.

Porém, nos métodos tradicionais como window.location.reload() isso causaria o recarregamento completo da página, fazendo com que o navegador carregue do zero varios arquivos ao invés de só atualizar o necessário, além de perder os dados de contextos e estados, ou seja, perderia o princípio do SPA.

Mas podemos realizar um refresh silencioso (silent refresh) aproveitando as funcionalidades do React.js. Para isso você precisará de dois Hooks do Router DOM.

  • useLocation: Ele retornará em uma variavel informações da rota atual, como pathname, query param e outros.
  • useNavigate: Para fazer a "mudança" de rota.

Com o useLocation() teremos acesso a chave da rota atual, pois toda rota possui uma key que muda conforme elas se alteram mesmo que mudemos para uma rota de mesmo nome. Pegou a ideia?

Sendo assim, podemos criar um useEffect, por exemplo, que em seu array de dependências possua o key da rota, como location.key.

Dessa maneira, o conteudo do useEffect irá disparar toda vez que essa variavel mudar, e como o key sempre muda mesmo que mudemos para uma rota de mesmo nome, basta no momento que quisermos dar o refresh enviar o usuário para a mesma rota através do useNavigate().

Sendo similar a quando usamos window.location.reload(), porém, sem a necessidade de recarregar diversos arquivos do zero ou de perder o contexto da aplicação.

Ex.:

    const location = useLocation();
    const navigate = useNavigate();
    
    useEffect(() => {
        // SUAS AÇÕES APÓS O "SILENT REFRESH"
    }, [location.key])
    
    const someFunction = () => {
        navigate(location.pathname);
    }

Por via de curiosidade, isso também poderia ser obtido com algum estado (state) auxiliar para forçar o disparo do useEffect com sua mudança de valor.

Fim
Obrigado pela leitura 😉.
Espero que tenha gostado do pequeno artigo e que seja útil de alguma forma. Até o próximo! ✌️

Carregando publicação patrocinada...
2

Você pode também utilizar a função useNavigate de outra forma para "recarregar" uma página em React.js. Exemplo:

const navigate = useNavigate();

const someFunction = () => {{
    navigate("/", { replace: true });
    navigate("/");
}

Ao acionar a função someFunction será acionada duas vezes a função navigate, com { replace: true } na primeira chamada e sem argumentos na segunda.

1