Как установить / снять все флажки в react js?

#javascript #reactjs

#javascript #reactjs

Вопрос:

Я хочу выбрать / отменить все значения флажков в react js. Я выполнил код для выбора одного флажка, но не смог сделать это для всех выбранных.

код —

 data.map((item) => (
    <tr key={item._id}>
        <td>{item.fname}</td>
        <td>{item.age}</td>
        <td>
            <input
                className="item"
                type="checkbox"
                id={item._id}
                name="contactId"
                value={item._id}
                checked={
                    theArray.indexOf(item._id) !== -1
                    ? true
                    : false
            }
            onChange={handleCheckbox}
            />
        </td>
    </tr>
))
  

данные —

 data: [
  {
    _id: '001',
    fname:'A',
    age:'20'
  },
  {
    _id: '002',
    fname:'B',
    age:'21'
  },
  {
    _id: '003',
    fname:'C',
    age:'22'
  },
  {
    _id: '004',
    fname:'D',
    age:'23'
  },
  {
    _id: '005',
    fname:'E',
    age:'24'
  }
]
  

Данные также могут быть большими. Мой код для флажка множественного выбора — <input type="checkbox" onClick={handleAllChecked} value="checkedall" />

код для handleAllChecked —

 const handleAllChecked=(e) =>{
console.log("a");
}
  

Я не могу понять, как снять флажок «Все» внутри таблицы. Как установить флажок выбрать / снять все? Кто-нибудь может мне помочь?

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

1. Одной из возможностей является создание специального флажка для выбора / отмены выбора всех. Вы можете удерживать состояние флажков в useState hook.

2. @Morty Можете ли вы дать мне представление о том, как это реализовать?

Ответ №1:

Вы могли бы начать с добавления состояния флажка к данным, чтобы это выглядело так:

 {
    _id: '001',
    fname:'A',
    age:'20',
    checked: false,
  },
  

Делая это:

 data.map(element => ({ ...element, checked: false }));
  

Затем в вашем jsx:

 data.map((item) => (
    <tr key={item._id}>
        <td>{item.fname}</td>
        <td>{item.age}</td>
        <td>
            <input
                className="item"
                type="checkbox"
                id={item._id}
                name="contactId"
                value={item._id}
                checked={item.checked}
                onChange={handleCheckbox}
            />
        </td>
    </tr>
))
  

Вероятно, вам нужно преобразовать ваш объект данных в состояние вашего компонента. Предполагая, что вы используете перехваты, ваш обработчик будет выглядеть следующим образом:

 const handleAllChecked=(e) => {
   setData(data.map(element => element.checked = !element.checked));
}
  

Итак, ваш объект данных будет выглядеть следующим образом:

 const [data, setData] = useState(initialData);
  

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

1. Как уже упоминалось, вам также нужна кнопка для запуска handleAllChecked где-нибудь.

Ответ №2:

Вы хотите, чтобы каждый флажок проверялся один за другим, а также с помощью кнопки «Проверить все» справа? 1: Если нет, должно быть достаточно ввести флаг в состояние, чтобы установить / снять все флажки. 2: Если это так, вам нужно будет обработать состояния всех флажков в состоянии компонента. Если вы не хотите хранить все свои данные в состоянии, как описывали ребята до меня, вы все равно можете создать массив только с идентификатором (или некоторыми уникальными идентификаторами) каждого выбранного флажка и в JSX проверить, присутствует ли идентификатор текущего отображаемого флажка в этом массиве установленных флажков или в спискемассив непроверенных флажков.

Код для 1-го варианта:

 const [checkAll, setCheckAll] = useState(false); //false is the default, set to true if you want to be all checked by default

data.map((item) => (
    <tr key={item._id}>
        <td>{item.fname}</td>
        <td>{item.age}</td>
        <td>
            <input
                className="item"
                type="checkbox"
                id={item._id}
                name="contactId"
                value={item._id}
                checked={!checkAll ? 
                    theArray.indexOf(item._id) !== -1
                    ? true
                    : false
                    : true
            }
            onChange={handleCheckbox}
            />
        </td>
    </tr>
));