2017-11-08 15 views
1

ライフサイクル関数で使用するいくつかの共有(静的)変数を定義できるReagentフォーム-3コンポーネントと同様のことをしたいと思います。Om.Nextライフサイクル関数内のローカル状態を閉じる

基本的に私の質問は、letに相当するものを以下の試薬コードスニペットでどのように構築するのですか?私はOmのdefuiマクロを使ってこれを正しく行う方法を理解できないようです。

単純な例は、gdom/getElementでコンポーネントの特定のインスタンスのすべてのライフサイクル機能にアクセスできる内部IDを生成することです。

(defn my-component 
    [x y z] 
    (let [id (gensym "my-component-")] ;; <-- how to do this in Om? 
    (reagent/create-class     
     {:component-did-mount (...) 
     :component-will-mount (...)   
     :reagent-render 
     (fn [x y z] (js/console.log id)))) ;; <-- id is available 

答えて

0

掘り起こした後、私は解決策が反応のinitLocalStateライフサイクルメソッドとom.next/get-stateを使用してChrisの答えにヒントを得たことを発見しました。

次のように一般的な概要は次のようになります。

(defui MyComponent 
    Object 
    (initLocalState [this] {:id (gensym "") ...}) ; <-- the key 
    (render [this] 
    (let [id (om/get-state this :id)] ...)) 
    (componentDidmount [this] 
    (let [id (om/get-state this :id)] ...)) 
    ... 

それは同等の機能を提供して、このアプローチは、試薬よりも冗長ですが、私はそれで大丈夫ですよ。私はこれをいつも使っているので、少し驚いて私は他の場所でこれに関する議論を見つけることができませんでした。

1

あなたは、に書き込みを変更し、コンポーネントのローカル状態から読み取るom.next/set-state!om.next/update-state!om.next/get-stateを使用することができます。

しかし、コンポーネントのローカル状態は、いとこの状態からアプリ状態への悪い状態です。アプリ状態を使用するには、defuiコンポーネントにidentを与え、単にコンポーネントのクエリの一部であるキーワードを作成します。それから、あなたが発明したキーワードにディスパッチするマルチメソッドを読み込み、変更します。

注 - Om NextではなくFulcroを使用している場合は、読み取りマルチメソッドは必要ありません。

+0

おそらく間違った用語を使用しましたが、私はコンポーネントの状態を変更する方法を探していません。インスタンス化の際に一度コンポーネントをパラメータ化する必要があります。 Omの状態関連関数は、再レンダリングなどを引き起こしますが、これは私が望むものではありません。 OPの試薬の例では、 'my-component'のすべてのインスタンス化は異なる' id'を持ちますが、 'id'は各インスタンス化のすべてのライフサイクル機能で利用可能になります。これらのことをアプリ状態にすることは、私がやろうとしていることに対して大きな過度の不安のようですが、おそらく私はまだ完全に正しい考え方ではありません。 –

+0

ライフサイクル機能によってはコンポーネントのローカル状態?私が言及しなかった別の選択肢は、特定のコンポーネントに関係しないが、すべてから簡単にアクセスできる、「リンク」として知られる便利なグローバルな部分です。照会されたものはレンダリング(これらのリンクを含む)を引き起こしますが、それは本当に学問的です。 –

+0

あなたのご意見をお寄せいただきありがとうございました。 –

関連する問題