【问题标题】:moment object throws an error 'toDate' is not a function时刻对象抛出错误“toDate”不是函数
【发布时间】:2018-04-17 13:56:56
【问题描述】:

在 reducer 中,我使用 moment-timezone 将字符串从 API 转换为仅使用 UTC 时区的时刻对象:

import moment from 'moment-timezone';
moment.tz.setDefault('UTC');

然后我将字符串转换为矩对象:

const activeStart = active_start ? moment(active_start) : null;

并将其添加到商店:

return { ...state, activeStart };

这里一切都很好。

不幸的是,当我从容器中的存储中获取此值时,我无法使用 toDate 方法(需要将纯 JS Date 对象插入到第三方库之一)。它说activeStart.toDate is not a function。我检查并在 reducer 中调用 activeStart.toDate() 并返回正确的 Date 对象。

依赖关系:

"moment": "2.14.1",
"moment-timezone": "^0.5.15",
"react": "^15.6",
"react-redux": "^4.4.5",

我会很感激任何提示,发生了什么

【问题讨论】:

    标签: reactjs redux momentjs


    【解决方案1】:

    一般来说,您不想存储预先构建的对象。在 Redux 中发生奇怪的事情。 Redux 喜欢对事物进行序列化,而对于非 POJO 对象(如 moment 对象),它们可能会被序列化到仍然有数据但失去功能的程度。

    您最好的选择是将其转换(或保留)作为可以轻松转换为所需类型的对象(如字符串表示)的东西,然后在您的选择器(您调用以获取数据的函数out of state),在那里进行转换:

    function getActiveStart(state) {
        return state.activeStart ? moment(state.activeStart) : null;
    }
    

    【讨论】:

    • 听起来很合理。非常感谢!
    • ? 我在想我开始掌握 redux 的窍门了!
    【解决方案2】:

    当我解构它时,我的工作正常。

    const { name, createdAt } = user
    
    moment(createdAt.toDate()).format()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 2015-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多