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

React自定义多选日期组件触发useState不支持第二回调参数报错如何解决

报错原因

State updates from the useState() and useReducer() Hooks don't support the second callback argument. To execute a side effect after rendering, declare it in the component body with useEffect().

该报错的核心原因是:Hook 版本的 setState 不支持传入第二个回调参数(仅 Class 组件的 setState 支持该用法),而你的代码中存在给 setDates 传递超过1个参数的情况。

进一步定位:你直接将 useState 返回的 setDates 作为 onChange 回调传给了自定义日期组件,而 AntD 组件的事件回调默认会传递多个参数(比如 Select 的相关事件除了返回选中值,还会返回完整的选项对象作为第二个参数),多出来的参数被透传给 setDates,React 识别到第二个参数就会抛出该错误。

解决方案

两种修复方式任选其一即可:

方案1:父组件侧修改(最简便)

不要直接把 setDates 传给 onChange,用箭头函数包一层,仅接收第一个参数更新状态:

// 修改父组件的调用代码
<MultipleDatePicker 
  value={dates} 
  onChange={(val) => setDates(val)} 
/>

不管事件回调传递多少个参数,setDates 只会接收第一个值,不会触发多参数报错。

方案2:自定义组件侧修改

在自定义组件的 onChange 调用处,严格控制仅传递日期数组一个参数,同时覆盖 Select 所有默认事件回调,避免额外参数透传:

// 所有调用onChange的逻辑都确保只传一个参数,以_onChange为例
const _onChange = useCallback(
  selected => {
    const index = arrValues.findIndex(e => e.isSame(selected));
    const temp = [...arrValues];
    if (index !== -1) {
      temp.splice(index, 1);
    } else {
      temp.push(selected);
    }
    onChange?.(temp);
  },
  [arrValues, onChange]
);

// 给Select组件显式指定空onChange,覆盖默认行为避免多余回调触发
<Select
  // 保留其他原有属性不变
  onChange={() => {}}
/>
其他优化建议

你当前用了 React.forwardRef 但没有把 ref 绑定到内部的 Select 或其他 DOM 节点上,如果不需要对外暴露组件实例可以去掉 forwardRef 避免不必要的性能损耗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:45:04