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

React中重置状态时如何取消所有<input type='checkbox'/>的选中状态

问题解决方案

问题核心是复选框未与状态双向绑定:你仅在onChange事件中更新了状态数组,但复选框自身的选中状态没有和React状态关联,导致调用setChecked([])清空状态时,DOM中的复选框仍保持之前的选中状态,未同步更新。

解决方法很直接——给每个复选框添加checked属性,绑定到状态判断结果,让React完全控制复选框的选中状态:

<input 
  type="checkbox" 
  value={fruit} 
  onChange={handleChangeFruit} 
  checked={isCheckedFruit(fruit)} // 新增该行,绑定状态
/>

修改后的完整代码

JavaScript

const App = () => {
const fruits = ["Tomate", "Banana", "Orange"];

  const [checked, setChecked] = React.useState([]);

  const handleChangeFruit = (event) => {
    var updatedFruitList = [...checked];
    if (event.target.checked) {
      updatedFruitList = [...checked, event.target.value];
    } else {
      updatedFruitList.splice(checked.indexOf(event.target.value), 1);
    }
    setChecked(updatedFruitList);
  };

  const isCheckedFruit = (fruit) => {
    return checked.includes(fruit); // 简化判断逻辑
  };

  const handleDeleteWorld = () => {
    setChecked([]);
  };

  return (
    <div className="App">
      <div>
        {fruits.map((fruit) => (
          <div key={fruit}>
            <input 
              type="checkbox" 
              value={fruit} 
              onChange={handleChangeFruit} 
              checked={isCheckedFruit(fruit)}
            />
            <label>{fruit}</label>
          </div>
        ))}
      </div>

      <div>
        <p>List :</p>
        {fruits.map((fruit) => (
          <div  key={fruit}>
            {(isCheckedFruit(fruit) || !checked.length) && (
              <p>{fruit}</p>
            )}
          </div>
        ))}
      </div>

      <div>
        <button onClick={handleDeleteWorld}>Reset checked elements</button>
      </div>
    </div>
  );
}

ReactDOM.render(<App />, document.getElementById("root"));

HTML

<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

<div id="root"></div>

额外优化说明

将isCheckedFruit函数改为使用includes方法,比find更简洁高效,逻辑完全一致。

修改后点击重置按钮时,checked状态变为空数组,所有复选框的checked属性会同步变为false,彻底解决状态不同步的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:20:30