#reactjs #react-hooks #use-state
Вопрос:
В форме, имеющей несколько флажков, я хочу сохранить значения флажка в массиве useState после нажатия кнопки отправить. Также пользователь может несколько раз установить/снять флажок перед отправкой формы. Каким может быть подход/код?
Комментарии:
1. Что вы пробовали до сих пор? Это похоже на стандартный подход к реактивным формам.
2. я попытался сохранить значения флажка в отдельной переменной useState,инициализированной 0, затем проверил, если значение checkbox1>0, затем установите флажок(старый=>>{…старый,значение checkbox1}), аналогично проверенный для других флажков.
Ответ №1:
У каждого флажка есть свойство «проверено», поэтому в состоянии у вас должен быть массив со всеми отмеченными флажками.
const [selectedCheckboxes, setSelectedCheckboxes] = useState([]);
Например, вы можете также хранить флажки в массиве:
const checkboxes = [{name: 'cb1', label:'cb1'}, {name: 'cb2', label:'cb3'}, ...];
и все они должны иметь один и тот же метод обмена:
onCheckBoxChange = (event) => {
const selectedCheckboxes = [...selectedCheckboxes];
const isChecked = selectedCheckboxes.includes(event.target.name);
if (!isChecked) {
selectedCheckboxes.push(event.target.name);
} else {
selectedCheckboxes.splice(selectedCheckboxes.indexOf(event.target.name), 1);
}
setSelectedCheckboxes(selectedCheckboxes);
};
обычная функция, которая проверяет, установлен ли флажок:
isChecked = (cb) => selectedCheckboxes.includes(cb.name);
и каждый флажок должен выглядеть так:
<CheckBox
name={cb.name}
checked={isChecked(cb)}
onChange={onCheckBoxChange}
{...props}
/>
Ответ №2:
Вы можете сделать это несколькими способами. Вы можете просто const checkboxOpenArray = []
указать, где вы будете просто хранить логические значения, как [true, false, false, true]
это будет сделано позже в коде, где вы, вероятно .map
, через все флажки, вы просто проверяете, checkboxOpenArray[idx]
откуда idx
вы пришли .map
. Если это правда, вы просто установите флажок в значение true. То же самое для onChange
— вы просто находите idx
в checkboxOpenArray
и устанавливаете его в значение false или true.