Dans la version actuelle de React Router (v3), je peux accepter une réponse du serveur et l'utiliser browserHistory.push
pour accéder à la page de réponse appropriée. Cependant, ce n'est pas disponible dans la v4, et je ne sais pas quelle est la façon appropriée de gérer cela.
Dans cet exemple, à l'aide de Redux, components / app-product-form.js appelle this.props.addProduct(props)
lorsqu'un utilisateur soumet le formulaire. Lorsque le serveur renvoie un succès, l'utilisateur est redirigé vers la page 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 Panier à partir de la fonction pour React Router v4?
context
pour passer ce dont vous avez besoin manuellement est un "no go". Sauf si je suis un auteur de bibliothèque, il ne devrait pas être nécessaire de l'utiliser. En fait, Facebook le déconseille.history
fonctionne également pour React Native comme option ainsi qu'une option supplémentaire de prise en charge des navigateurs hérités.Réponses:
Vous pouvez utiliser les
history
méthodes en dehors de vos composants. Essayez de la manière suivante.Tout d'abord, créez un
history
objet utilisé le package historique :Ensuite, enveloppez-le
<Router>
( veuillez noter , vous devez utiliser à laimport { Router }
place deimport { BrowserRouter as Router }
):Modifiez votre position actuelle à partir de n'importe quel endroit, par exemple:
UPD : Vous pouvez également voir un exemple légèrement différent dans la FAQ React Router .
la source
history.push('some path')
, l'URL change mais la page ne change pas. Je dois le mettrewindow.location.reload()
dans certaines parties de mon code juste pour le faire fonctionner. Cependant, dans un cas, je dois conserver l'arborescence d'état redux et le rechargement le détruit. Une autre solution?withRouter
composant d'ordre supérieur.import createHistory from 'history/createBrowserHistory'; export default createHistory();
-être que ce sera du travail.React Router v4 est fondamentalement différent de la v3 (et des versions antérieures) et vous ne pouvez plus faire
browserHistory.push()
comme avant.Cette discussion semble liée si vous voulez plus d'informations:
Au lieu de cela, vous avez quelques options pour ce faire:
Utilisez le
withRouter
composant de haut niveauAu lieu de cela, vous devez utiliser le
withRouter
composant de premier ordre et envelopper ce composant dans le composant qui passera à l'historique. Par exemple:Consultez la documentation officielle pour plus d'informations:
Utilisez l'
context
APIL'utilisation du contexte peut être l'une des solutions les plus simples, mais étant une API expérimentale, elle est instable et non prise en charge. Utilisez-le uniquement lorsque tout le reste échoue. Voici un exemple:
Jetez un oeil à la documentation officielle sur le contexte:
la source
this.context.router.history.push('/path');
Maintenant, avec react-router v5, vous pouvez utiliser le hook useHistory du cycle de vie comme ceci:
en savoir plus sur: https://reacttraining.com/react-router/web/api/Hooks/usehistory
la source
let history = useHistory();
mais j'obtiens uneObject is not callable
erreur, lorsque j'ai essayé de voir à quoi useHistoryconsole.log(useHistory)
apparaît comme indéfini. en utilisant"react-router-dom": "^5.0.1"
Le moyen le plus simple dans React Router 4 est d'utiliser
Mais pour utiliser cette méthode, votre composant existant doit avoir accès à l'
history
objet. Nous pouvons avoir accès parSi votre composant est
Route
directement lié à , votre composant a déjà accès àhistory
objet.par exemple:
Ici
ViewProfile
a accès àhistory
.S'il n'est pas connecté à
Route
directement.par exemple:
Ensuite, nous devons utiliser
withRouter
une fonction d'ordre supérieur pour déformer le composant existant.ViewUsers
Composant intérieurimport { withRouter } from 'react-router-dom';
export default withRouter(ViewUsers);
Voilà, votre
ViewUsers
composant a accès à l'history
objet.MISE À JOUR
2
- dans ce scénario, passez toutes les routesprops
vers votre composant, puis nous pourrons accéderthis.props.history
partir du composant même sansHOC
par exemple:
la source
this.props.history
) provient d'un HOC, ce qui signifie qu'il n'est pas directement lié auRoute
, comme vous l'expliquez.Voici comment je l'ai fait:
Utilisation
this.props.history.push('/cart');
pour rediriger vers la page du panier, il sera enregistré dans l'objet historique.Profitez-en, Michael.
la source
Selon la documentation de React Router v4 - Session Redux Deep Integration
Une intégration profonde est nécessaire pour:
Cependant, ils recommandent cette approche comme une alternative à "l'intégration profonde":
Vous pouvez donc envelopper votre composant avec le composant de haut niveau withRouter:
export default withRouter(connect(null, { actionCreatorName })(ReactComponent));
qui passera l'API historique aux accessoires. Vous pouvez donc appeler le créateur d'action en passant l'historique comme paramètre. Par exemple, dans votre ReactComponent:
Ensuite, à l'intérieur de vos actions / index.js:
la source
Question désagréable, cela m'a pris beaucoup de temps, mais finalement, je l'ai résolu de cette façon:
Enveloppez votre conteneur avec
withRouter
et passez l'historique à votre actionmapDispatchToProps
fonction. En action, utilisez history.push ('/ url') pour naviguer.Action:
Récipient:
Ceci est valable pour React v4.x Router .
la source
import { createBrowserHistory } from 'history'
une idée antérieure s'il vous plaît?this.context.history.push
ne fonctionnera pas.J'ai réussi à faire fonctionner push comme ceci:
la source
Dans ce cas, vous passez des accessoires à votre thunk. Vous pouvez donc simplement appeler
Si ce n'est pas le cas, vous pouvez toujours transmettre l'historique de votre composant
la source
J'offre une autre solution au cas où elle serait intéressante pour quelqu'un d'autre.
J'ai un
history.js
dossier où j'ai les éléments suivants:Ensuite, sur ma racine où je définis mon routeur, j'utilise ce qui suit:
Enfin, sur mon
actions.js
historique d'importation, j'utilise pushLaterDe cette façon, je peux pousser vers de nouvelles actions après les appels d'API.
J'espère que cela aide!
la source
Si vous utilisez Redux, je vous recommande d'utiliser le package npm react -router-redux . Il vous permet d'envoyer des actions de navigation dans le magasin Redux.
Vous devez créer un magasin comme décrit dans leur fichier Lisez-moi .
Le cas d'utilisation le plus simple:
Deuxième cas d'utilisation avec conteneur / composant:
Récipient:
Composant:
la source
next
version, qui est toujours en cours de développement en ce moment!J'ai pu accomplir cela en utilisant
bind()
. Je voulais cliquer sur un boutonindex.jsx
, publier des données sur le serveur, évaluer la réponse et rediriger verssuccess.jsx
. Voici comment j'ai travaillé cela ...index.jsx
:request.js
:success.jsx
:Donc , en me liant
this
àpostData
inindex.jsx
, j'ai pu accéder àthis.props.history
inrequest.js
... puis je peux réutiliser cette fonction dans différents composants, je dois juste m'assurer de ne pas oublier de l'inclurethis.postData = postData.bind(this)
dans leconstructor()
.la source
Voici mon hack (c'est mon fichier de niveau racine, avec un peu de redux mélangé - bien que je n'utilise pas
react-router-redux
):Je peux ensuite utiliser
window.appHistory.push()
n'importe où (par exemple, dans les fonctions / thunks / sagas de mon magasin redux), j'espérais pouvoir simplement utiliser,window.customHistory.push()
mais pour une raison quelconque, jereact-router
n'ai jamais semblé mettre à jour même si l'URL avait changé. Mais de cette façon, j'ai l'instance EXACTreact-router
utilise. Je n'aime pas mettre des choses à l'échelle mondiale, et c'est l'une des rares choses avec lesquelles je ferais ça. Mais c'est mieux que toute autre alternative que j'ai vue à l'OMI.la source
Utilisez le rappel. Ça a marché pour moi!
Dans le composant, il vous suffit d'ajouter le rappel
la source
donc la façon dont je le fais est: - au lieu de rediriger en utilisant
history.push
, j'utilise simplement leRedirect
composant dereact-router-dom
Lors de l'utilisation de ce composant, vous pouvez simplement passerpush=true
, et il s'occupera du restela source
React router V4 permet désormais d'utiliser l'accessoire d'historique comme ci-dessous:
La valeur peut alors être consultée partout où l'hélice de localisation est disponible en tant
state:{value}
qu'état non composant.la source
vous pouvez l'utiliser comme ça comme je le fais pour la connexion et différentes choses manny
la source
la source
première étape envelopper votre application dans le routeur
Maintenant, mon application entière aura accès à BrowserRouter. Étape deux J'importe Route, puis je transmets ces accessoires. Probablement dans l'un de vos fichiers principaux.
Maintenant, si j'exécute console.log (this.props) dans mon fichier js de composant, je devrais obtenir quelque chose qui ressemble à ceci
Étape 2 Je peux accéder à l'objet historique pour modifier ma position
De plus, je ne suis qu'un étudiant en bootcamp de codage, donc je ne suis pas un expert, mais je sais que vous pouvez également utiliser
Corrigez-moi si je me trompe, mais quand j'ai testé cela, il a rechargé la page entière, ce qui, à mon avis, a vaincu l'intérêt d'utiliser React.
la source
Créez une coutume
Router
avec la siennebrowserHistory
:Ensuite, sur votre racine où vous définissez votre
Router
, utilisez ce qui suit:Enfin, importez
history
où vous en avez besoin et utilisez-le:la source
Si vous souhaitez utiliser l'historique tout en passant une fonction en tant que valeur à l'accessoire d'un composant, avec react-router 4, vous pouvez simplement détruire l'
history
accessoire dans l'attribut de rendu du<Route/>
composant, puis utiliserhistory.push()
Remarque: pour que cela fonctionne, vous devez enrouler le composant BrowserRouter de React Router autour de votre composant racine (par exemple, qui pourrait être dans index.js)
la source