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

React传useSelector获取的时区到FullCalendar报moment.tz不是函数错误

报错原因

  • 核心触发点是组件首次渲染时,从Redux拿到的userTimezone为非法值:Redux状态初始化阶段state.settings.userTimezone大概率是undefined、空字符串、非IANA标准时区格式的无效值,momentTimezonePlugin接收到非法时区参数时,调用moment.tz方法就会抛出该错误。
  • 手动写死时区字符串运行正常,是因为组件从首次渲染开始就拿到了合法的时区参数,不会进入异常执行分支。

解决方案

方案1:给Redux状态设置合法初始值

在Redux的settings切片的初始化逻辑中,给userTimezone设置默认合法值,比如'UTC'、'Asia/Shanghai'等标准IANA时区字符串,避免首次渲染拿到空值。

方案2:组件增加条件渲染逻辑

等userTimezone加载为合法值后再渲染FullCalendar组件,修改代码如下:

export default function Schedule(){
    const { userTimezone } = useSelector((state) => state.settings)
    // 校验时区值合法性,无效时展示加载态
    if (!userTimezone || typeof userTimezone !== 'string') return <div>加载中...</div>
    return (
    <div className="container-fluid">
      <FullCalendar
        nowIndicator
        timeZone={userTimezone}
        plugins={[timeGridPlugin, dayGridPlugin, interactionPlugin, momentTimezonePlugin]}
        initialView="timeGridWeek"
        headerToolbar={{
          left: 'prev,next today',
          center: 'title',
          right: 'dayGridMonth,timeGridWeek,timeGridDay',
        }}
        editable
        selectable
        selectMirror
        dayMaxEvents
        weekends
        locales={allLocales}
        events={currentevents}
      />
    </div>
  )
}

额外校验项

如果上述方案无法解决问题,再核对两点:

  • 已经完整安装moment和moment-timezone依赖,且在项目入口正确导入了moment-timezone
  • Redux中存储的userTimezone没有多余空格、格式错误,符合IANA时区字符串标准

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:54:00