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

React中如何使用useState Hook获取所有复选框状态与笔记内容

使用React useState Hook管理复选框状态与笔记内容

你当前的代码通过DOM操作实现了需求,但不符合React的状态驱动理念。改用useState管理状态的核心是把每一行的复选框状态、笔记内容都维护在组件状态中,表单元素的变化直接更新状态,提交时直接从状态提取数据即可。

实现步骤与代码示例

1. 初始化状态

用useState创建一个数组状态,对应每一行的检查项数据,初始值基于InspectionList的长度生成:

import { useState } from 'react';

// 假设InspectionList是你的检查项列表
// const InspectionList = [/* 你的检查项数据 */];

function YourComponent() {
  // 初始化状态:每个项包含id、isChecked(复选框状态)、notes(笔记内容)
  const [inspectionRows, setInspectionRows] = useState(() => 
    InspectionList.map((_, index) => ({
      id: index + 1, // 和原逻辑保持一致,id从1开始
      isChecked: false,
      notes: ''
    }))
  );
  const [errId, setErrId] = useState<string[]>([]);
  const [insData, setInsData] = useState<typeof inspectionRows>([]);

2. 绑定表单元素的 onChange 事件

渲染复选框和笔记输入框时,绑定onChange事件,实时更新对应行的状态:

return (
    <form onSubmit={handleEditFormSubmit}>
      {inspectionRows.map(row => (
        <div key={row.id}>
          <input
            type="checkbox"
            checked={row.isChecked}
            onChange={(e) => {
              // 更新对应行的复选框状态
              setInspectionRows(prev => prev.map(item => 
                item.id === row.id 
                  ? {...item, isChecked: e.target.checked} 
                  : item
              ));
            }}
          />
          <input
            type="text"
            value={row.notes}
            onChange={(e) => {
              // 更新对应行的笔记内容
              setInspectionRows(prev => prev.map(item => 
                item.id === row.id 
                  ? {...item, notes: e.target.value} 
                  : item
              ));
            }}
          />
        </div>
      ))}
      <button type="submit">提交</button>
    </form>
  );

3. 重写提交处理函数

提交时直接从inspectionRows状态获取数据,不需要操作DOM,同时保留你的校验逻辑:

function handleEditFormSubmit(e: React.FormEvent) {
    e.preventDefault();
    const errids: string[] = [];

    // 遍历状态数据,做校验并整理提交数据
    const data = inspectionRows.map(row => {
      const { id, isChecked, notes } = row;
      if (!isChecked && !notes) {
        errids.push(`notes_${id}`); // 和原错误ID格式保持一致
      }
      return {
        id,
        is_checked: isChecked,
        notes
      };
    });

    setErrId(errids);
    setInsData(data);
  }
}

核心优势

  • 完全符合React的状态驱动视图理念,避免直接操作DOM带来的副作用
  • 状态变化由React自动追踪,渲染更可靠,不会出现DOM与状态不一致的问题
  • 代码逻辑更清晰,数据流向可追踪

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 15:46:12