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

React中如何维护Table表格每行单选按钮的选中状态

问题核心原因

你的实现没有遵循React受控组件的设计逻辑:直接修改DOM元素的checked属性不会被React状态同步,组件重渲染时会被重置;同时没有为每行的输入框绑定对应状态,也没有区分不同行的状态值,所以修改不会生效。


解决步骤

1. 初始化行状态

在组件constructor中提前存储每行开关的选中状态,用行id作为key区分不同行:

constructor(props) {
  super(props);
  const initSwitchStatus = {};
  // 用接口返回的初始status初始化每行开关状态
  props.records.forEach(row => {
    initSwitchStatus[row.id] = row.status;
  });
  this.state = {
    switchStatus: initSwitchStatus,
    records: props.records
  };
}

如果你的records是异步加载的,在接口请求成功的回调里再执行一次初始化switchStatus的逻辑即可。

2. 重写状态变更处理函数

不需要手动操作DOM,直接更新React状态即可:

changeStatus(rowId, e) {
  this.setState(prevState => ({
    switchStatus: {
      ...prevState.switchStatus,
      // 直接取触发事件的checkbox选中状态更新对应行的状态
      [rowId]: e.target.checked
    }
  }), () => {
    // 状态更新完成后的回调,可选用来打印日志或者提交后台
    console.log(`行${rowId}选中状态:`, this.state.switchStatus[rowId]);
  });
}

3. 给输入框绑定状态

修改render中的input标签,关联每行的状态值,同时触发变更时传入当前行id:

{records.length>0 && records.map((row,i) => (
  <tr key={i}>
    <td>{i+1}</td>
    <td>{row.name}</td>
    <td>          
        <div className="form-check form-switch">
        <input 
          className="form-check-input" 
          type="checkbox"
          {/* 绑定state中对应行的选中状态 */}
          checked={this.state.switchStatus[row.id]}
          {/* 绑定事件时传入当前行id区分不同行 */}
          onChange={this.changeStatus.bind(this, row.id)}
        />
        </div>
    </td>
    <td>
    <Link to={"/brand/"+row.slug}>
    <button type="button" className="btn btn-sm btn-info active"> <i className="fas fa-edit"></i > Edit</button>
    </Link>
    </td>
  </tr>
))}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:36:01