Réagir ne recharge pas les données relatives aux composants sur la route param changement ou modification de la requête
J'ai une "maison" composant avec des liens, et lorsque vous cliquez sur un lien du produit composant est chargé avec le produit. J'ai aussi un autre élément qui est toujours visible, montrant les liens de la "récemment visité produits".
Ces liens ne fonctionnent pas sur une page produit. L'url des mises à jour lorsque je clique sur le lien, et un rendu se produit, mais le produit de la composante n'est pas mise à jour avec le nouveau produit.
Voir cet exemple:
Codesandbox exemple
Voici les routes index.js:
<BrowserRouter>
<div>
<Route
exact
path="/"
render={props => <Home products={this.state.products} />}
/>
<Route path="/products/:product" render={props => <Product {...props} />} />
<Route path="/" render={() => <ProductHistory />} />
<Link to="/">to Home</Link>
</div>
</BrowserRouter>;
Les liens dans ProductHistory ressembler à ceci:
<Link to={`/products/${product.product_id}`}> {product.name}</Link>
Afin qu'elles correspondent à la Route path="/products/:product"
.
Quand je suis sur une page produit et essayer de suivre un ProductHistory lien, l'URL des mises à jour et un rendu se produit, mais le composant de données ne change pas. Dans le Codesandbox exemple, vous pouvez décommenter l'alerte dans les composants du Produit fonction rendu de voir qu'il s'affiche lorsque vous suivez le lien, mais rien ne se passe.
Je ne sais pas quel est le problème...Pouvez-vous expliquer le problème et trouver une solution? Ce serait formidable!
Vous devez vous connecter pour publier un commentaire.
Avec
componentDidMount
, Vous devez également mettre en œuvre lescomponentWillReceiveProps
ou de l'utilisationgetDerivedStateFromProps
(à partir de v16.3.0 partir) enProducts
page depuis le même composant estre-rendered
à jourparams
etnot re-mounted
lorsque vous modifiez le paramètre de route, c'est parce que les paramètres sont passés comme des accessoires de la composante et des accessoires de modification, de Réagir composants de re-rendre et de ne pas re-monté.EDIT: de v16.3.0 utilisation
getDerivedStateFromProps
définition/mise à jour de l'état basée sur les accessoires(pas besoin de le spécifier dans deux différents lifecyle méthodes)Avant v16.3.0, vous pouvez utiliser componentWillReceiveProps
Travail codesandbox
getDerivedStateFromProps
,componentDidUpdate
comme décrit dans la cette réponse.getDerivedStateFromProps
solution. Mais il ne fonctionne pas. Il semble que lagetDerivedStateFromProps
ne se déclenche une fois sur le mont.En tant que composant du Produit est déjà chargé, il ne sera pas recharger. Vous avez à gérer de nouvelles id de produit dans la méthode ci-dessous de la composante
Avec la dernière version de réagir(16.3.0 partir)
Si vous n'êtes pas le maintien de l'état de votre composant, vous pouvez utiliser
componentDidUpdate
sans la nécessité pourgetDerivedStateFromProps
:Bien que tous les moyens de fonctionner, je ne vois pas un point d'honneur à utiliser
getDerivedStateFromProps
.Basé sur Réagir docs, "si vous voulez re-calculer certaines données uniquement lorsqu'un accessoire de modifications, utilisez un memoization helper au lieu de cela".
Ici, au lieu de cela, je suggère tout simplement à l'aide de
componentDidUpdate
avec la modification de laComponent
àPureComponenet
.Avec référence à Réagir docs,
PureComponenet
s seulement rerender si au moins un état ou prop modifications de la valeur. Le changement est déterminée en faisant un peu de la comparaison de l'état et prop clés.JS:
Veuillez noter que le ci-dessus ne fonctionne que si vous modifiez le Composant PureComponent, et évidemment, vous devez l'importer à partir de Réagir.