javascript - 有条件地禁用 React 复选框
问题描述
我正在尝试根据计数有条件地禁用反应中的复选框。通过 props 传递值是否被勾选且大于数字。我将名称保存在状态中以进一步处理它以发送到后端数据库。这是我的反应代码。
class CheckboxComponent extends Component {
constructor(props) {
super(props);
this.state = {
checkedItems: {}
};
}
handleChange = (event, formKey) => {
const {checkedItems} = this.state;
const checkedValues = {...checkedItems};
checkedValues[event.target.name] = event.target.checked;
this.setState((prevState, currState) => {
return {
...prevState,
checkedItems: checkedValues
}
});
};
render = () => {
const {checkedItems} = this.state;
const checkedValues = {...checkedItems};
const checkedCount = Object.values(checkedValues).length;
const checked = Object.values(checkedValues);
const disabled = checkedCount >= 3;
return (
<div>
{checkboxes.map((item, index) => (
<label className={`form__field__input__label`} key={item.key}>
<Input
type={`checkbox`}
name={item.name}
checked={this.state.checkedItems[item.name] || false}
onChange={this.handleChange}
formKey={'subjects'}
disabled={(!checked[index] && checked.length > 3)}
/>
{item.name}
</label>
))}
</div>
)
这是我传递的数组以呈现复选框中的值
const checkboxes = [
{
name: "Math and economics",
key: "mathsandeconomics",
label: "Math and economics"
},
{
name: "Science",
key: "Science",
label: "Science"
},
解决方案
- 您
checked.length
计算所有触摸的框,而不是仅选中。如果您取消选中输入,它仍然会被计算在内。true
例如,仅计数Object.values(checkedValues).filter(value => value).length
。 - 使用名称而不是索引:
disabled={!checkedValues[item.name] && checkedCount > 3}
你可以在这里看到完整的解决方案:https ://codesandbox.io/s/confident-http-vlm04?file=/src/App.js
推荐阅读
- pyspark-sql - 使用 pyspark 迭代加载多个 parquet 文件
- snowflake-cloud-data-platform - 尝试从命令行执行时,Snow Client 的 SSL 身份验证错误
- android - 在 Marshmallow 6.0.1 上未找到 Android 动态交付资源异常
- javascript - React Hook useEffect 缺少依赖项:'notes',如何解决?
- dart - 是否可以使用类方法来初始化 Dart 中的最终属性?
- java - java openjdk 版本“1.8.0_232”的类路径
- jquery - 如何在jquery中使用变量访问id
- listview - 如何使用 SliverAppbar 创建浮动按钮并在 Flutter 中添加 ListView?
- kubernetes - 跨本地和公共云的混合 K8S
- nas - Synology NAS 磁盘已满,无法连接