Par programme de naviguer à l'aide de réagir routeur
Avec react-router
je peux utiliser le Link
élément de créer des liens qui sont nativement géré par réagir routeur.
Je vois intérieurement il appelle this.context.transitionTo(...)
.
Je veux faire de la navigation, mais pas à partir d'un lien, à partir d'une liste déroulante de sélection par exemple. Comment puis-je le faire dans le code? Qu'est-ce que this.context
?
J'ai vu le Navigation
mixin, mais puis-je le faire sans mixin?
gardez à l'esprit que cette question est à cheval sur une version majeure de réagir-routeur, une version majeure de Réagir, ET d'une version majeure de javascript
Voici un lien vers le tutoriel officiel de l'docs de réagir routeur v4: reacttraining.com/react-router/web/guides/scroll-restoration
Vous pouvez vérifier cette réponse stackoverflow.com/questions/44127739/...
Je suis content que vous avez obtenu cette réponse, mais je suis triste cela est compliqué. La navigation au sein d'une application web doit être facile et bien documenté. VueJS fait trivial. Chaque composant reçoit le routeur instance injecté automatiquement. Il y a clairement une section dans leurs docs. router.vuejs.org/guide/essentials/navigation.html j'aime Réagir pour beaucoup de choses, mais c'est tellement trop compliqué parfois. </rant>
Partir de la version 4, il ne pouvait vraiment pas être plus simple, plus réagir routeur n'est pas une partie de réagir, mais il y a un composant de partie. @colefner s'il vous plaît ne laissez pas les commentaires de ce genre, vous pouvez imaginer la folie qui stackoverflow deviendrait si les gens ont commencé à le faire sur chaque question.
Voici un lien vers le tutoriel officiel de l'docs de réagir routeur v4: reacttraining.com/react-router/web/guides/scroll-restoration
Vous pouvez vérifier cette réponse stackoverflow.com/questions/44127739/...
Je suis content que vous avez obtenu cette réponse, mais je suis triste cela est compliqué. La navigation au sein d'une application web doit être facile et bien documenté. VueJS fait trivial. Chaque composant reçoit le routeur instance injecté automatiquement. Il y a clairement une section dans leurs docs. router.vuejs.org/guide/essentials/navigation.html j'aime Réagir pour beaucoup de choses, mais c'est tellement trop compliqué parfois. </rant>
Partir de la version 4, il ne pouvait vraiment pas être plus simple, plus réagir routeur n'est pas une partie de réagir, mais il y a un composant de partie. @colefner s'il vous plaît ne laissez pas les commentaires de ce genre, vous pouvez imaginer la folie qui stackoverflow deviendrait si les gens ont commencé à le faire sur chaque question.
OriginalL'auteur George Mauer | 2015-06-26
Vous devez vous connecter pour publier un commentaire.
Avec la v4 de Réagir Routeur, il existe trois approches que vous pouvez prendre pour programmatique de routage au sein de composants.
withRouter
d'ordre supérieur composant.<Route>
context
.Réagir Routeur est surtout un wrapper autour de la
histoire
de la bibliothèque.history
gère l'interaction avec le navigateurwindow.histoire
pour vous avec son navigateur et le hachage des histoires. Il fournit également une mémoire de l'histoire qui est utile pour les environnements qui n'ont pas une histoire globale. Ceci est particulièrement utile dans le développement d'applications mobiles (react-native
) et les tests unitaires avec le Noeud.Un
history
instance a deux méthodes de navigation:push
etreplace
. Si vous pensez que lehistory
comme un ensemble d'endroits visités,push
va ajouter un nouvel emplacement pour la pile etreplace
remplacera l'actuel emplacement du tableau avec la nouvelle. En général, vous voulez utiliser lepush
méthode lorsque vous vous déplacez.Dans les versions antérieures de Réagir Routeur, vous deviez créer votre propre
history
exemple, mais dans la v4<BrowserRouter>
,<HashRouter>
, et<MemoryRouter>
composants de créer un navigateur, de hachage et de la mémoire de cas pour vous. Réagir Routeur fait la propriétés et méthodes de lahistory
instance associée à votre routeur à disposition par le contexte, en vertu de larouter
objet.1. Utiliser le
withRouter
d'ordre supérieur composantLa
withRouter
d'ordre supérieur composant va injecter lahistory
objet comme un accessoire de la composante. Cela vous permet d'accéder à lapush
etreplace
méthodes sans avoir à traiter avec lecontext
.2. Utilisation de la composition et de rendre une
<Route>
La
<Route>
composant n'est pas seulement pour les emplacements correspondants. Vous pouvez rendre un pathless route et il sera toujours correspondre à l'emplacement actuel. Le<Route>
composant passe les mêmes accessoires quewithRouter
, de sorte que vous serez en mesure d'accéder à lahistory
méthodes par lehistory
prop.3. Utiliser le contexte*
Mais vous ne devriez probablement pas
La dernière option est celle que vous devez utiliser uniquement si vous vous sentez à l'aise de travailler avec Réagissent de contexte modèle. Bien que le contexte est une option, il convient de souligner que le contexte est un instable de l'API et de Réagir a une section Pourquoi Ne Pas Utiliser Le Contexte dans leur documentation. Donc à utiliser à vos risques et périls!
1 et 2 sont les plus simples des choix à mettre en œuvre, dans la plupart des cas d'utilisation, ils sont vos meilleurs paris.
QUOI!? Je peux utiliser
withRouter
au lieu de passerhistory
vers le bas à travers l'ensemble de mes composants?? Gahh j'ai besoin de passer plus de temps à lire des docs...Comment pouvez-vous exécuter
history.push('/new-location')
sans les attacher que le comportement d'un Bouton ou un autre élément du DOM?jeter erreur comme
Unexpected use of 'history' no-restricted-globals
context
n'est pas expérimental, plus que de réagir 16.OriginalL'auteur Paul S
En 4.0 et ci-dessus, l'utilisation de l'histoire comme un accessoire de votre composant.
REMARQUE: cette.accessoires de jeu.histoire de ne pas exister dans le cas où votre composant n'a pas été rendue par
<Route>
. Vous devez utiliser<Route path="..." component={YourComponent}/>
de l'avoir.accessoires de jeu.l'histoire en YourComponentEn 3.0 et au-dessus, utiliser le routeur comme un accessoire de votre composant.
2.4 et au-dessus, une plus forte composante de l'ordre pour obtenir le routeur comme un accessoire de votre composant.
Cette version est compatible avec 1.x, donc il n'y a pas besoin d'un Guide de Mise à niveau. Tout simplement en passant par les exemples doivent être assez bon.
Cela dit, si vous souhaitez basculer vers le nouveau modèle, il y a un browserHistory module à l'intérieur du routeur que vous pouvez accéder à la
import { browserHistory } from 'react-router'
Maintenant, vous avez accès à l'historique de votre navigateur, de sorte que vous pouvez faire des choses comme push, remplacer, etc... Comme:
browserHistory.push('/some/path')
Davantage de lecture:
Histoires et
La Navigation
Je n'entrerai pas dans les détails de la mise à niveau. Vous pouvez lire à ce sujet dans le Guide De Mise À Niveau
Le principal changement sur la question ici est le changement de la Navigation mixin à l'Histoire. Maintenant, c'est à l'aide du navigateur historyAPI de changer d'itinéraire nous allons donc utiliser
pushState()
à partir de maintenant.Voici un exemple en utilisant Mixin:
Noter que cette
History
vient de rackt/histoire projet. Pas de Réagir-Routeur lui-même.Si vous ne souhaitez pas utiliser le Mixin pour une raison quelconque (peut-être à cause de l'ES6 classe), alors vous pouvez accéder à l'historique que vous obtenez à partir du routeur de
this.props.history
. Il sera accessible uniquement pour les composants rendus par votre Routeur. Donc, si vous voulez l'utiliser dans n'importe quel enfant de composants, il doit être transmis sous forme d'un attribut viaprops
.Vous pouvez en savoir plus sur la nouvelle version à leur 1.0.x de la documentation
Ici est une page d'aide spécifiquement sur la navigation à l'extérieur de votre composante
Il recommande de saisir une référence
history = createHistory()
et de l'appel dereplaceState
sur que.Je suis dans le même problème et trouver la solution avec la Navigation mixin qui vient avec réagissent-routeur.
Voici comment je l'ai fait
J'ai été en mesure d'appeler
transitionTo()
sans avoir besoin d'accéder.context
Ou vous pouvez essayer la fantaisie ES6
class
Réagir-Routeur-Redux a quelques méthodes disponibles qui permettent la simple navigation à partir de l'intérieur de l'action de créateurs. Ceux-ci peuvent être particulièrement utiles pour les personnes qui ont de l'architecture existante de Réagir Natif, et qu'ils souhaitent utiliser les mêmes modèles de Réagir Web avec un minimum de standard de frais généraux.
Explorer les méthodes suivantes:
push(location)
replace(location)
go(number)
goBack()
goForward()
Voici un exemple d'utilisation, avec Redux-Thunk:
./actioncreators.js
./viewcomponent.js
v2.4.0
mais la évoqué approche ne fonctionne pas pour moi, mon application ne permet pas de rendre à tous et la console de sorties:Uncaught TypeError: (0 , _reactRouter.withRouter) is not a function
voici le lien de mon post: stackoverflow.com/questions/37306166/...Ce doit être la accepté de répondre, la accepté l'on est un peu en bordel et est très ancienne. @GiantElk je avoir de travail comme indiqué dans la réponse pour la version
2.6.0
.Cette approche est-elle encore la méthode recommandée pour la version
3.0.x
? Beaucoup de gens semblent utiliser lecontext
façon.dans la version 4.0, cette.accessoires de jeu.l'histoire n'existe pas. Ce qui se passe?
n'existe pas dans le cas de votre composant n'a pas été rendue par
<Route>
. Vous devez utiliser<Route path="..." component={YourComponent}/>
avoirthis.props.history
dansYourComponent
.OriginalL'auteur Felipe Skinner
Pour la version la plus récente (
v2.0.0-rc5
), la méthode de navigation est directement en poussant sur l'histoire de singleton. Vous pouvez voir que dans l'action dans la Naviguer à l'extérieur de Composants doc.Extrait pertinent:
Si à l'aide de la plus récente réagir-routeur API, vous avez besoin de faire usage de la
history
dethis.props
quand à l'intérieur de composants:Il offre également
pushState
mais qui est désapprouvée par connecté avertissements.Si vous utilisez
react-router-redux
, il offre unpush
fonction, vous pouvez expédier comme suit:Cependant, cela peut seulement être utilisé pour modifier l'URL, pas réellement naviguer sur la page.
import { browserHistory } from './react-router'
mais crée plutôt de l'histoire à l'aide deimport createBrowserHistory from 'history/lib/createBrowserHistory'
. Plus tard, vous pouvez accéder àhistory
de composants accessoires:this.props.history('/some/path')
var browserHistory = require('react-router').browserHistory; browserHistory.goBack();
réagir-routeur-redux
push
seuls les changements d'URL, n'est pas réellement changer de page. De faire les deux, l'importationbrowserHistory
dereact-router
et l'utilisationbrowserHistory.push('/my-cool-path')
. Malheureusement, ce n'est pas super facile à trouver. github.com/reactjs/react-router/blob/master/docs/guides/...Je suis en utilisant ce.accessoires de jeu.l'histoire.push('/') mais uniquement l'URL est changé... Pas de routage qui se passe ici. Ce qui me manque?
Je viens de téléchargé mon prendre sur comment naviguer par programmation dans les dernières
react-router
v4OriginalL'auteur Bobby
Voici comment faire cela avec
réagissent-routeur v2.0.0
avec ES6.react-router
a éloigné de mixin.history
singleton comme indiqué par @Bobby. Vous pourrait utilisercontext.router
mais vous faites, il est vraiment difficile de test de l'unité de ces éléments que l'instanciation de tout ce composant n'aura pas de cela dans le contexte.Je pense que ça dépend de l'endroit où le code est en cours d'exécution. Comme par réagir docs, le contexte.routeur d'utilisation est recommandée si il est exécuté sur le serveur. github.com/reactjs/react-router/blob/master/upgrade-guides/...
OriginalL'auteur Alex Miller
Sur ma fin, j'aime en avoir un seul de l'histoire de l'objet que je puisse porter même en dehors de composants. Ce que j'aime faire est d'avoir un seul history.js fichier que je l'importation sur la demande, et seulement pour la manipuler.
Vous avez juste à changer
BrowserRouter
de Routeur, et de préciser l'histoire prop. Cela ne changera rien pour vous, sauf que vous avez votre propre histoire de l'objet que vous pouvez manipuler comme vous le souhaitez.Vous devez installer l'histoire, la bibliothèque utilisée par
react-router
.Exemple d'utilisation, ES6 notation :
history.js
BasicComponent.js
Si vous devez naviguer à partir d'un composant qui est effectivement rendu à partir d'un
Route
composant, vous pouvez également accéder à l'historique d'accessoires, comme ça :BasicComponent.js
Router
au lieu deBrowserRouter
.BrowserRouter
crée et maintient l'history
objet pour vous. Vous ne devriez pas par défaut à la création de votre propre, mais seulement si vous ["besoin profond de l'intégration avec la gestion de l'état des outils comme Redux."] reacttraining.com/react-router/web/api/RouterC'est quelque chose que j'ai appris au fil du temps et de l'expérience. Alors qu'il est généralement une bonne pratique d'utiliser la valeur par défaut
this.props.history
, je n'ai pas encore trouvé une solution qui peut m'aider à faire une telle chose dans une classe qui n'est pas un composant ou tout autre outil qui n'est pas construit comme une Réagir la composante à laquelle vous pouvez transmettre les accessoires. Merci pour vos commentaires 🙂OriginalL'auteur Eric Martin
Pour celui-ci, qui n'a pas de contrôle sur le côté serveur et de ce fait est à l'aide de hachage routeur v2:
Placez votre l'histoire en fichier séparé (par ex. app_history.js ES6):
Et de l'utiliser partout!
Votre point d'entrée pour réagir-routeur (app.js ES6):
Votre navigation à l'intérieur d'une composante (ES6):
Lorsque vous utilisez le "hachage" de navigation, de "réagir " routeur"v2 vous devez installer le module supplémentaire "histoire" (si vous voulez éviter étrange de hachage requêtes), et au lieu d'utiliser browserHistory vous devez utiliser useRouterHistory(createHashHistory)({ queryKey: false }). C'est la principale raison pourquoi j'ai posté cette. Je vous ai montré comment naviguer avec le hachage de l'histoire.
Oh, je vois, vous avez raison. Je ne suis pas sur le projet en plus mais je pense que le meilleur moyen est d'utiliser
history
pour l'une ou l'autre approche maintenantpourquoi cette réponse n'est pas la meilleure? pourquoi aller à tous les problèmes avec le Contexte ou ad HOC ou d'un événement prototypes, pourquoi ne pas importer l'histoire et l'utiliser partout où nous s'il vous plaît? juste essayer de comprendre les compromis
il n'y a pas de compromis. Nous avons ES6 modules et nous devrions les utiliser! C'est un typique vitrine de l'aide de votre outil de réagir dans ce cas) pour tout, même pour des choses que vous ne voulez pas vraiment de les utiliser pour.
OriginalL'auteur Alexey Volodko
Vous pouvez le faire sans mixin trop.
La chasse aux sorcières avec leurs contextes, c'est qu'il n'est pas accessible, sauf si vous définissez la
contextTypes
sur la classe.Que pour ce qui est du contexte, c'est un objet, comme les accessoires, qui sont transmis de parent à enfant, mais il est transmis implicitement, sans avoir à redeclare accessoires à chaque fois. Voir https://www.tildedave.com/2014/11/15/introduction-to-contexts-in-react-js.html
OriginalL'auteur Qiming
tl:dr;
La simple et déclarative réponse est que vous devez utiliser
<Redirect to={URL} push={boolean} />
en combinaison avecsetState()
Exemple complet ici.
Lire plus ici.
PS. L'exemple utilise ES7+ Propriété des Initialiseurs à l'initialisation de l'état. Regarder ici ainsi, si vous êtes intéressé.
withRouter
ne fonctionne pas quand déjà sur la route qui est en train d'être rechargé. Dans notre cas, nous avons dû sélectivement, soit nesetState
(provoquantreturn <Redirect>
) s'il est déjà sur la route ouhistory.push()
d'ailleurs.Très, très intelligent. Et pourtant très simple. Tks. Je l'ai utilisé à l'intérieur de ReactRouterTable depuis que j'ai voulu gérer le clic sur l'ensemble de la ligne. Utilisé sur onRowClick pour définir l'état. setState({accédera: "/chemin/" + ligne.uuid});
OriginalL'auteur Lyubomir
J'ai essayé au moins 10 façons de le faire avant que quelque chose de travaillé droite!
@Felipe Skinner
withRouter
réponse a été un peu écrasante pour moi, et je n'étais pas sûr que je voulais faire de nouveaux "ExportedWithRouter" les noms de classe.Voici la plus simple et la plus propre de le faire, circa actuel Réagir-Routeur 3.0.0 et ES6:
ou, si ce n'est pas votre défaut de la classe, à l'exportation comme:
Noter que dans le 3.x.x, le
<Link>
composant lui-même est à l'aide derouter.push
, de sorte que vous pouvez passer quelque chose, que vous devez passer la<Link to=
la balise:200 OK
au lieu de30x
code. Comment puis-je résoudre ce problème?Pas sûr. Ce n'est jamais venu pour moi parce que ce n'est pas une demande externe, c'est juste votre navigateur à l'aide de la page de code pour modifier ce qui est sur la page. Vous pouvez toujours faire un manuel de redirection javascript si vous préférez.
il peut également être utilisé avec @withRouter en tant que classe, décorateur ... va très bien avec mobx
OriginalL'auteur Ben Wheeler
À faire de la navigation de la programmation, vous avez besoin de pousser un nouveau histoire à la accessoires.l'histoire dans votre
component
, donc quelque chose comme cela peut faire le travail pour vous:OriginalL'auteur Alireza
Pour ES6 + Réagir composants, la solution suivante a fonctionné pour moi.
J'ai suivi Felippe skinner, mais il a ajouté une solution de bout en bout pour aider les débutants comme moi.
Ci-dessous sont les versions que j'ai utilisé:
Ci-dessous est mon réagir composant où j'ai utilisé programmatique de navigation à l'aide de réagir-routeur:
Ci-dessous est la configuration de mon routeur:
OriginalL'auteur Softwareddy
Veuillez trouver ci-dessous code du travail:
Comme discuté dans cet article, il est très simple de naviguer à l'aide de réagir Routeur:
<Rediriger/> est
Enregistreuse est en cours de rendu par Réagir Routeur, notre code pourrait ressembler à ceci
en ajoutant withRouter, il devrait ressembler à ceci
Il y a deux façons de programmation pour naviguer à Réagir de Routeur et de l'histoire.push. Que vous utilisez est la plupart du temps à vous et à votre cas d'utilisation spécifiques, bien que j'essaie de faveur de Redirection.
OriginalL'auteur kiran malvi
Vous pouvez utiliser
withRouter
etthis.props.history.push
.OriginalL'auteur Hossein
À utiliser
withRouter
avec une classe de composant, essayez quelque chose comme ce ci-dessous.N'oubliez pas de modifier l'instruction d'exportation à utiliser
withRouter
:import { withRouter } from 'react-router-dom'
OriginalL'auteur Janos
basée sur la réponse précédente
à partir de José Antonio Postigo et Ben Wheeler
la nouveauté? doit être écrit dans Tapuscrit
et l'utilisation de décorateurs
OU statique propriété/domaine
avec tout ce que mnp installé aujourd'hui.
"réagir " routeur": "^3.0.0" et
"@types/réagir-routeur": "^2.0.41"
OriginalL'auteur Dan
avec Réagissent-Routeur v4 sur l'horizon, il y a maintenant une nouvelle manière de faire.
réagir-lego est un exemple d'application qui montre comment utiliser/mise à jour de réagir-routeur et il comprend des exemples de tests fonctionnels qui naviguer dans l'application.
OriginalL'auteur peter.mouland
À réagir routeur v4. J'ai suivi ce les deux sens de parcours de la programmation.
Numéro deux
Pour obtenir l'histoire dans les accessoires que vous pourriez avoir à envelopper votre composant avec
OriginalL'auteur saiful619945
Avec le courant de Réagir version (15.3),
this.props.history.push('/location');
a fonctionné pour moi, mais il a montré l'avertissement suivant:et je l'ai résolu en utilisant
context.router
comme ceci:OriginalL'auteur José Antonio Postigo
Si vous utilisez de hachage ou de l'historique du navigateur, alors vous pouvez faire
hashHistory.push
, donne Impossible de lire la propriété "push" undefined. Où voulez-vous de les importer à partir de?importer {hashHistory} à partir de "réagir " routeur", vous pouvez importer de cette façon dans la partie supérieure.
Je suis à l'aide de votre code d'échantillon de mon redux saga fichier, importer, exactement comme vous l'avez dit et de l'utiliser mais je reçois que TypeError.
OriginalL'auteur Zaman Afzal
Réagir-Routeur V4
si vous utilisez la version 4 vous pouvez ensuite utiliser ma bibliothèque (Shameless plug) où il vous suffit de l'expédition d'une action et tout fonctionne, tout simplement!
https://www.npmjs.com/package/trippler
OriginalL'auteur Garry Taylor
Ceux qui sont confrontés à des problèmes dans la mise en œuvre de ce à réagir-routeur v4.
Voici une solution qui fonctionne pour naviguer à travers le réagir application de redux actions.
history.js
App.js/Route.jsx
another_file.js OU redux fichier
À tous merci pour ce commentaire:
ReactTraining questions en commentaire
OriginalL'auteur reflexgravity
Si arriver à paire RR4 w/redux par réagir-routeur-redux, utiliser le routage d'action des créateurs de
react-router-redux
est une option.Si l'utilisation redux thunk/saga pour gérer async flux, l'importation de l'action ci-dessus créateurs dans redux actions et le crochet pour réagir composants à l'aide de mapDispatchToProps peut-être mieux.
react-router-redux
a été abandonné/archivés pendant une longue périodeOriginalL'auteur Xlee
La bonne réponse était pour moi au moment de la rédaction
Mais vous devez ajouter PropTypes à votre composant
N'oubliez pas d'importer PropTypes
Rien à l'importation, ce qui est de la version "réagir " routeur": "^4.2.0"
OriginalL'auteur webmaster
Peut-être pas la meilleure solution, mais il fait le travail:
Fondamentalement, à une logique liée à une action (dans ce cas, un poste de suppression) finiront par appeler un déclencheur pour la redirection. Ce n'est pas l'idéal parce que vous allez ajouter un nœud DOM 'trigger' à votre balisage, de sorte que vous pouvez facilement appeler en cas de besoin. Aussi, vous pourrez interagir directement avec les DOM, qui, dans une Réagir composant peut ne pas être désirée.
Encore, ce type de redirection n'est pas nécessaire que souvent. Donc un ou deux de plus, des liens cachés dans votre composant de balisage ne serait pas mal que bien, surtout si vous leur donner des noms significatifs.
C'est juste une solution alternative au problème discuté. Comme déjà dit, pas l'idéal, mais il fonctionne très bien pour la programmation des redirections.
OriginalL'auteur neatsu
En supposant que vous ne serez pas en avoir besoin pour naviguer lors de la première de rendre lui-même (pour lesquels vous pouvez utiliser
<Redirect>
composant), c'est ce que nous faisons dans notre application.Définir un itinéraire vide qui renvoie la valeur null, ce qui vous permettra d'obtenir l'accès à l'histoire de l'objet. Vous devez le faire au plus haut niveau où votre
Router
est défini.Maintenant, vous pouvez faire toutes les choses qui peuvent être faites sur l'histoire comme
history.push()
,history.replace()
,history.go(-1)
etc!OriginalL'auteur Aftab Khan
Il suffit juste d'utiliser
this.props.history.push('/where/to/go');
OriginalL'auteur Oka Prinarjaya
Simple réagir de routage:
Lien vers mon code bac à sable.
Il y a quelques autres simple réagir-redux programmes.
le code est assez grande avec un grand nombre de fichiers. je suis désolé, je ne peux pas poster. Merci
OriginalL'auteur Aftab22