在最简单的情况下,假设我有一个Dynamic t Bool
,当值为 true 时,我希望存在一个空 div,当值为 false 时,我不希望存在任何 dom 元素。
更一般地说,如果我有一个Dynamic t (Either MyA MyB)
,并且我有知道如何渲染给定的函数Dynamic t MyA
or a Dynamic t MyB
,如何调用适当的函数来渲染?
如果您需要切换小部件,您可能需要以下之一:
dyn :: MonadWidget t m => Dynamic t (m a) -> m (Event t a) Source
or
widgetHold :: MonadWidget t m => m a -> Event t (m a) -> m (Dynamic t a)
既然你提到你手头有 Dynamic,我们将使用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
基本规则是,由于反射的高阶性质,如果你想交换某些东西,你需要有事件/动态来产生一个小部件作为值。这就是为什么dyn
takes Dynamic t (m a)
作为它的参数(并且适当地,widgetHold
takes Event t (m a)
。这就是我们绘制地图的原因Dynamic t Bool
拥有一个以我们的小部件构建操作作为值的动态。
值得一提的是,dynamic/widgetHold 都不执行 virtual dom/diffing 来加速渲染。通过反射,您可以更明确地了解更新内容(动态/事件文本可以直接影响节点文本,而无需重新渲染整个节点),您应该利用这一点。如果没有,那么大部分页面将被交换,并且可能会产生显着的性能影响。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)