Как я могу перейти на значение внутри Reflex Dynamic?
В простейшем случае, скажем, у меня есть Dynamic t Bool
и когда значение равно true, я хочу, чтобы существовал один пустой div, а когда значение равно false, я не хочу, чтобы был какой-либо элемент dom.
чуть более в общем, если у меня есть Dynamic t (Either MyA MyB)
и у меня есть функции, которые знают, как визуализировать с учетом Dynamic t MyA
или Dynamic t MyB
Как вызвать соответствующую функцию для визуализации?
1 ответ
Если вам нужно переключить виджет, вам, вероятно, нужен один из:
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)
Поскольку вы упомянули, что у вас есть 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
Основное правило заключается в том, что из-за природы Reflex высшего порядка, если вы хотите что-то поменять, вам нужно иметь Event/Dynamic, который возвращает виджет в качестве значения. Вот почему dyn
принимает Dynamic t (m a)
в качестве его параметра (и соответственно, widgetHold
принимает Event t (m a)
, И именно поэтому мы наметили Dynamic t Bool
иметь динамику, которая имеет наше действие по созданию виджета в качестве значения.
Стоит отметить, что ни динамический / widgetHold не делает виртуальный dom / diff для ускорения рендеринга. С помощью рефлекса вы можете более четко определить, что именно обновляет (динамический текст / текст события может влиять на текст узла напрямую, без перерисовки всего узла), и вы должны воспользоваться этим. Если нет, то большие части страницы будут заменены, и это может привести к значительному снижению производительности.