Estou trabalhando em um aplicativo react usando o react-router. Tenho uma página de projeto que tem o seguinte url:
myapplication.com/project/unique-project-id
Quando o componente do projeto é carregado, aciono uma solicitação de dados para esse projeto a partir do evento componentDidMount. Agora estou tendo um problema em que, se eu alternar diretamente entre dois projetos, apenas a id muda assim ...
myapplication.com/project/982378632
myapplication.com/project/782387223
myapplication.com/project/198731289
componentDidMount não é disparado novamente, então os dados não são atualizados. Existe outro evento de ciclo de vida que devo usar para acionar minha solicitação de dados ou uma estratégia diferente para resolver esse problema?
reactjs
react-router
Constelados
fonte
fonte
Respostas:
Se o link está direcionando para a mesma rota com apenas um parâmetro diferente, ele não está remontando, mas recebendo novos adereços. Então, você pode usar a
componentWillReceiveProps(newProps)
função e procurarnewProps.params.projectId
.Se você está tentando carregar dados, eu recomendaria buscar os dados antes de o roteador lidar com a correspondência usando métodos estáticos no componente. Veja este exemplo. Mega Demo do React Router . Dessa forma, o componente carregaria os dados e atualizaria automaticamente quando os parâmetros da rota mudassem sem a necessidade de depender deles
componentWillReceiveProps
.fonte
state
para ele. É um pouco confuso no início, mas depois fica um pouco mais claro.Se você precisar remontar um componente quando a rota mudar, você pode passar uma chave exclusiva para o atributo de chave do seu componente (a chave é associada ao seu caminho / rota). Portanto, toda vez que a rota muda, a chave também muda, o que aciona o componente React para desmontar / remontar. Tive a ideia desta resposta
fonte
Aqui está minha resposta, semelhante a algumas das perguntas acima, mas com código.
fonte
Você tem que estar claro, que uma mudança de rota não causará uma atualização de página, você tem que lidar com isso sozinho.
fonte
Se você tem:
No React 16.8 e superior, usando ganchos , você pode fazer:
Lá, você só aciona uma nova
fetchResource
chamada sempre queprops.match.params.id
muda.fonte
componentWillReceiveProps
Com base nas respostas de @wei, @ Breakpoint25 e @PaulusLimma, fiz este componente de substituição para o
<Route>
. Isso remontará a página quando o URL mudar, forçando todos os componentes da página a serem criados e montados novamente, não apenas renderizados novamente. TodoscomponentDidMount()
e todos os outros ganchos de inicialização são executados também na mudança de URL.A ideia é alterar as
key
propriedades dos componentes quando a URL muda e isso força o React a remontar o componente.Você pode usá-lo como um substituto imediato para
<Route>
, por exemplo:O
<RemountingRoute>
componente é definido assim:Isso foi testado com React-Router 4.3.
fonte
A resposta de @wei funciona muito bem, mas em algumas situações acho melhor não definir uma chave de componente interno, mas rotear a si mesmo. Além disso, se o caminho para o componente for estático, mas você apenas quiser que o componente remonte sempre que o usuário navegar até ele (talvez para fazer uma chamada de api em componentDidMount ()), é útil definir location.pathname como a chave da rota. Com ele, a rota e todo o seu conteúdo são remontados quando o local muda.
fonte
Foi assim que resolvi o problema:
Este método obtém o item individual da API:
Eu chamo esse método de componentDidMount, este método será chamado apenas uma vez, quando eu carregar esta rota pela primeira vez:
E de componentWillReceiveProps que será chamado desde a segunda vez que carregamos a mesma rota, mas ID diferente, e eu chamo o primeiro método para recarregar o estado e então o componente carregará o novo item.
fonte
Se você estiver usando o Class Component, você pode usar o componentDidUpdate
fonte
Você pode usar o método fornecido:
quando o componente é garantido para renderizar novamente após a mudança de rota, então você pode passar props como dependência
Não é a melhor maneira, mas é boa o suficiente para lidar com o que você está procurando, de acordo com Kent C Dodds : Considere mais o que você deseja que aconteça.
fonte
react-router
está quebrado porque deve remontar os componentes em qualquer mudança de local.Eu consegui encontrar uma correção para este bug:
https://github.com/ReactTraining/react-router/issues/1982#issuecomment-275346314
Resumindo (veja o link acima para informações completas)
Isso fará com que seja remontado em qualquer alteração de URL
fonte