Как я могу перейти на значение внутри 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 для ускорения рендеринга. С помощью рефлекса вы можете более четко определить, что именно обновляет (динамический текст / текст события может влиять на текст узла напрямую, без перерисовки всего узла), и вы должны воспользоваться этим. Если нет, то большие части страницы будут заменены, и это может привести к значительному снижению производительности.

Другие вопросы по тегам