1
resposta

Acesso direto pela URL o hook useNavigate funciona normalmente?

É aconselhável usar o useNavigate somente se existir um "histórico" de navegação na página? por que em casos de acesso em uma página diretamente por URL onde não tem a navegação até aquele lugar, isso poderia ser um problema ou a lib já da alguma solução nesse caso?

1 resposta

Olá Misael, boa tarde!

Ótima pergunta! na verdade o navigate(-1) utiliza o histórico do próprio browser para mudar de rota, ou seja, se você tiver aberto uma nova aba, digitado a URL e clicado em voltar, ela voltaria para a aba vazia! Assim como se você estiver em outro site, clicar na URL e clicar em voltar o navegador voltaria para o outro site!

O React-router não tem algo nativo para validar este tipo de coisa (até porque o browser não permite que a gente veja o pathname anterior ao que a gente está, é algo fechado), mas caso você queira redirecionar o usuário apenas dentro do seu site, você poderia:

  • criar um state guardando estes paths durante as navegações no routes.js (pior forma na minha opinião)
  • criar um sessionStorage e colocar as informações de navegação nele (abstrai isto do React, ficando mais fácil de entender e de fazer manutenção)
  • criar um context (com contextAPI ou outro gerenciador de estados da sua escolha) e guardar as informações de navegação)

Com esta informação, dá pra conferir ela na hora de voltar, ficaria algo assim:

Se eu estivesse navegando da tela inicial:

     <button onClick={() => {
         if(prevPath) // o dado guardado em sessionStorage ou em algum state
             return navigate('/');
         return navigate(-1);
     }}>

e a forma de popular este lugar seria utilizando o return do useEffect das páginas, pois ele significa que você está destruindo o componente da página, logo significa que a rota está sendo mudada, ficaria algo assim:

useEffect(() => { return () => mudarPrevPath('/pathAtual'); // função que muda a variável no sessionStorage ou no state },[]);

Esta é a forma mais fácil que encontrei. Tem uma discussão sobre isto aqui, se você sabe inglês vale a pena dar uma olhada.

Caso você tenha mais alguma dúvida sobre isto ou tenha mais alguma, fique a vontade para continuar este tópico ou começar outro beleza?

Bons estudos!