2016-08-26 2 views
2

は、グローバルアプリケーション状態(試薬) - 原子がある考えてみましょう:試薬:ワーカーを使用してローカルコンポーネントの状態をグローバル状態に同期させますか?

(defonce state (reagent/atom ["Here" "are" "some" "words"])) 

この原子取得の操作/ Webアプリケーションを通じてさまざまな場所からスワップ。

今では、単語をstateからレンダリングする必要があるコンテナがあります。コンテナ自体は、それ自身のローカル状態でいくつかの余分なデータを追跡する必要があります。言葉の長さが必要だとしましょう。
ように、ローカル状態は、このような構造を有する、グローバル状態に同期している原子が存在すべきである:例えば、レンダリングされる

[{:word "Here" :length 4} 
{:word "are" :length 3} 
{:word "some" :length 4} 
{:word "words" :length 5}] 

ように:

(defn compo [] 
    (let [local-state ...] 
     (fn [] 
     [:div 
      (for [{:keys [word length] @local-state] 
       [:div (str word " - " length)])]))) 

これを行う方法?これはウォッチャーのためのシナリオでしょうか?(installed via add-watchはlet文の冒頭にありますか?

答えて

1

グローバルな状態と常に同期していると思われる場合、別のローカルアトムを維持する必要があるかどうかはわかりません。代わりにグローバル状態を使用し、let式をレンダリング関数の中に入れてください。

(defn compo [] 
    (let [local-data ...] 
    [:div 
     (for [{:keys [word length] @local-data] 
     [:div (str word " - " length)])])) 

ここで、render関数の全身が呼び出されるたびに実行されます。そのため、local-dataを使用して、グローバルな状態をこのコンポーネントに必要なものにマップすることができます。

これが役に立ちます。

さらに、re-frameと呼ばれる別のクロージャスクリプトフレームワークがあります。これは試薬の上に構築され、それはあなたが探しているかもしれない正確にいる加入者を実装します。それらについての詳細はhereです。

+0

これは正しいアイデアだと思いますが、あなたの例ではグローバル状態を使用しません...グローバル状態とローカル状態の両方を使用することを意味します。 –

+0

新しい原子を作成するのではなく、レンダリングされる前に、必要に応じてグローバル状態の一部を変換する '' 'let'''式を使用するだけです。私はそれが十分明確であることを望む。私の例の '' 'local-state''はもはや原子ではなく、表現の不変の結果です。 –

+0

清算のためのgotchaありがとう –

関連する問題