【问题标题】:React: ChecBox checked state programmatically not reflecting checkbox state反应:CheckBox以编程方式检查状态不反映复选框状态
【发布时间】:2020-01-09 14:41:14
【问题描述】:

我有一个反应表,在其中我在复选框单击时分别显示和隐藏列。如果我从复选框输入元素中删除 checked 属性,事情会按预期工作。但是,如果我添加它并使用状态跟踪 checked 属性,复选框将在第一次单击时关闭但不会重新打开,但列状态会更新并重新出现。

最终我的最终目标是能够单击此列表顶部的“删除所有列”选项以显示隐藏所有列。显示/隐藏部分有效,但检查框无效。

updateColumnShow = fieldName => {
  this.setState({ [fieldName]: !fieldName });
  this.setState(state => {
    const columns = state.columns.map(column => {
      if (column.Header === fieldName) {
        column.show = !column.show;
        return column;
      } else {
        return column;
      }
    });
    return { columns };
  });
};

render() {
  return (
    <div>
      {this.state.columnList.map(listItem => (
        <li key={listItem}>
          <input
            id={listItem}
            checked={this.state[listItem]}
            className="form-check-input"
            type="checkbox"
            name={listItem}
            onChange={() => this.updateColumnShow(listItem)}
          />
          <label>{listItem}</label>
        </li>
      ))}
    </div>
  );
}

我创建了一个CodeSandbox to demo the issue

我忽略了什么?

【问题讨论】:

    标签: reactjs checkbox input react-table


    【解决方案1】:

    您将字符串 (fieldName) 传递给 updateColumnShow,然后将其作为布尔值取反;这将永远是错误的。

    updateColumnShow = fieldName => {
      this.setState({ [fieldName]: !fieldName });
    }
    

    直接的解决方法是反转您的状态值:

    this.setState({ [fieldName]: !this.state[fieldName] });
    

    【讨论】:

    • 谢谢克里斯!我以为我在实际应用中尝试过,但显然没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2012-04-10
    • 2019-06-23
    • 1970-01-01
    相关资源
    最近更新 更多