reactjs - 使用 usestate 数组时将复选框类型的 reactjs 输入元素限制为 2
问题描述
我的目的是让一周中的两天成为周末
问题在于这种方法我无法将周末数组限制为仅保留两天它总是超出
我认为问题在于状态是异步的,并且 setState 和 useEffect 具有不同的值但无法解决问题
const weekendDays = [
"Saturday",
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
];
const [weekend, setWeekend] = useState([]);
const handleWeekendSelection = ({ target }) => {
if (target.checked) {
!weekend.includes(target.value) &&
setWeekend((prev) => [...prev, target.value]);
} else {
setWeekend((prev) => [...prev].filter((day) => day !== target.value));
}
};
useEffect(() => {
console.log(weekend.length);
if (weekend.length > 2) {
const checkboxes = document.querySelectorAll(
"input[type=checkbox]:checked"
);
const lastCheckbox = checkboxes[checkboxes.length - 1];
lastCheckbox.checked = false;
setWeekend((prev) => {
const correctedWeekend = prev;
correctedWeekend.length > 2 && correctedWeekend.pop();
return [...correctedWeekend];
});
}
}, [weekend.length]);
<div>
{weekendDays.map((day, index) => {
return (
<div key={index}>
<input
type="checkbox"
value={index}
onChange={handleWeekendSelection}
/>
<label>{day}</label>
</div>
);
})}
</div>
解决方案
与其使用 useEffect ,不如在设置状态时处理它。像这样的东西
const handleWeekendSelection = ({ target }) => {
if (target.checked) {
if(!weekend.includes(target.value)){
let newWeekend = [...weekend, target.value]
if(weekend.length === ) newWeekend = [weekend[1], target.value]
setWeekend(newWeekend);
}
} else {
setWeekend((prev) => [...prev].filter((day) => day !== target.value));
}
};
推荐阅读
- java - Rxjava:也许是带有可完成的平面图
- python - TypeError:'int' 对象在 Python 3 中不可调用
- java - 套接字——如何处理?
- java - 文件创建失败无一例外
- swift - 如何修复xcode中的检查依赖项错误?
- python - 在python中求解一个非线性方程:答案与初始猜测相同
- python - 使用“类型”动态定义 CQLEngine 模型
- instagram - 有没有办法通过桌面浏览器上传照片/视频并在 Instagram 上查看直接消息?
- keras - “盲” Keras CNN,100% 准确率,没有预测能力
- azure-devops - 如果天蓝色管道中的“测试失败”,如何使构建管道失败?