donc in react, j'ai un composant App qui rend plusieurs composants enfants comme celui-ci:
App
componentDidMount() { const {match: { params }} = this.props; //I used a code snippet from this video https://scotch.io/courses/using-react-router-4/route-params //fetch data from API axios .get(`http://localhost:5000/api/courses/${params.id}`) .then(results => { //results param came back as data from api this.setState({ //set state by setting the courses array to hold the data that came from results course: results.data, user: results.data.user }); //console.log(results); //By console logging I was able to see that I am getting each individual course's info in the data object }); } //this method will be for deleting a course handleDelete() { const { match: { params }, history } = this.props; axios.delete(`http://localhost:5000/api/courses/${params.id}`, { auth: { username: this.props.email, password: this.props.pass } }).then(() => { history.push("/"); //I used the history object and have it push to the homepage, that way every time I delete a course I am redirected to (/) afterwards }); }
Dans ce composant I avoir des paramètres pour que je puisse voir un cours par son identifiant:
CourseDetail
render() { return ( //JSX inside <BrowserRouter> <div> <Header /> <Switch> <Route exact path="/" component={Courses} /> <Route exact path="/courses/create" component={() => <CreateCourse email={this.state.emailAddress} pass={this.state.password} />} /> <Route exact path="/courses/:id/update" component={() => <UpdateCourse email={this.state.emailAddress} pass={this.state.password} />} /> <Route exact path="/courses/:id" component={() => <CourseDetail email={this.state.emailAddress} pass={this.state.password} />} /> <Route exact path="/signin" component={ () => <UserSignIn signIn={this.signIn}/>} /> {/*pass in the signIn() in a prop called signIn to the UserSignIn component*/} <Route exact path="/signup" component={UserSignUp} /> {/* <Route exact path="/signout" component={UserSignOut} /> */} </Switch> </div> </BrowserRouter> ); }
l'erreur que j'obtiens lorsque j'essaye d'accéder au composant CourseDetail qui utilise des paramètres est:
Quelqu'un peut-il vous aider?
3 Réponses :
Vous devez transmettre des accessoires comme celui-ci lire ici
(this.props.match).params | |__________ This is undefined you end up `undefined.params`
Les accessoires passés au composant courseDetails n'ont pas de nom d'accessoire match
et dans votre componentDidMount vous faites cela p >
"use strict"; var a = { a: { b: 1 } }; var b = a.x.b;
Ici, la correspondance sera indéfinie afin que vous puissiez accéder à params
Vous pouvez comprendre par cet exemple
let a = {a:{b:1}} let {x:{b,}} = a
Le code ci-dessus est le même que ci-dessous
const {match: { params }} = this.props;
Donc finalement ici si pendant la déstructuration si vous n'avez pas de correspondance comme paramètres auxquels vous essayez d'accéder
component={props => <CourseDetail {...props} email={this.state.emailAddress} pass={this.state.password} />} />
Lorsque vous écrivez ceci
const {match: {params}} = this.props;
Cela signifie que vous vous attendez à ce que les accessoires aient un attribut match comme ci-dessous :
const params = props;
C'est pourquoi vous obtenez l'erreur spécifiée.
Si vous voulez attribuer une variable, les accessoires utilisent ceci
params = this.props.match.params;
Remarque: [Si vous entourez une variable d'un crochet const {match} = props; cela signifie que vous vous attendez à une correspondance clé dans les accessoires.
p>
La correspondance n'est pas définie, car vous ne l'avez pas transmise au composant en tant qu'accessoires.
Pour ce faire
<Route exact path="/courses/:id/update" component={(routeProps) => <UpdateCourse email={this.state.emailAddress} pass={this.state.password} Match = {this.routeProps.Match} Location = {this.routeProps.Location}/>} History = {this.routeProps.History />
, vous pouvez ensuite obtenir votre propriété Match via routeProps.
const {match} = this.routeProps;
Ou utilisez simplement la notation de répartition des propriétés qui répartira les propriétés dans routeProps en tant que propriétés discrètes dans votre composant.
Exemple,
<Route exact path="/courses/:id/update" component={(routeProps) => <UpdateCourse email={this.state.emailAddress} pass={this.state.password} {...routeProps} />} />
Cela équivaut à écrire-
<Route exact path="/courses/:id/update" component={(routeProps) => <UpdateCourse email={this.state.emailAddress} pass={this.state.password} routeProps = {routeProps} />} />