开发者问题收集

如何检查动态渲染的复选框

2019-07-02
246

我正在动态渲染一些复选框,但目前我只能选中第一个复选框,而所有其他复选框都操作第一个复选框。如何让这些复选框彼此独立工作?

这是 React 中的 typescript。我尝试更改我在函数中引用的接口,以为我引用了错误的东西,但这些都不起作用。

这是函数:

handleCheckboxClick = (entitlement: IApiEntitlements, checked: boolean): void => {
    if (checked === true) {
        this.selectedEntitlementIDs.push(entitlement.id);
    } else {
        const index: number = this.selectedEntitlementIDs.indexOf(entitlement.id);
        this.selectedEntitlementIDs.splice(index, 1);
    }
    //tslint:disable-next-line:prefer-const
    let entitlementChecked: IEntitlementChecked = this.state.entitlementChecked;
    entitlementChecked[entitlement.id] = checked;
    let selectAll: boolean = false;
    if (this.selectedEntitlementIDs.length === this.state.responses.apiResponses.apiClients.length) {
        selectAll = true;
    }
    this.setState({
        entitlementChecked: entitlementChecked,
        selectAll: selectAll
    });
    console.log(this.selectedEntitlementIDs, 'hi');
    console.log(entitlementChecked, 'hello');
}

这是它被调用的地方:

return (
   <Checkbox
     checked={this.state.entitlementChecked[entitlement.id]}
     data-ci-key={entitlement.id}
     id='api-checkbox'
     key={entitlement.id}
     labelText={entitlement.label}
     onChange={this.handleCheckboxClick}>
   </Checkbox>
);

我希望每个复选框都能被选中,但目前第一个复选框有效,所有其他复选框都选中或取消选中第一个复选框。

1个回答

您不应将数组作为跟踪所选项目的类的属性,这与 React 生命周期无关,并且可能无法在需要时更新视图。相反,您应该只使用您已经拥有的地图 ( entitlementChecked ) 来确定是否选中了某些内容。

handleCheckboxClick(id) {
  this.setState(prevState => ({
    entitlementChecked: {
      ...prevState.entitlementChecked,
      [id]: !prevState.entitlementChecked[id]
    }
  }));
}

调用处理程序方法时,您只需传递您特别需要的 id 即可。

onChange={this.handleCheckboxClick.bind(null, item.id)}

这里有一个包含更多细节的基本示例 :)

John Ruddell
2019-07-02