2

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

更一般地说,如果我有 a Dynamic t (Either MyA MyB),并且我有知道如何渲染给定 aDynamic t MyA或 aDynamic t MyB的函数,我如何调用适当的函数来渲染?

4

1 回答 1

6

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

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 来产生一个小部件作为一个值。这就是为什么dyn需要Dynamic t (m a)作为它的参数(并且适当地,widgetHold需要Event t (m a)。这就是为什么我们已经映射了Dynamic t Bool一个动态,它具有我们的小部件构建操作作为一个值。

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

于 2016-11-08T09:00:45.417 回答