J'utilise React Router pour créer une application multi-pages. Mon composant principal est <App/>
Et il rend tout le routage vers les composants enfants. J'essaie de passer accessoires via la route, et sur la base de certains recherche je l'ai fait, la façon la plus courante pour les composants enfants de puiser dans les accessoires transmis est via l'objet this.props.route
dont ils héritent. Cependant, cette l'objet n'est pas défini pour moi. Sur ma fonction render()
dans le composant enfant, je console.log(this.props)
et je retourne un objet qui ressemble à ceci
{match: Object, location: Object, history: Object, staticContext: undefined}
Ne ressemble pas du tout aux accessoires auxquels je m'attendais. Voici mon code en détail.
Composant parent (j'essaie de transmettre le mot "salut" comme accessoire appelé "test" dans tous mes composants enfants):
import { BrowserRouter as Router, HashRouter, Route, Switch } from 'react-router-dom';
import Link from 'react-router';
import React from 'react';
import Home from './Home.jsx';
import Nav from './Nav.jsx';
import Progress from './Progress.jsx';
import Test from './Test.jsx';
export default class App extends React.Component {
constructor() {
super();
this._fetchPuzzle = this._fetchPuzzle.bind(this);
}
render() {
return (
<Router>
<div>
<Nav />
<Switch>
<Route path="/" exact test="hi" component={Home} />
<Route path="/progress" test="hi" component={Progress} />
<Route path="/test" test="hi" component={Test} />
<Route render={() => <p>Page not found!</p>} />
</Switch>
</div>
</Router>
);
}
}
Enfant:
import React from 'react';
const CodeMirror = require('react-codemirror');
import { Link } from 'react-router-dom';
require('codemirror/mode/javascript/javascript')
require('codemirror/mode/xml/xml');
require('codemirror/mode/markdown/markdown');
export default class Home extends React.Component {
constructor(props) {
super(props);
console.log(props)
}
render() {
const options = {
lineNumbers: true,
theme: 'abcdef'
// mode: this.state.mode
};
console.log(this.props)
return (
<div>
<h1>First page bro</h1>
<CodeMirror value='code lol' onChange={()=>'do something'} options={options} />
</div>);
}
}
Je suis assez nouveau pour React donc mes excuses si je manque quelque chose d'évident. Merci!
Vous pouvez passer des props au composant en utilisant le render
prop au Route
et en insérant ainsi la définition de votre composant. Selon le DOCS:
Cela permet un rendu et un habillage en ligne pratiques sans le remontage indésirable expliqué ci-dessus.Au lieu d'avoir un nouvel élément React créé pour vous à l'aide de l'accessoire
component
, vous pouvez passer une fonction à appeler lorsquelocation
correspond. Le prop de rendu reçoit tous les mêmes accessoires de route que le prop de rendu de composant
Vous pouvez donc passer l'hélice à un composant comme
<Route path="/" exact render={(props) => (<Home test="hi" {...props}/>)} />
et vous pouvez y accéder comme
this.props.test
dans votre composant Home
P.S. Assurez-vous également que vous passez
{...props}
pour que les accessoires de routeur par défaut commelocation, history, match etc
sont également transmis au composantHome
sinon le seul accessoire qui lui est transmis esttest
.