You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React实现比赛胜负预测功能时复选框无法取消勾选的异常问题

问题根因

两个异常均由状态操作不符合React的设计规范导致:

  • 复选框无法取消勾选:删除属性时直接修改了原有状态对象,违反了React状态不可变的原则。setState更新时做浅比较,发现返回的状态对象引用和原状态完全一致,会判定状态无变化,因此不会触发重渲染,视图无法同步更新。
  • 跨行选中异常:判断逻辑写在setState updater函数外部,用的是当前渲染周期闭包捕获的旧predictions值,并非最新的状态,多次操作后判断逻辑基于旧值执行,就会出现逻辑错乱。
修复方案

1. 修正handlePrediction逻辑

将判断逻辑移到updater函数内部,操作状态前先做浅拷贝,永远返回新的状态对象:

const handlePrediction = (e) => {
    const id = e.target.id;
    const idx = e.target.getAttribute("idx");
    setPredictions((prev) => {
        // 浅拷贝原状态,不直接修改原对象
        const newPredictions = {...prev};
        if (newPredictions[idx] === id) {
            delete newPredictions[idx];
        } else {
            newPredictions[idx] = id;
        }
        return newPredictions;
    });
};

2. 统一类型避免隐式转换问题

原代码中checked判断用了parseInt(predictions[i]),如果predictions[i]不存在时parseInt(undefined)会得到NaN,容易引发判断异常,建议统一转为字符串比对:

// 选手A的checked判断
checked={predictions[i] === match.fighter_a_id.toString()}
// 选手B的checked判断
checked={predictions[i] === match.fighter_b_id.toString()}

内容的提问来源于stack exchange,提问作者Dan Zuzevich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:54:04