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

React Native日历组件state已存数据需手动Ctrl+s刷新才渲染,求解决方案

修复建议

核心原因

你自定义的shouldComponentUpdate生命周期方法遗漏了对loaded状态的判断,同时存在对象/日期引用比较错误,导致接口请求完成、loaded设为true时组件没有触发重渲染,Fast Refresh会强制绕过自定义更新逻辑触发重绘,所以手动保存后可以正常显示。

具体修复步骤

    1. 修正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
}
    1. 修正所有日期比较逻辑,将所有selected === xxxDate的判断替换为时间戳比较
      比如week方法中的选中判断改为:
selected.getTime() === week[index].plenaDiem.getTime()
    1. 修复全局变量污染问题:flag方法中的items未声明作用域,会挂载到全局对象造成不可预期的副作用,修改为:
const items = this.state.data !== null ? this.state.data.filter((achieve) => achieve.date.includes(date)) : null
    1. 验证方法:如果修改后仍有问题,可以临时注释整个shouldComponentUpdate方法,使用React默认的更新逻辑验证问题是否解决,确认是自定义更新逻辑的问题后再细化判断条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:06:04