reactjs - 无法将简化函数传递给 onClick 事件处理程序 ReactJs
问题描述
在我的 React 应用程序中,我有两个组件,主组件和菜单组件。Main Component 是 Menu 的父组件。Menu 显示一个项目列表,单击其中一个项目时,它会借助我作为道具传递给 Menu 的函数更新 Main 的状态。下面是代码以便更好地理解:
class Main extends React.Component {
constructor(props) {
super(props);
this.state = {
dishes: dishes,
selectedDish: null
};
this.selectDish=this.selectDish.bind(this);
}
selectDish(dishId){
this.setState({ selectedDish: dishId});
}
render() {
return (
<div className="App">
<Menu dishes={this.state.dishes} onClick={this.selectDish} />
</div>
);
}
}
export default Main;
下面是菜单组件:
class Menu extends Component {
constructor(props){
super(props);
this.selectdish=this.selectdish.bind(this);
}
selectdish(dishId){
return this.props.onClick(dishId);
}
render() {
const menu = this.props.dishes.map((dish) => {
return (
<div className="col-12 col-md-5 m-1">
<Card key={dish.id}
onClick={this.selectdish(dish.id)}>
</Card>
</div>
);
});
}
}
export default Menu;
我省略了代码中一些不相关的部分。所以工作流程应该是,当我们点击菜单呈现的菜品之一时,菜品的 id 应该传回 Main 并更新状态变量 ``selectedDish```,如方法中所示selectDish
。
但是在浏览器控制台中,我得到了错误Cannot update during existing state transition
。奇怪的是,如果我不传递任何菜 id 并将其设置selectedDish
为固定值(如 1),一切正常。
请帮我确定我的事件处理程序是否有任何问题,因为这是唯一似乎包含错误的部分。
谢谢你!
解决方案
您没有将onClick
Card 的 传递给函数,但您已经在使用 调用该函数this.selectdish(dish.id)
。这将在渲染时启动流程,而不是在点击时启动。
你在这里有三个选择。
您可以将其包装在这样的附加函数中:onClick={() => {this.selectdish(dish.id)}}>
. 这样,您将一个函数传递给 onClick,这是必需的,而不是执行它。
或者你让selectdish
返回一个这样的函数:
selectdish(dishId){
return () => {this.props.onClick(dishId)};
}
或者您向卡片添加名称并从点击事件中访问元素的名称:
class Menu extends Component {
constructor(props){
super(props);
this.selectdish=this.selectdish.bind(this);
}
selectdish(event){
return this.props.onClick(event.target.name);
}
render() {
const menu = this.props.dishes.map((dish) => {
return (
<div className="col-12 col-md-5 m-1">
<Card key={dish.id}
name={dish.id}
onClick={this.selectdish}> // this is now the function without calling it
</Card>
</div>
);
});
}
}
export default Menu;
推荐阅读
- javascript - 使用模板时可以推迟对脚本的解析吗?
- python - 如何在python中通过第n个破折号拆分和解析字符串
- r - recluster.cons 函数和彩色树状图
- javascript - 如何使用 RxJS 以适当的格式返回 observable 以及额外的单独分页数据
- c# - 更好的图像信息获取?
- java - 检查字符串一是否在java中包含字符串二
- github - 如果对 github 操作有条件,是否可以进行模式匹配?
- oracle - Artifactory Derby DB 迁移到 Oracle
- excel - 将特定单元格填充到同一工作簿中另一个工作表的最后一行
- javascript - 添加两个数组,其中两个数组的现有成员和重复成员替换重复的成员