P粉5750559742023-09-03 21:41:47
这可能解决您的问题。
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);
是正确的方法,可以摆脱:
else { checkedItems = ""; }
你不能用这种方式更新状态,当你尝试取消选中一个输入时,会出现错误:
现在让我们看看你想做什么,每次选中一个输入时,你都存储了e.target.checked
,所以checkedItems
会变成这样:
[true, true, true, true, true, true, true, true]
你为什么需要这个?更好的做法是存储选中项的id:
const handleChange = (isChecked, id) => { var arr = [...checkedItems]; if (isChecked) { arr.push(id); setCheckedItems(arr); } else { setCheckedItems(checkedItems.filter((storedId) => storedId !== id)); // 如果对应的输入未选中,则从checkedItems中删除id } };
然后在jsx中:
<StyleCheckBox type="checkbox" value={item.id} onChange={(e) => { handleChange(e.target.checked, item.id); }} />;
现在看看这个:
<StyleCheckBox value={isChecked} // 这一行 >
你正在通过items
进行映射,创建多个复选框,但它们都共享相同的值。而复选框的值属性并不是你想象的那样,请在这里了解更多。所以你可以使用value={item.id}
为每个输入设置一个唯一的值,并且可以摆脱isChecked
的useState hook,你真的不需要它。