P粉5750559742023-09-03 21:41:47
This may solve your problem.
const [checkedItems, setCheckedItems] = useState([]); const handleChange = (e) => { setCheckedItems( prev => [...prev, e.target.checked]); setIsChecked((current) => !current); };
P粉8462943032023-09-03 13:52:59
arr.push(e.target.checked);
is the correct way to get rid of:
else { checkedItems = ""; }
You cannot update status this way, and when you try to uncheck an input, an error will appear:
Now let's see what you want to do, every time an input is checked, you store e.target.checked
, so checkedItems
will look like this:
[true, true, true, true, true, true, true, true]
Why do you need this? A better approach is to store the id of the selected item:
const handleChange = (isChecked, id) => { var arr = [...checkedItems]; if (isChecked) { arr.push(id); setCheckedItems(arr); } else { setCheckedItems(checkedItems.filter((storedId) => storedId !== id)); // 如果对应的输入未选中,则从checkedItems中删除id } };
Then in jsx:
<StyleCheckBox type="checkbox" value={item.id} onChange={(e) => { handleChange(e.target.checked, item.id); }} />;
Now look at this:
<StyleCheckBox value={isChecked} // 这一行 >
You are mapping via items
, creating multiple checkboxes, but they all share the same value. The value attribute of the checkbox is not what you think, please learn more in here. So you can use value={item.id}
to set a unique value for each input, and get rid of the useState hook of isChecked
, which you don't really need.