2017-01-16 4 views
0

ヒカップの構文でテキストテキストエリアが定義されているとします。letで試薬成分の状態を定義できないのはなぜですか?

(def written-text (reagent/atom "")) 

(defn text-area [] 
    [:textarea 
    {:value  @written-text 
     :on-change #(reset! written-text (-> % .-target .-value)) 
     :on-click #(println @written-text)}]) 

ドキュメント内にテキストの領域が複数あり、それぞれに状態が異なるとします。それから、現在使用可能な状態を、現在のネームスペース内のすべてのものに対して、レキシカルスコープのシンボルに移動させる必要があります。次のようなものがあります。

(defn text-area [] 
    (let [written-text (reagent/atom "")] 
    [:textarea 
    {:value  @written-text 
     :on-change #(reset! written-text (-> % .-target .-value)) 
     :on-click #(println @written-text)}])) 

しかし、このコードは機能しません。ユーザーが何を入力しても、テキストフィールドは常に空になります。何故ですか?そして、コンポーネントごとのレキシカルスコープで自分の状態を囲むにはどうしたらいいですか?

答えて

0

この問題に対する答えは、re-frame documentationに記載されています。これは、試薬プロジェクトで通常見られるさまざまな形態のコンポーネントを示しています。コンポーネントごとの状態を永続的なレキシカルスコープで提供するには、別のレンダリング関数を返す関数を記述する必要があります。それ以外の場合は、試薬がコンポーネントを再レンダリングしようとするたびに状態原子が再定義されます。だから、特定のコンポーネントのために:

(defn text-area [] 
    (let [written-text (atom "")] 
    (fn []          
     [:textarea 
     {:value  @written-text 
     :on-change #(reset! written-text (-> % .-target .-value))}]))) 

この方法で、それはコンポーネントを再描画したいときに試薬によって呼び出される関数は、内部、匿名関数です。レキシカルスコープを定義するletは再実行されません。

この回答のクレジットはすべて、clojurians slackのmccraigmccraigユーザーに帰属します。

関連する問題