javascript - 'onChange' 事件在反应中只被调用一次
问题描述
我正在使用材料-ui
我的反应组件在这里:
import Checkbox from '@material-ui/core/Checkbox';
import FormControlLabel from '@material-ui/core/FormControlLabel';
import React from "react";
import { withStyles } from "@material-ui/core/styles";
const styles = (theme) => ({
});
class SomeComponent extends React.Component {
static propTypes = {
};
state = {
checked: true,
}
handleChange = name => event => {
event.persist()
this.setState({
[name]: event.target.checked
}, () => {
if (event.target.checked) {
this.props.parentMethod1(event.target.value)
} else {
this.props.parentMethod2(event.target.value)
}
});
};
render() {
const { user } = this.props;
return (
<div>
<FormControlLabel
control={
<Checkbox
checked={this.state.checked}
onChange={this.handleChange('checked')}
value={user.id}
color="primary"
/>
}
label={user.first_name}
/>
</div>
);
}
}
export default withStyles(styles)(SomeComponent);
问题是,我只能选择/取消选择复选框一次。选择/取消选择复选框后,不会发生 onChange 事件。
你能帮我如何让 Checkbox 像现在这样工作吗?谢谢。
这是重现的错误:
解决方案
OP 的原始代码沙盒: https ://codesandbox.io/s/y041zknrqv
如果上面的代码框正确地展示了您的实际问题,那么您的问题是您搞砸了event.stopPropagation
并且event.preventDefault
在Parent1
andParent2
中,您为onClick
div 容器提供事件处理程序并在两个处理程序上实现event.preventDefault
and event.stopPropagation
。因此,当您第一次单击复选框时会发生以下情况:
- Checkbox 接收点击事件并更新状态,导致checked = true。
- 事件冒泡至
Parent2
. 这里onClick
触发handleClick
该组件的功能。 - in
handleClick
,event.preventDefault
停止浏览器对该事件的默认操作,意味着未来的点击事件不会触发复选框,同时event.stopPropagation
阻止父组件触发onClick
,意味着永远Parent1
不会立即收到任何点击事件。
而现在,从第二次点击事件开始,只能Parent2
接收和响应。它的孩子和它的父母将不再处理任何事情。你可以在这里看到控制台登录:https ://codesandbox.io/s/r75rp285xq
因此,要解决您的问题,请event.preventDefault
从Parent2
's中删除handleClick
。如果您还想纠正 的行为Parent1
,请event.preventDefault
从两个组件中删除并event.stopPropagation
从Parent2
推荐阅读
- azure-data-factory - 复制文件(使用通配符)并为文件名添加时间戳
- c# - 避免与固定位置的给定文本匹配
- spring-boot - 多个 TCP 客户端配置
- reactjs - 如何对阿波罗链接进行单元测试
- discord - 使用 Bot 检查用户在 Discord 中使用的设备 - Discord.JS
- mysql - 基于 MySQL 集合 vs 程序化
- json - 在不知道属性位置的情况下查询给定属性的 JSON
- javascript - 在什么情况下不会到达 finally 块?
- powershell - 比较单个 PowerShell 数组中的对象
- firebase - 何时必须在 firestore 触发函数中执行 firestore 读取和写入操作或在 api 端点中直接调用 firestore 之间进行选择