在最简单的情况下,假设我有一个Dynamic t Bool
,当值为 true 时,我希望存在一个空 div,而当值为 false 时,我不希望有任何 dom 元素。
更一般地说,如果我有 a Dynamic t (Either MyA MyB)
,并且我有知道如何渲染给定 aDynamic t MyA
或 aDynamic t MyB
的函数,我如何调用适当的函数来渲染?
如果您需要切换小部件,您可能需要以下之一:
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 文本可以直接影响节点文本,而无需重新渲染整个节点),您应该利用这一点。如果不是,那么大部分页面将被交换,并且可能会对性能产生重大影响。