консоль.запишите массив значений отмеченных флажков в React

#javascript #arrays #reactjs #checkbox

#javascript #массивы #reactjs #флажок

Вопрос:

Я хочу консоль.запишите массив установленных флажков. Например, если установлены флажки 1, 2 и 5, я хочу, чтобы они отображались в консоли в виде массива значений каждого флажка. Я могу получить последнее выбранное значение для отображения в консоли, но я не могу получить массив всех установленных флажков для отображения. Они просто отображаются отдельно.

 import { CheckboxData } from "../../../Data/SurveyData";

class CheckboxForm extends Component {
  constructor(props) {
    super(props);
    this.state = { value: [] };
    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChange(event) {
    this.setState({ value: event.target.value });
    console.log("Checkbox: ", event.target.value);
  }

  handleSubmit(event) {
    event.preventDefault();
  }

  render() {
    return (
      <div
        id="checkboxContainer"
        className="container"
        onSubmit={this.handleSubmit}
      >
        {CheckboxData.map((data, key) => {
          return (
            <div key={key}>
              <h5>{data.question}</h5>
              <div className="form-check">
                <input
                  className="form-check-input "
                  required={data.required}
                  name={data.name}
                  type={data.type}
                  value={data.options[0].value}
                  id={`${data.options[0].name}-${key}`}
                  onChange={this.handleChange}
                />
                <label
                  className="form-check-label "
                  htmlFor={`${data.name}-${key}`}
                >
                  {data.options[0].label}
                </label>
              </div>
              <div className="form-check">
                <input
                  className="form-check-input "
                  required={data.required}
                  name={data.name}
                  type={data.type}
                  value={data.options[1].value}
                  id={`${data.options[1].name}-${key}`}
                  onChange={this.handleChange}
                />
                <label
                  className="form-check-label "
                  htmlFor={`${data.name}-${key}`}
                >
                  {data.options[1].label}
                </label>
              </div>
              <div className="form-check">
                <input
                  className="form-check-input "
                  required={data.required}
                  name={data.name}
                  type={data.type}
                  value={data.options[2].value}
                  id={`${data.options[2].name}-${key}`}
                  onChange={this.handleChange}
                />
                <label
                  className="form-check-label "
                  htmlFor={`${data.name}-${key}`}
                >
                  {data.options[2].label}
                </label>
              </div>
              <div className="form-check">
                <input
                  className="form-check-input "
                  required={data.required}
                  name={data.name}
                  type={data.type}
                  value={data.options[3].value}
                  id={`${data.options[3].name}-${key}`}
                  onChange={this.handleChange}
                />
                <label
                  className="form-check-label "
                  htmlFor={`${data.name}-${key}`}
                >
                  {data.options[3].label}
                </label>
              </div>
              <div className="form-check">
                <input
                  className="form-check-input "
                  required={data.required}
                  name={data.name}
                  type={data.type}
                  value={data.options[4].value}
                  id={`${data.options[4].name}-${key}`}
                  onChange={this.handleChange}
                />
                <label
                  className="form-check-label "
                  htmlFor={`${data.name}-${key}`}
                >
                  {data.options[4].label}
                </label>
              </div>
            </div>
          );
        })}
      </div>
    );
  }
}

export default CheckboxForm;
  

Данные находятся в SurveyData.js файл следующим образом:

   {
    page: 2,
    name: "checkbox",
    question: "Check all that apply. I understand:",
    type: "checkbox",
    options: [
      {
        name: "checkbox1",
        value: "I am entering into a new contract.",
        label: "I am entering into a new contract.",
      },
      {
        name: "checkbox2",
        value:
          "I will be responsible for $49.95 each month until my contract is over.",
        label:
          "I will be responsible for $49.95 each month until my contract is over.",
      },
      {
        name: "checkbox3",
        value: "I have three days to cancel.",
        label: "I have three days to cancel.",
      },
      {
        name: "checkbox4",
        value:
          "If I cancel after three days, I will be responsible for the remainder of the contract.",
        label:
          "If I cancel after three days, I will be responsible for the remainder of the contract.",
      },
      {
        name: "checkbox5",
        value:
          "My system is monitored and if it is set off, the cops will come to my home.",
        label:
          "My system is monitored and if it is set off, the cops will come to my home.",
      },
    ],
  },
];```
  

Комментарии:

1. Вы присваиваете строки значениям флажков, что странно.

2. Форма checkbox должна содержать состояние всех флажков, а не только одного. Это может быть случай создания компонента CheckBox со своим собственным обработчиком onChange, при этом компонент CheckBoxForm отслеживает массив отмеченных полей с помощью обработчика, передаваемого через props.

3. @MattDale Я довольно новичок в react и не совсем понимаю, что вы имеете в виду. Не могли бы вы объяснить, пожалуйста?

4. @Cehhiro У меня были числа для значений, но моя цель — сохранить данные и иметь возможность их вызывать, и я не мог сказать, что я сохранял, когда это были числа.

5. @Heather Возможно, вам сначала потребуется получить четкое представление о состояниях, реквизитах и компонентах, прежде чем создавать что-то более сложное. В противном случае вы можете излишне затрудняться с чем-то простым, как только разберетесь с этими концепциями.

Ответ №1:

Вы можете изменить свою функцию handleChange, чтобы обновить массив ( this.state.value ), а не просто записывать введенное пользователем значение. Затем при обратном вызове для this.setState вы можете записать все значения в массиве.

Приведенный ниже код проверит, существует ли значение уже в вашем массиве; если оно существует, оно удаляется, в противном случае значение добавляется в массив

   handleChange(event) {
    const input = event.target.value;
    this.setState(
      {
        value: this.state.value.includes(input)
          ? this.state.value.filter((item) => item !== input)
          : [...this.state.value, input]
      },
      () => {
        console.log(this.state.value);
      }
    );
  }
  

Что-то еще, что могло бы упростить задачу, это проверить react-hook-form или, возможно, Formik (который, как я думал, был намного сложнее в освоении, чем hook form). Однако эти библиотеки будут управлять всем этим состоянием формы за вас, так что вам не нужно беспокоиться об этом.