J'essaie de mettre à jour les propriétés d'un état de composants parents à partir d'un composant enfant. J'écris un petit POC qui enverra une demande pour obtenir des données, mettra à jour les propriétés Parent Enfant state
des parents à chaque fois que j'envoie la demande et qu'un autre composant enfant rendra le state code des parents > propriétés dans un graphe (en utilisant CanvasJS). Quoi qu'il en soit, j'ai suivi quelques tutoriels et ils semblent montrer la même chose. Mais quand je l'implémente, j'obtiens l'erreur
Unhandled Rejection (TypeError): this.props.callbackFunction n'est pas une erreur de fonction
. Voici mon code: Unhandled Rejection (TypeError): this.props.callbackFunction is not a function
(anonymous function)
src/components/h2Request.jsx:10
7 | axios.get("http://localhost:8003").then(response => {
> 8 | this.props.callbackFunction(response.data);
9 | ^ });
10 | };
import React, { Component } from "react";
import axios from "axios";
import "../App.css";
class MyRequest extends Component {
handleClick = () => {
axios.get("http://localhost:8003").then(response => {
this.props.callbackFunction(response.data);
});
};
render() {
return (
<div className="button_container">
<button className="button" onClick={() => this.handleClick()}>
Refresh
</button>
<h1>
Items:
{JSON.stringify(this.props.dataFromParent, null, 2)}
</h1>
</div>
);
}
}
export default MyRequest;
3 Réponses :
Dans votre AllComponent, vous avez défini la fonction mais pas inclus dans les accessoires du composant enfant
import React, { Component } from "react"; import H2Request from "./myRequest"; class AllComponents extends Component { state = { items: this.props.value }; callbackFunction = childData => { this.setState({ items: childData }); }; render() { return ( <div> <MyRequest dataFromParent={this.state.items} callbackFunction={()=>this.callbackFunction()} /> // add callback as props in here </div> ); } } export default AllComponents;
Changez votre composant parent en, (ajoutez callbackFunction comme accessoires, afin qu'il soit accessible dans le composant enfant comme this.props.callbackFunction()
)
import React, { Component } from "react"; import H2Request from "./myRequest"; class AllComponents extends Component { state = { items: this.props.value }; callbackFunction = childData => { this.setState({ items: childData }); }; render() { return ( <div> <MyRequest dataFromParent={this.state.items} /> // see no callBackFunction in props </div> ); } } export default AllComponents;
Le problème est simple, vous n'avez pas transmis l'accessoire à l'enfant.
<MyRequest dataFromParent={this.state.items} callbackFunction={this.callbackFunction} />
Ainsi, dans l'enfant, il pourra appeler this.props.callbackFunction
Vous devez fournir une valeur pour la prop callbak de votre Requestcomponent comme ceci
<MyRequest dataFromParent={this.state.items} callbackFunction={this.callbackFunction.bind()} />
Voici un codesandbox
callbackFunction n'est pas disponible dans le composant enfant car vous ne le passez pas à l'intérieur du composant enfant. Vous devez le transmettre comme accessoire et l'appeler dans le gestionnaire onClick.
Vous ne le passez pas comme accessoire, vérifiez la réponse :)
Génial, merci à tous. Je suis encore assez nouveau sur React (en fait, le développement frontal en général), mais cela semble assez évident maintenant.