Как установить обработчик для нескольких флажков в реакции? - PullRequest
0 голосов
/ 10 марта 2020

Я создал несколько флажков в моем небольшом проекте. Я столкнулся с проблемой при получении информации о флажке при установке флажка. если я поставлю галочку на игрушках, тогда значение должно быть 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"

Может кто-нибудь помочь мне в этом вопросе?

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

Вам нужен массив для хранения всех проверенных состояний.

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>
0 голосов
/ 10 марта 2020

Уверен, вы можете использовать именованные свойства ES6 и функции стрелок для создания чистого потока

Рассмотреть состояние:

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

Добавить свойство Name. Эти имена должны идеально совпадать с именами в состоянии.

<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]}
}

Ссылки:

Реактивно-контролируемые формы: https://reactjs.org/docs/forms.html

Semanti c Флажки пользовательского интерфейса: https://react.semantic-ui.com/modules/checkbox/#usage -remote-control

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...