以下の試薬成分を検討してください。スパン要素の実サイズに基づいてローカル状態のアトムを更新するref関数を使用します。これはget-real-size
の実装はベクトルを返す場合クロージャレットの原子に変化すると、試薬成分が再現されますか?
(defn show-my-size-comp []
(let [size (r/atom nil)]
(fn []
(.log js/console "log!")
[:div
[:span {:ref (fn [el]
(when el (reset! size (get-real-size el))))}
"Hello, my size is:" ]
[:span (prn-str @size)]])))
独自のサイズの表示コンポーネントを再レンダリングするために行われ、ログメッセージは、コンポーネントが不必要にすべての時間を再レンダリングされている意味、常に印刷されます。数値または文字列を返すだけの場合、ログはこのシナリオで意図したように2回しか表示されません。
この理由は何ですか?それは、おそらく、新しいベクトル(同じ値を含む)でclojureスクリプトアトムを内部的に更新することは、別のJavaScriptオブジェクトをそこに置くことを意味し、アトムを変更するでしょうか?価値を置くことは観察可能な変化をもたらさないのに対し、ちょうど投機... *
とにかく - 実際の使用例では、ベクトルのスパンのサイズを保存する方が確かに良いでしょう。これを達成する方法はありますか?
私はこれを渡り、this質問で与えられた答えを強化しようとするときに。
*以来、JSで:({} === {}) // false
私はそれをテストできますが、計算されたサイズを 'get-real-size'で記録しようとしています。私の推測では、それは絶えず変化しています。それは、それが自分のサイズになり、異なる値を表示するたびに、幅が変わって再レンダリングされ、新しい幅で新しいサイズで新しいrefを取得するからです。 –
nope、私あまりにも推測しました。関数がダミーのときも同じです: '(defn get-real-size [_] [0 0])' –