有一些关于moment.js的绑定我想在我的Halogen UI中用于渲染时间跨度,其类型类似于
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
中执行此操作?
答案 0 :(得分:2)
在Halogen中渲染期间确实无法执行任何有效的操作,因为HTML
只是数据而渲染是state -> HTML
。
菲尔在评论中说,如果你确定他们没有效果,你就不必在FFI功能的签名中使用Eff
。在这种情况下,它可能是安全的,因为它基本上是关于日期的算术 - 但是可能会有一些特定于语言环境的东西在进行?如果是这样,它只是有点狡猾,因为至少它会在同一台机器上给出相同的结果,除非OS时钟被搞乱。我有点犹豫不决,认为它是免费的,但如果它真的是一个问题,我需要这样做,我至少要确保功能不会被导出,所以它不能除特殊情况外,可在其他任何地方使用。
您可以在组件eval
中执行此操作并将值存储在组件状态中 - myTimeStamp
必须已经存在,因此您可以同时计算此值?这样,您也不会使用每个render
重新计算静态值。