【问题标题】:Dynamically render checkboxes and handle change events: React+Typescript动态渲染复选框并处理更改事件:React+Typescript
【发布时间】:2019-06-27 12:27:31
【问题描述】:

我正在创建基于对象数组的动态复选框,但我无法为其设置更改处理程序。我正在使用语义-ui-react 复选框。如何处理相应更改复选框的更改事件。

还有一个提交按钮,我需要获取已检查的项目。有人也可以帮我解决这个问题

我们将不胜感激

复选框渲染代码


    let arr = [  {key: "Pending", text: "Pending", checked: false}
         {key: "Approved", text: "Approved", checked: false}
         {key: "Cancelled", text: "Cancelled", checked: false}
    ];

    this.state ={ optionsArr: [] }

    {this.state.arr.map((item: any, i: number) => (
                      <div className="menu-item" key={i}>
                        <Checkbox
                          name={item.text}
                          onChange={this.handleItemClick}
                          checked={item.checked}
                          label={item.text}
                        />
                      </div>
      ))}

更改处理程序

     handleItemClick = (event: React.FormEvent<HTMLInputElement>, data: any) => {
        const i = this.state.optionsArr.findIndex(
          (item: any) => item.text === data.name
        );
        const optionsArr = this.state.optionsArr.map((prevState: any, si: any) =>
          si === i ? !prevState : prevState
        );
        this.setState({ optionsArr });
      };

【问题讨论】:

  • 可以添加整个文件吗?
  • 第一次遍历 optionsArr 时,您在每个项目上使用 item.text。第二次循环时,如果si === i 尝试返回!item。我不确定这是否有意义,认为您想返回{text: prevState.text, checked: !prevState.checked}

标签: javascript reactjs typescript ecmascript-6 semantic-ui-react


【解决方案1】:

认为您在尝试更新选项数组的状态时返回了错误的内容。

prevState 是一个对象,就像{key: 'string', text: 'string', checked: boolean},所以!prevState 没有意义。 试试:

     handleItemClick = (event: React.FormEvent<HTMLInputElement>, data: any) => {
        const i = this.state.optionsArr.findIndex(
          (item: any) => item.text === data.name
        );
        const optionsArr = this.state.optionsArr.map((prevState: any, si: any) =>
          si === i ? {...prevState, checked: !prevstate.checked} : prevState
        );
        this.setState({ optionsArr });
      };

您可以使用过滤器获取选中的项目:


this.state.optionsArr.filter((item: any) => item.checked)

【讨论】:

  • 使用过滤器。更新了我的答案
  • 将原始状态也存储在状态对象中。然后你可以拨打this.setState({optionsArr: this.state.original})
  • 这将使我所有的检查都未选中,因为我在开始时将其设置为 false。我想要以前的状态
  • 你试过什么?我相信你可以想出一些东西来存储以前的状态......
猜你喜欢
  • 2018-12-31
  • 2022-01-26
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 2022-07-04
  • 2017-03-31
  • 2021-12-19
  • 1970-01-01
相关资源
最近更新 更多