最も単純なケースでは、 がDynamic t Bool
あり、値が true の場合、空の div が 1 つ存在するようにし、値が false の場合、dom 要素が存在しないようにします。
もう少し一般的に言えば、 があり、またはDynamic t (Either MyA MyB)
を指定してレンダリングする方法を知っている関数がある場合、適切な関数を呼び出してレンダリングする方法を教えてください。Dynamic t MyA
Dynamic 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)
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
dynamic/widgetHold のどちらもレンダリングを高速化するために仮想 dom/diffing を行わないことに注意してください。reflex を使用すると、何を更新するかをより明確にすることができ (Dynamic/Event t Text は、ノード全体を再レンダリングすることなく、ノード テキストに直接影響を与えることができます)、それを利用する必要があります。そうしないと、ページの大部分がスワップされ、パフォーマンスが大幅に低下する可能性があります。