Comment pousser à l'Histoire Réagir Routeur v4?
Dans la version actuelle de Réagir Routeur (v3), je peux accepter une réponse du serveur et de l'utiliser browserHistory.push
pour aller à la réponse appropriée de la page. Cependant, ce n'est pas disponible dans la version 4, et je ne suis pas sûr de la façon de gérer cela est.
Dans cet exemple, à l'aide de Redux, components/app-product-form.js appels this.props.addProduct(props)
lorsqu'un utilisateur soumet le formulaire. Lorsque le serveur renvoie un succès, l'utilisateur est pris à la page du Panier.
//actions/index.js
export function addProduct(props) {
return dispatch =>
axios.post(`${ROOT_URL}/cart`, props, config)
.then(response => {
dispatch({ type: types.AUTH_USER });
localStorage.setItem('token', response.data.token);
browserHistory.push('/cart'); //no longer in React Router V4
});
}
Comment puis-je faire une redirection vers la page du Panier à partir de la fonction pour Réagir Routeur v4?
- Juste pour ajouter à cela, à partir de la dernière solution proposée et de suggestions à Réagir Routeur questions sur GitHub, à l'aide de la
context
passer ce que vous devez manuellement est un "no go". Sauf si je suis de la bibliothèque de l'auteur, il ne devrait pas être un besoin de l'utiliser. En fait, Facebook recommande contre elle. - avez-vous trouvé une solution pour cela ? j'ai besoin de pousser à un autre composant dans l'action , même comme vous l'avez expliqué ici
- malheureusement je n'ai pas. Le dernier que j'ai lu, c'était la Réagir la Formation de l'équipe qui maintient Réagir Routeur a un redux paquets disponibles. Je n'ai pas eu de chance pour le faire fonctionner, et ils n'ont pas mis beaucoup de travail dans la résoudre.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le
history
méthodes en dehors de vos composants. Essayez de la façon suivante.Tout d'abord, créez un
history
objet utilisé l'histoire de package:Puis l'envelopper dans
<Router>
(veuillez noter, vous devez utiliserimport { Router }
au lieu deimport { BrowserRouter as Router }
):Changer votre position actuelle à partir d'un lieu, par exemple:
SED: Vous pouvez également voir un exemple légèrement différent dans Réagir Routeur FAQ.
history.push('some path')
, l'URL change, mais la page ne change pas. Je dois mettrewindow.location.reload()
après avoir dans certaines parties de mon code pour le faire fonctionner. Cependant, dans un cas, j'ai garder le redux de l'état de l'arbre, et le rechargement de la détruit. Toute autre solution?withRouter
d'ordre supérieur composant.import createHistory from 'history/createBrowserHistory'; export default createHistory();
de travail.Réagir Routeur v4 est fondamentalement différente de la v3 (et plus tôt) et vous ne pouvez pas faire
browserHistory.push()
comme vous avez utilisé pour.Cette discussion semble liée, si vous voulez plus d'info:
Au lieu de cela, vous avez quelques options pour ce faire:
Utiliser le
withRouter
haute-composante de l'ordreAu lieu de cela, vous devez utiliser le
withRouter
forte composante de l'ordre, et étirable à l'élément qui va pousser à l'histoire. Par exemple:Découvrez la documentation officielle pour plus d'info:
Utiliser le
context
APIÀ l'aide du contexte peut être une des solutions les plus simples, mais étant expérimentale de l'API, elle est instable et non pris en charge. Utiliser seulement quand tout le reste échoue. Voici un exemple:
Ont un look à la documentation officielle sur le contexte:
this.context.router.history.push('/path');
browserHistory
api, et il s'appuie sur l'api transmis par les accessoires, qui peuvent facilement être moqué/écrasé/espionné.C'est la façon dont je l'ai fait:
Utilisation
this.props.history.push('/cart');
pour rediriger vers la page du panier, il sera enregistré dans l'historique de l'objet.Profiter, Michael.
Selon Réagir Routeur v4 documentation - Redux l'Intégration en Profondeur de la session
L'intégration en profondeur est nécessaire pour:
Toutefois, ils recommandent cette approche comme une alternative à la "intégration profonde":
De sorte que vous pouvez envelopper votre composant avec le withRouter forte composante de l'ordre:
export default withRouter(connect(null, { actionCreatorName })(ReactComponent));
qui va passer à l'histoire de l'API pour les accessoires. Vous pouvez donc appeler l'action créateur de passage de l'histoire en tant que param. Par exemple, à l'intérieur de votre ReactComponent:
Puis, à l'intérieur de votre actions/index.js:
Méchant question, m'a pris beaucoup de temps, mais finalement, j'ai résolu de cette façon:
Envelopper votre récipient avec
withRouter
et de transmettre l'histoire de votre action dansmapDispatchToProps
fonction. Dans l'action de l'histoire.push ('url') pour naviguer.Action:
Conteneur:
Ceci est valable pour les Réagir Routeur v4.x.
Façon la plus simple de Réagir Routeur 4 est d'utiliser
Mais pour utiliser cette méthode, votre existant composant doit avoir accès à
history
objet. Nous pouvons accéder parSi votre composant est lié à
Route
directement, alors votre composant a déjà accès àhistory
objet.par exemple:
Ici
ViewProfile
a accès àhistory
.Si pas connecté à
Route
directement.par exemple:
Alors nous devons utiliser
withRouter
, un heigher ordre fuction de déformer le composant existant.À l'intérieur de
ViewUsers
composantimport { withRouter } from 'react-router-dom';
export default withRouter(ViewUsers);
C'est maintenant, votre
ViewUsers
composant a accès àhistory
objet.Mise à JOUR
2
- dans ce scénario, passer tous les parcoursprops
à votre composant, et alors nous pouvons accéder àthis.props.history
de la composante même sansHOC
par exemple:
this.props.history
) vient d'un HOC, ce qui signifie qu'il n'est pas directement liée à laRoute
, comme vous l'expliquez.this.context.history.push
ne fonctionnera pas.J'ai réussi à me pousser à travailler comme ceci:
Dans ce cas, vous êtes de passage accessoires pour votre thunk. De sorte que vous pouvez simplement appeler
Si ce n'est pas le cas vous pouvez toujours transmettre l'histoire de votre composant
Je vous offre la solution dans le cas où il est worthful pour quelqu'un d'autre.
J'ai un
history.js
fichier où j'ai le texte suivant:Prochain, sur ma Racine où je définir mon routeur j'utilise la suite:
Enfin, sur mon
actions.js
je l'importation de l'Histoire et de faire usage de pushLaterDe cette façon, je peux pousser à de nouvelles actions après les appels d'API.
Espère que cela aide!
J'ai été en mesure d'accomplir cela en utilisant
bind()
. J'ai voulu cliquer sur un bouton dansindex.jsx
, poster quelques données sur le serveur, l'évaluation de la réponse, et rediriger verssuccess.jsx
. Voici comment j'ai travaillé que sur...index.jsx
:request.js
:success.jsx
:En se liant
this
àpostData
dansindex.jsx
, j'ai été en mesure d'accéder àthis.props.history
dansrequest.js
... alors je peux réutiliser cette fonction dans les différentes composantes, juste pour faire sûr que je me souviens d'inclurethis.postData = postData.bind(this)
dans leconstructor()
.Utiliser Le Callback. Il a travaillé pour moi!
En composant, vous n'avez qu'à ajouter le rappel
Voici mon hack (c'est mon niveau de la racine de fichier, avec un peu de redux mélangé là - bien que je ne suis pas en utilisant
react-router-redux
):Je peux alors utiliser
window.appHistory.push()
d'où je veux (par exemple, dans mon redux fonctions de banque/thunks/sagas, etc) j'avais espéré que je pourrais simplement utiliserwindow.customHistory.push()
mais pour une raison quelconquereact-router
ne semblait jamais mise à jour, même si l'url a changé. Mais de cette façon, j'ai l'instance EXACTEreact-router
utilise. Je n'aime pas mettre des trucs dans le contexte global, et c'est l'une des rares choses que j'aimerais faire avec vous. Mais c'est mieux que n'importe quel autre que j'ai vu de l'OMI.Si vous utilisez Redux, alors je vous recommande d'utiliser npm paquet réagir-routeur-redux. Il vous permet d'expédition Redux stocker des actions de navigation.
Vous devez créer stocker comme décrit dans leur Fichier lisezmoi.
Le plus simple des cas d'utilisation:
Deuxième cas d'utilisation avec Conteneur/Composant:
Conteneur:
Composant:
next
version, qui est encore en cours de développement en ce moment!vous pouvez l'utiliser comme cela que je le fais pour la connexion et manny choses différentes
la première étape envelopper votre application dans le Routeur
Maintenant toute mon Application aura accès à BrowserRouter. Étape deux-je importer Route et passer ensuite en bas de ces accessoires. Probablement dans un de vos fichiers.
Maintenant, si je lance la console.journal(ce.les accessoires) dans mon composant fichier js que je devrais obtenir quelque chose qui ressemble à ce
L'étape 2, je peux accéder à l'historique de l'objet à modifier ma position
Aussi, je suis juste un codage bootcamp étudiant, donc je ne suis pas expert, mais je sais que vous aussi pouvez-vous utiliser
Corrigez-moi si je me trompe, mais quand j'ai testé ça il a recharger la page entière qui j'ai pensé a vaincu tout le point de l'utilisation de Réagir.
Réagir routeur V4 permet désormais de l'histoire prop être utilisé comme ci-dessous:
La valeur peut alors être accessible quel que soit le lieu accessoire est disponible en
state:{value}
pas état des composants.donc la façon dont je le fais, c'est:
- au lieu de redirection à l'aide
history.push
, je viens d'utiliserRedirect
composant dereact-router-dom
Lors de l'utilisation de ce composant, vous pouvez simplement passer
push=true
, et il prendra soin du resteCréer un personnalisé
Router
avec ses propresbrowserHistory
:Ensuite, sur votre Racine où vous définissez votre
Router
, utilisez la commande suivante:Enfin, l'importation
history
où vous en avez besoin et l'utiliser: