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

React中如何在map内使用useState?解决Hook调用报错

修复React Hook在map回调中调用的错误

错误原因

你碰到的错误是因为React Hook的核心规则:所有Hook必须在组件的顶层作用域调用,不能放在循环、条件判断或者嵌套回调里。map的回调函数属于嵌套函数,在里面调用useState直接违反了这个规则。

另外你原代码里还有个小问题:useState("new Date(eachData.eDate)")把new Date()用引号包起来了,这会把它当成字符串而非Date对象,后续使用会出问题。


修复方案1:用单个State统一管理所有项的日期

用一个对象(或数组)来存储所有列表项的选中日期,在组件顶层初始化这个State,避免在循环里单独定义Hook。

修改后的代码:

const funName = () => {
  // 初始化:把data中每个项的eDate转成Date对象,存到以唯一标识为key的对象里
  const [endDates, setEndDates] = useState(() => {
    return data.reduce((acc, item) => {
      // 优先用item的唯一id当key,没有的话可以用其他唯一字段,尽量别用index
      acc[item.id] = new Date(item.eDate);
      return acc;
    }, {});
  });

  // 统一处理日期变更
  const handleDateChange = (itemId, newDate) => {
    setEndDates(prevState => ({
      ...prevState,
      [itemId]: newDate
    }));
  };

  return (
    <>
      {data.map((eachData) => (
        <CustomComponent
          key={eachData.id} // 用唯一id作为key,比index更稳定
          selected={endDates[eachData.id]}
          onChange={(date) => handleDateChange(eachData.id, date)}
        />
      ))}
    </>
  );
};

修复方案2:拆分独立子组件管理单个项的状态

把每个列表项的逻辑拆成单独的子组件,在子组件的顶层调用useState,符合Hook规则。

// 子组件:负责单个日期选择项的状态管理
const DateSelectorItem = ({ initialDate }) => {
  const [endDate, setEndDate] = useState(new Date(initialDate));

  return (
    <CustomComponent
      selected={endDate}
      onChange={(date) => setEndDate(date)}
    />
  );
};

// 父组件
const funName = () => {
  return (
    <>
      {data.map((eachData) => (
        <DateSelectorItem
          key={eachData.id}
          initialDate={eachData.eDate}
        />
      ))}
    </>
  );
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 18:22:37