Je suis nouveau sur ReactJS et sur React-Router. J'ai un composant qui reçoit via des accessoires un <Link/>
objet de react-router . Chaque fois que l'utilisateur clique sur un bouton «suivant» dans ce composant, je souhaite appeler l' <Link/>
objet manuellement.
À l'heure actuelle, j'utilise des références pour accéder à l' instance de support et en cliquant manuellement sur la balise «a» qui <Link/>
génère.
Question: Existe - t-il un moyen d'invoquer manuellement le lien (par exemple this.props.next.go
)?
Voici le code actuel que j'ai:
//in MasterPage.js
var sampleLink = <Link to="/sample">Go To Sample</Link>
<Document next={sampleLink} />
//in Document.js
...
var Document = React.createClass({
_onClickNext: function() {
var next = this.refs.next.getDOMNode();
next.querySelectorAll('a').item(0).click(); //this sounds like hack to me
},
render: function() {
return (
...
<div ref="next">{this.props.next} <img src="rightArrow.png" onClick={this._onClickNext}/></div>
...
);
}
});
...
Voici le code que j'aimerais avoir:
//in MasterPage.js
var sampleLink = <Link to="/sample">Go To Sample</Link>
<Document next={sampleLink} />
//in Document.js
...
var Document = React.createClass({
render: function() {
return (
...
<div onClick={this.props.next.go}>{this.props.next.label} <img src="rightArrow.png" /> </div>
...
);
}
});
...
la source
React Router 4 inclut un withRouter HOC qui vous donne accès à l'
history
objet viathis.props
:la source
Dans la version 5.x , vous pouvez utiliser le
useHistory
hook dereact-router-dom
:la source
if ((routerHistory.location.pathname + routerHistory.location.search) !== navigateToPath) { routerHistory.push(navigateToPath); }
history
variable, l'invocation de répertoireuseHistory().push
n'est pas autorisée par les règles de hookshttps://github.com/rackt/react-router/blob/bf89168acb30b6dc9b0244360bcbac5081cf6b38/examples/transitions/app.js#L50
ou vous pouvez même essayer d'exécuter surCliquez sur ceci (solution plus violente):
la source
assign
n'est pas non plus une propriété, c'est une fonction.Ok, je pense que j'ai pu trouver une solution appropriée pour cela.
Maintenant, au lieu d'envoyer
<Link/>
comme accessoire à Document, j'envoie<NextLink/>
un wrapper personnalisé pour le lien react-router. En faisant cela, je suis capable d'avoir la flèche droite dans le cadre de la structure Link tout en évitant toujours d'avoir le code de routage à l'intérieur de l'objet Document.Le code mis à jour ressemble à ceci:
PS : Si vous utilisez la dernière version de react-router, vous devrez peut-être utiliser à la
this.context.router.transitionTo
place dethis.context.transitionTo
. Ce code fonctionnera correctement pour la version 0.12.X de react-router.la source
React Router 4
Vous pouvez facilement invoquer la méthode push via le contexte dans la v4:
this.context.router.push(this.props.exitPath);
où le contexte est:
la source
BrowserRouter
, l'objet de contexte de mes composants ne contient pas d'router
objet. Est-ce que je fais quelque chose de mal?router: React.PropTypes.object.isRequired
. Je ne sais pas pourquoi cela n'a pas fonctionné sans laisRequired
clé. Aussi,<Link>
semble être en mesure d'obtenir lehistory
contexte, mais je n'ai pas pu le reproduire.this.props.history.push()
dans React Router v4. Je n'ai trouvé cela qu'en inspectant les accessoires dans lesquels React Router passe. Cela semble fonctionner mais je ne suis pas sûr que ce soit une bonne idée.encore une fois c'est JS :) cela fonctionne toujours ....
la source