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

React子组件CalendarDateGrid在prop变化时未触发重新渲染问题排查

问题排查与解决方案

1. 修复Calendar组件的点击事件逻辑

当前Calendar组件的点击事件写法无效,onClick={() => setCalendarData}仅返回了更新方法,没有真正执行状态更新操作,这是导致数据不更新的核心原因。需要在点击时用最新的起止日期计算新数据,再调用更新方法:

<div className="py-14">
  <div
    onClick={() => {
      // 用当前最新的startDate、endDate计算新的日历数据
      const newCalendarData = calculatedCalendarData(startDate, endDate)
      setCalendarData(newCalendarData)
    }}
    className="cursor-pointer bg-white w-72 mx-auto text-center text-wahl-red rounded"
  >
    <span className="inline-block border-wahl-red rotate-180 border w-5 align-middle" />
    <span type="button" className="inline-block px-3 py-2 text-lg">
      calculate date
    </span>
  </div>
</div>

注意:如果calculatedCalendarData方法没有在Calendar组件内定义,需要通过父组件props传入该方法,或者在Calendar内导入。

2. 简化CalendarDateGrid组件冗余逻辑

子组件不需要额外声明内部状态和useEffect同步props数据,直接使用传入的data属性即可,多余的状态同步逻辑反而可能引发更新异常:

export default function CalendarDateGrid({ data, isLoading }) {
  return (
    <div className="w-4/5 2xl:w-2/3 mx-auto pb-20">
      {isLoading && (
        <ul
          role="list"
          className="mt-3 grid grid-cols-1 gap-5 sm:gap-12 md:grid-cols-2 xl:grid-cols-3"
        >
          {data.map((calendarItem, index) => (
            // 原列表项渲染逻辑
          ))}
        </ul>
      )}
    </div>
  );
}

3. 可选:检查数据引用相等性

如果修改后仍有更新问题,检查calcNormalOrderElectoralBoard、calcNormalDiploma两个计算方法的返回值:如果多次调用返回的是同一个引用的对象/数组,React会判定状态无变化不会触发重渲染,确保每次计算返回新的引用即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:27:02