是否可以在卤素ComponentHTML功能中运行Eff中的某些东西?

时间:2017-01-05 13:40:39

标签: purescript halogen

有一些关于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中执行此操作?

1 个答案:

答案 0 :(得分:2)

在Halogen中渲染期间确实无法执行任何有效的操作,因为HTML只是数据而渲染是state -> HTML

菲尔在评论中说,如果你确定他们没有效果,你就不必在FFI功能的签名中使用Eff。在这种情况下,它可能是安全的,因为它基本上是关于日期的算术 - 但是可能会有一些特定于语言环境的东西在进行?如果是这样,它只是有点狡猾,因为至少它会在同一台机器上给出相同的结果,除非OS时钟被搞乱。我有点犹豫不决,认为它是免费的,但如果它真的是一个问题,我需要这样做,我至少要确保功能不会被导出,所以它不能除特殊情况外,可在其他任何地方使用。

您可以在组件eval中执行此操作并将值存储在组件状态中 - myTimeStamp必须已经存在,因此您可以同时计算此值?这样,您也不会使用每个render重新计算静态值。