【问题标题】:How to set the handler for multiple checkboxes in react?如何在反应中为多个复选框设置处理程序?
【发布时间】:2020-06-22 00:18:54
【问题描述】:

我在我的小项目中创建了多个复选框。我在打勾时检索复选框的信息时遇到问题。如果我在玩具上打勾,那么值应该是toys,或者如果我在toys 和lights 上打勾,我应该在控制台中同时获得玩具和灯光。

代码如下:

import React from "react";
import { render } from "react-dom";
import { Segment, Form, Checkbox, Button } from "semantic-ui-react";
import axios from "axios";
export default class ShowForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      event: ""
    };
  }
  handleCheck = event => {
    console.log("Hello", event);
  };
  render() {
    return (
      <div>
        <Segment>
          <Form>
            <Checkbox label="Cake" onChange={this.handleCheck} />
            <br />
            <Checkbox label="Lights" onChange={this.handleCheck} />
            <br />
            <Checkbox label="Flowers" onChange={this.handleCheck} />
            <br />
            <Checkbox label="Toys" onChange={this.handleCheck} />
            <br />
            <Button onClick={this.handleSubmit}> Submit </Button>
          </Form>
        </Segment>
      </div>
    );
  }
}

这里是完整的代码:“https://codesandbox.io/s/zealous-paper-p9zb5”

谁能帮我解决这个问题?

【问题讨论】:

  • 你的意思是这样的?? codesandbox.io/s/fervent-bohr-59lmw
  • @ManirajMurugan - 是的,但它应该存储在 event 变量中。如果我点击玩具和灯,那么它应该显示事件:“玩具,灯”
  • 你的意思是你需要将它存储在一个检查项目数组中吗?还有你这里的events 是什么意思??
  • @ManirajMurugan - 是的,我想将它存储在检查项目的数组中。 Event 是一个字符串,我们需要在其中存储选中的项目

标签: javascript html reactjs checkbox


【解决方案1】:

你需要一个数组来存储所有的检查状态。

handleCheck = id => () => {                      // Get indentify from each element
  const { checkedList } = this.state;
  const result = checkedList.includes(id)        // Check if checked at this moment
    ? checkedList.filter(x => x !== id)          // If checked, remove
    : [...checkedList, id];                      // If not, add
  this.setState({ checkedList: result }, () => { // setState
    console.log(this.state.checkedList);         // setState is async, log in callback
  });
};

如果您愿意,您可以将Checkbox 组件设为通用组件,这样您就无需在每个位置的三个位置绑定label。

<Checkbox
  label="Cake"
  onChange={this.handleCheck("Cake")}
  checked={checkedList.includes("Cake")}   // If included, checked
/>

另一个最小可重现的演示

在文本中尝试:

const list = [...Array(10).keys()].map(x => ({ id: x }));
const App = () => {
  const [selected, setSelected] = React.useState([]);
  const onChangeHandler = id => () => {
    selected.includes(id)
      ? setSelected(selected.filter(x => x !== id))
      : setSelected([...selected, id]);
  };
  const onRemove = () => {
    setSelected([]);
  };
  return (
    <div className="App">
      {list.map(item => (
        <input
          type="checkbox"
          key={item.id}
          checked={selected.includes(item.id)}
          onChange={onChangeHandler(item.id)}
        />
      ))}
      <br />
      <button onClick={onRemove}>Remove all</button>
      <div>{selected.join(",")}</div>
    </div>
  );
}
ReactDOM.render(<App />, document.getElementById("root"));
<div id="root"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.12.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.12.0/umd/react-dom.production.min.js"></script>

【讨论】:

  • 谢谢!它工作正常。非常感谢您解决了这个问题
【解决方案2】:

很确定,你可以用 ES6 命名属性和箭头函数来创建一个干净的流程

考虑一个状态:

this.state={
   isToy: false,
   isCake: false,
   isFlower: false,
   isLight: false
}

添加名称属性。这些名称应与状态中的名称完美匹配。

<Form>
    <Checkbox name="isCake" label="Cake" checked={this.state.isCake} onChange={this.handleCheck} />
    <Checkbox name="isLight" label="Lights" checked={this.state.isLight} onChange={this.handleCheck} />
    <Checkbox name="isFlower" label="Flowers" checked={this.state.isFlower} onChange={this.handleCheck} />
    <Checkbox name="isToy" label="Toys" checked={this.state.isToy} onChange={this.handleCheck}  />
    <Button onClick={this.handleSubmit}> Submit </Button>
</Form>

然后编写handleCheck箭头函数,使用ES6名称属性特性访问状态属性:

handleCheck = (event) => {
   let name = event.target.name
   this.setState{[name]: !this.state[name]}
}

参考资料:

React 控制表单:https://reactjs.org/docs/forms.html

语义 UI 复选框:https://react.semantic-ui.com/modules/checkbox/#usage-remote-control

【讨论】:

猜你喜欢
  • 2021-12-30
  • 2021-12-19
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 2021-09-13
相关资源
最近更新 更多