【问题标题】:Dynamically create checkboxes and add change handlers for the same : Semantic-ui-react + React动态创建复选框并为其添加更改处理程序:Semantic-ui-react + React
【发布时间】:2019-06-25 11:34:34
【问题描述】:

我正在尝试使用语义 UI 反应创建动态复选框我有以下结构的对象。我希望复选框值应应用于此数组中的特定对象。我无法使用下面提供的更改处理程序来做到这一点。有人可以帮我解决这个问题吗?

沙盒:https://codesandbox.io/s/suspicious-pine-r5dpi

import { Checkbox } from "semantic-ui-react";

checkboxArray = [
                  {name: "firstName", value: "firstName", show: true, displayValue: " First Name"},
                  {name: "status", value: "status", show: true, displayValue: " Status "},
                  {name: "visits", value: "visits", show: true, displayValue: " Visits "}
];

Checkbox Change Handler
--------------------------
 handleItemClick = (e,data) => {
    console.log(data.checked);
    this.setState({ [data.name]: data.checked });
  };

Inside Render
----------------
{this.state.optionsArr.map((item, i) => (
            <div key={i}>
              <Checkbox
                name={item.name}
                onChange={this.handleItemClick}
                checked={item.show}
                label={item.displayValue}
              />
            </div>
))}




【问题讨论】:

  • 您能展示一下您所在州的情况吗?
  • @Claeusdev 我在问题中给出的状态对象。它与 checkboxArray 相同。我可以带上复选框,但复选框上的操作不起作用。我希望根据该对象的复选框更改来更新显示属性
  • @Claeusdev 更新了问题,并提供了代码框的链接
  • 我没有看到代码框有任何问题。还是已经解决了?
  • @Claeusdev 是的,沙箱工作正常。在 application 中, event.target.checked 未定义。 event.target 以 的形式出现。所以它没有设置。知道为什么吗? object.show = event.target.checked 值未定义,在沙盒中为真/假

标签: reactjs semantic-ui-react


【解决方案1】:

semantic-ui-react 接受onChange(event, data: object) 的函数。 event 是 React 的默认合成事件,data 携带道具上的所有内容。我认为您的 checkeddata 对象上。试试data.checked 而不是event.target.checked

handleItemClick = (event, data, i) => {
    const { optionsArray } = this.state;
    optionsArray[i].show = !optionsArray[i].show;
    this.setState(() => {
      return optionsArray;
    });
  };

  render() {
    console.log(this.state.optionsArray);
    return (
      <div>
        {this.state.optionsArray.map((item, i) => (
          <div key={i}>
            <Form.Checkbox
              name={item.name}
              onChange={(e, v) => this.handleItemClick(e, v, i)}
              value={item.show}
              defaultChecked={item.show}
              label={item.displayValue}
            />
          </div>
        ))}
      </div>
    );
  }

我在codesandbox上编辑了你的代码

【讨论】:

【解决方案2】:

通过查看沙箱中的代码,尝试将您的 handleItemClick 处理程序更改为:

handleItemClick = name => event => {
    let object,
      newOptionsArray = [...this.state.optionsArray];

    for (var i = 0; i < newOptionsArray.length; i++) {
      if (newOptionsArray[i].name === name) {
        object = newOptionsArray[i];
      }
    }

    object.show = event.target.checked;

    this.setState({
      ...this.state.optionsArray,
      object
    });
  };

并尝试更改您在 onChange 事件中调用处理程序的方式,如下所示:

onChange={this.handleItemClick(item.name)}

【讨论】:

  • 不,不是。我也应用了你的更改,没有运气
  • @vrosario 更新了答案。
  • @vrosario 请检查the sandbox。我没有看到你提到的问题:)
  • @vrosario 好吧,我认为您需要使用有关您在应用程序中所做的不同操作的相关信息来更新您的问题。
  • 检查这个沙箱,相同的代码codesandbox.io/s/awesome-robinson-w4mth。它显示了问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多