0

我想在我的 Halogen UI 中使用一些与 moment.js 的绑定来渲染时间跨度,它们的类型类似于

diffMins :: forall eff. Moment -> Moment -> Eff (now :: NOW | eff) Number

如果我想像这样在我的 UI 中使用此功能:

H.span_ [H.text $ diffMins (fromEpoch_ 0) (fromEpoch_ myTimeStamp)]

但这是在,Eff所以我不能。

我能做的是用这个函数调用时刻:

js:

exports.duration_ = function (millis) {
    return moment.duration(millis).humanize();
};

ps:

foreign import duration_ :: Number -> String

humanizeMilliseconds :: Milliseconds -> String
humanizeMilliseconds (Milliseconds n) = duration_ n

我的问题(或几个)然后:

调用 javascript 而不说它是一个Eff. 如果不是,什么时候认为可以,什么时候不可以?无论哪种方式,我都可以将这些功能视为副作用。

如果我不能改变我打电话给时刻的方式,或者这确实是一个坏主意,有没有办法做到这一点HTML

4

1 回答 1

2

在 Halogen 渲染期间确实不可能执行任何有效的操作,HTML只有 data 和 render is state -> HTML

正如菲尔在评论中所说,如果您确定它们没有执行任何效果,则不必Eff在 FFI 函数的签名中使用。在这种情况下,它可能是安全的,因为它基本上是日期的算术 - 但可能会发生一些特定于语言环境的事情?如果是这样,它只是有点狡猾,因为至少它总是会在同一台机器上给出相同的结果,除非操作系统时钟被弄乱了。我会有点犹豫是否接受它是免费的,但如果这真的是一个问题并且我需要这样做,我至少会确保该函数没有被导出,所以它不能在其他任何地方使用,除了在特殊情况。

您可以在组件中的eval某个地方执行此操作并将值存储在组件状态中 -myTimeStamp必须已经存在,所以您可以同时计算该值?这样你就不会重新计算每个静态值render

于 2017-01-05T20:17:27.090 回答