React Native日历组件state已存数据需手动Ctrl+s刷新才渲染,求解决方案
修复建议
核心原因
你自定义的shouldComponentUpdate生命周期方法遗漏了对loaded状态的判断,同时存在对象/日期引用比较错误,导致接口请求完成、loaded设为true时组件没有触发重渲染,Fast Refresh会强制绕过自定义更新逻辑触发重绘,所以手动保存后可以正常显示。
具体修复步骤
- 修正
shouldComponentUpdate逻辑,补充loaded状态判断和日期正确比较规则
- 修正
shouldComponentUpdate(nextProps, nextState) { // 加载状态变化必须触发重渲染,这是首屏显示的核心触发条件 if (this.state.loaded !== nextState.loaded) { return true; } // 数组是引用类型,setState时filter返回新数组,引用变化即可判定需要更新 if (this.state.data !== nextState.data || this.state.target !== nextState.target) { return true; } // 日期对象不能直接用===比较引用,转成时间戳比较值是否相等 if (this.state.selected.getTime() !== nextState.selected.getTime() || this.state.refreshValue !== nextState.refreshValue) { return true; } // 补充其他需要响应的状态判断 if (this.state.visible !== nextState.visible || this.state.feedbackText !== nextState.feedbackText || this.state.refreshing !== nextState.refreshing) { return true; } return false }
- 修正所有日期比较逻辑,将所有
selected === xxxDate的判断替换为时间戳比较
比如week方法中的选中判断改为:
- 修正所有日期比较逻辑,将所有
selected.getTime() === week[index].plenaDiem.getTime()
- 修复全局变量污染问题:
flag方法中的items未声明作用域,会挂载到全局对象造成不可预期的副作用,修改为:
- 修复全局变量污染问题:
const items = this.state.data !== null ? this.state.data.filter((achieve) => achieve.date.includes(date)) : null
- 验证方法:如果修改后仍有问题,可以临时注释整个
shouldComponentUpdate方法,使用React默认的更新逻辑验证问题是否解决,确认是自定义更新逻辑的问题后再细化判断条件。
- 验证方法:如果修改后仍有问题,可以临时注释整个
内容的提问来源于stack exchange,提问作者Amr shadid
相关产品推荐
相关产品推荐

