2

最も単純なケースでは、 がDynamic t Boolあり、値が true の場合、空の div が 1 つ存在するようにし、値が false の場合、dom 要素が存在しないようにします。

もう少し一般的に言えば、 があり、またはDynamic t (Either MyA MyB)を指定してレンダリングする方法を知っている関数がある場合、適切な関数を呼び出してレンダリングする方法を教えてください。Dynamic t MyADynamic t MyB

4

1 に答える 1

6

ウィジェットを切り替える必要がある場合は、おそらく次のいずれかが必要です。

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 は、ノード全体を再レンダリングすることなく、ノード テキストに直接影響を与えることができます)、それを利用する必要があります。そうしないと、ページの大部分がスワップされ、パフォーマンスが大幅に低下する可能性があります。

于 2016-11-08T09:00:45.417 に答える