J'ai la structure suivante pour mon application React.js utilisant React Router :
var Dashboard = require('./Dashboard');
var Comments = require('./Comments');
var Index = React.createClass({
render: function () {
return (
<div>
<header>Some header</header>
<RouteHandler />
</div>
);
}
});
var routes = (
<Route path="/" handler={Index}>
<Route path="comments" handler={Comments}/>
<DefaultRoute handler={Dashboard}/>
</Route>
);
ReactRouter.run(routes, function (Handler) {
React.render(<Handler/>, document.body);
});
Je souhaite transmettre certaines propriétés au Comments
composant.
(normalement je ferais ça comme <Comments myprop="value" />
)
Quelle est la manière la plus simple et la plus appropriée de le faire avec React Router?
javascript
properties
reactjs
react-router
Kosmetika
la source
la source
<ComponentA x={<ComponentB y={<ComponentC z={} />} />} />
OR<ComponentA x={ComponentB(ComponentC()) } />
Sinon, ces problèmes de combinaisons d'abstractions se reproduiront et nécessiteront des solutions moins qu'optimales et indirectes appelées solutions de contournement comme l'emballage, etc., etc. Les abstractions doivent être des citoyens de première classe en tant que primitifs, quelle que soit la perception de première classe.Réponses:
METTRE À JOUR
Depuis la nouvelle version, il est possible de passer des accessoires directement via le
Route
composant, sans utiliser de Wrapper. Par exemple, en utilisantrender
prop .Composant:
Usage:
Exemple de code et de boîte
ANCIENNE VERSION
Ma façon préférée est d'envelopper le
Comments
composant et de passer l'encapsuleur en tant que gestionnaire d'itinéraire.Voici votre exemple avec des changements appliqués:
la source
<Route path="comments" component={() => (<Comments myProp="value" />)}/>
Si vous préférez ne pas écrire de wrappers, je suppose que vous pouvez le faire:
la source
route
un objet simple dans votre composant. Voici la réponse du problème github: github.com/rackt/react-router/issues/615#issuecomment-100432086Copie des commentaires de ciantic dans la réponse acceptée:
C'est la solution la plus gracieuse à mon avis. Ça marche. M'a aidé.
la source
_ref
component={(props) => (<Comments myProp="value" location={ props.location } />)}
mais tout devient de nouveau en désordrecomponent={(props) => (<Comments {...props} myProp="value" />)}
maintenir les accessoires injectésIl s'agit de la solution de Rajesh , sans les inconvénients commentés par yuji , et mise à jour pour React Router 4.
Le code serait comme ceci:
Notez que j'utilise à la
render
place decomponent
. La raison est d'éviter un remontage indésirable . Je passe également leprops
à cette méthode, et j'utilise les mêmes accessoires sur le composant Commentaires avec l'opérateur de propagation d'objet (proposition ES7).la source
Juste un suivi de la réponse de ColCh. Il est assez facile d'abstraire l'habillage d'un composant:
Je n'ai pas encore testé cette solution, donc tout commentaire est important.
Il est important de noter qu'avec cette méthode, tous les accessoires envoyés via le routeur (tels que les paramètres) sont remplacés / supprimés.
la source
return React.createElement(Component, _.assign({}, this.props, props));
(Celui-ci utilise _.assign pour composer l'objet combiné ... d'autres méthodes sont bien sûr disponibles).render
,component
et leschildren
méthodes pourRoute
. Notez que comme l' indique la réponse @dgrcode , vous devez utiliser à larender
place decomponent
Vous pouvez passer des accessoires en les passant à
<RouteHandler>
(dans la v0.13.x) ou au composant Route lui-même dans la v1.0;(à partir du guide de mise à niveau à https://github.com/rackt/react-router/releases/tag/v1.0.0 )
Tous les gestionnaires d'enfants recevront le même ensemble d'accessoires - cela peut être utile ou non selon les circonstances.
la source
React.cloneElement
passer plusieurs éléments, mais la signature de la fonction semble ne prendre qu'un seul élément de réaction. Je pense que cet extrait peut être rendu plus facile à comprendre.React.cloneElement(this.props.children, {myprop: "value"})
ouReact.cloneElement(this.props.children, {myprop: this.props.myprop})
etc.En utilisant ES6, vous pouvez simplement rendre les wrappers de composants en ligne:
<Route path="/" component={() => <App myProp={someValue}/>} >
Si vous devez passer des enfants:
<Route path="/" component={(props) => <App myProp={someValue}>{props.children}</App>} >
la source
render
place decomponent
React-router v4 alpha
maintenant, il existe une nouvelle façon de le faire, bien que très similaire à la méthode précédente.
PS Cela ne fonctionne que dans la version alpha et a été supprimé après la version alpha v4. Dans la dernière version v4, c'est encore une fois, avec le chemin et les accessoires exacts.
react-lego un exemple d'application contient du code qui fait exactement cela dans routes.js sur sa branche react-router-4
la source
Voici la solution la plus propre que j'ai trouvée (React Router v4):
MyComponent
a encoreprops.match
etprops.location
, et aprops.foo === "lol"
.la source
Enveloppez-le avec un composant de fonction sans état:
la source
Vous pouvez également utiliser le mixin RouteHandler pour éviter le composant wrapper et transmettre plus facilement l'état du parent comme accessoires:
la source
Vous pouvez passer des accessoires via
<RouterHandler/>
comme ceci:L'inconvénient est que vous passez des accessoires sans discernement.
Comments
Cela peut donc finir par recevoir des accessoires qui sont vraiment destinés à un composant différent en fonction de la configuration de vos itinéraires. Ce n'est pas énorme car ilprops
est immuable, mais cela peut être problématique si deux composants différents attendent un accessoire nomméfoo
mais avec des valeurs différentes.la source
{...props}
Dans 1.0 et 2.0, vous pouvez utiliser
createElement
prop ofRouter
pour spécifier comment créer exactement votre élément cible. Source de documentationla source
Vous pouvez également combiner les fonctions es6 et sans état pour obtenir un résultat beaucoup plus net :
la source
this.props
une fonction qui, je suis sûr, ne fonctionnera pas. Si vous utilisez des fonctions pures au lieu d'étendre le,React.Component
vous devez passerprops
comme argument, consultez la documentation React sur les composants et les accessoiresSolution React Router v 4
Je suis tombé sur cette question plus tôt dans la journée, et voici le modèle que j'utilise. J'espère que cela sera utile à tous ceux qui recherchent une solution plus actuelle.
Je ne sais pas si c'est la meilleure solution, mais c'est mon schéma actuel pour cela. J'ai généralement un répertoire Core où je conserve mes composants couramment utilisés avec leurs configurations pertinentes (chargeurs, modaux, etc.), et j'inclus un fichier comme celui-ci:
Ensuite, dans le fichier en question, je ferai ce qui suit:
Vous remarquerez que j'importe l'exportation par défaut de mon composant comme humble cas de chameau, ce qui me permet de nommer le nouveau composant de localisation dans CamelCase afin que je puisse l'utiliser normalement. Outre la ligne d'importation supplémentaire et la ligne d'affectation, le composant se comporte comme prévu et reçoit tous ses accessoires normalement, avec l'ajout de tous les accessoires d'itinéraire. Ainsi, je peux joyeusement rediriger à partir des méthodes de cycle de vie des composants avec this.props.history.push (), vérifier l'emplacement, etc.
J'espère que cela t'aides!
la source
Pour react router 2.x.
et dans vos itinéraires ...
assurez - vous que le 3ème est un objet param comme:
{ checked: false }
.la source
Le problème avec le React Router est qu'il rend vos composants et vous empêche donc de passer des accessoires. Le routeur de navigation , d'autre part, vous permet de rendre vos propres composants. Cela signifie que vous n'avez pas à sauter à travers des cerceaux pour passer dans les accessoires comme le code suivant et le spectacle JsFiddle qui l' accompagne .
la source
Utilisez le composant avec ou sans routeur basé sur la réponse de Rajesh Naroth.
Ou vous pourriez le faire de cette façon:
la source
pour le react-router 2.5.2, la solution est si simple:
la source
L'utilisation d'un composant d'itinéraire personnalisé est possible dans React Router v3.
Quant au
<MyRoute>
code du composant, il devrait ressembler à:Pour plus de détails sur l'approche du composant d'itinéraire personnalisé, consultez mon article de blog sur le sujet: http://marmelab.com/blog/2016/09/20/custom-react-router-component.html
la source
c'est probablement la meilleure façon d'utiliser react-router-dom avec un gestionnaire de cookies
dans index.js
et utilisez un cookie
la source
la source
Utilisez la solution comme ci-dessous et cela fonctionne dans la version 3.2.5.
ou
la source