如何在Reflex Dynamic中分支值?

时间:2016-11-08 08:10:52

标签: haskell reflex

在最简单的情况下,假设我有max,当值为true时,我想要一个空div存在,当值为false时,我不希望有任何dom元素。

稍微更一般地说,如果我有一个Dynamic t Bool,并且我的函数知道如何渲染给定Dynamic t (Either MyA MyB)Dynamic t MyA,那么如何调用相应的函数来渲染?

1 个答案:

答案 0 :(得分:5)

如果您需要切换小部件,则可能需要以下方法之一:

dyn :: MonadWidget t m => Dynamic t (m a) -> m (Event t a) Source

widgetHold :: MonadWidget t m => m a -> Event t (m a) -> m (Dynamic t a)

既然你已经提到你手头有动态,我们就会使用dyn

app = do
  switched <- button "Alternate!"
  flag <- foldDyn ($) False (not <$ switched) -- just to have some Dynamic t Bool
  let w = myWidget <$> flag
  void $ dyn w

myWidget :: MonadWidget t m => Bool -> m ()
myWidget False = blank
myWidget True = el "div" $ blank

基本规则是,由于Reflex的高阶性质,如果你想换掉一些东西,你需要有一个Event / Dynamic,它将一个小部件作为一个值。这就是dynDynamic t (m a)作为参数的原因(恰当地,widgetHold需要Event t (m a)。这就是为什么我们已经映射Dynamic t Bool以获得动态将我们的小部件构建操作作为值。

值得一提的是,动态/ widgetHold都不会进行虚拟dom / diffing来加速渲染。通过反射,您可以更明确地了解更新内容(动态/事件文本可以直接影响节点文本,而无需重新呈现整个节点),您应该利用它。如果没有,那么大部分页面将被交换,并且它可以产生显着的性能损失。