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
相关产品推荐
相关产品推荐

