I try to trigger an onClick event in a map function, and I get this error :
TypeError: Cannot read property ‘handleClick’ of undefined
How do we trigger an onClick event in a map function ?
Here is my code :
class Component extends React.Component { constructor(props) { super(props); this.state = { isToggleOn: true, }; this.handleClick = this.handleClick.bind(this); } handleClick() { this.setState((prevState) => ({ isToggleOn: !prevState.isToggleOn, })); } render() { if (this.props.data) { var recipes = this.props.data.map(function (recipe, i) { return ( <div key={i} className="col-8 offset-col-1 f-l relative m-t-10" > <div className="col-6 f-l"> <p className="col-8 f-l">{recipe.title}</p> <button className="f-l" onClick={this.handleClick}> Voir la recette </button> </div> </div> ); }); } return ( <div className="RecipeList"> <div className="col-12"> {recipes} <div className="both"></div> </div> </div> ); } }
Advertisement
Answer
Use an arrow function as the function given to map
instead and this
will be what you expect:
if (this.props.data) { var recipes = this.props.data.map((recipe, i) => { return <div key={i} className="col-8 offset-col-1 f-l relative m-t-10"> <div className="col-6 f-l"> <p className="col-8 f-l">{recipe.title}</p> <button className="f-l" onClick={this.handleClick}>Voir la recette</button> </div> </div>; }); }
Why this is the case is explained in detail here. Arrow functions don’t provide their own this
binding, but instead retains the this
value of the enclosing lexical context.