다음 시약 구성 요소를 고려하십시오. 범위 함수의 실제 크기를 기반으로 로컬 상태 아톰을 업데이트하는 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)]])))
자신의 크기를 표시하는 구성 요소를 다시 렌더링하기 위해 수행, 로그 메시지는 구성 요소가 불필요하게 모든 시간을 다시 렌더링되는 의미 지속적으로 인쇄됩니다. 숫자 또는 문자열 만 반환하면 로그는이 시나리오에서 의도 한대로 두 번 나타납니다.
이 이유가 무엇인가요? 아마도 clojure 스크립트 아톰을 새로운 벡터 (동일한 값을 포함하고 있음)로 업데이트하는 것이 내부적으로 다른 JavaScript 객체를 삽입하여 원자를 변경한다는 의미일까요? 가치를 두는 것은 관찰 할 수없는 변화를 가져 오지 않습니까? 그냥 추측 ... *
어쨌든 - 실제 사용 케이스의 경우 벡터의 스팬 크기를 절약하는 것이 더 낫습니다.이 방법이 있습니까?
나는 캠을 this 질문에 주어진 답변을 강화하려고 할 때 이것을 가로 질렀습니다.
* 이후 JS에서 : ({} === {}) // false
나는 그것을 테스트 할 수있는 설치물이 아니지만 계산 된 크기를'get-real-size'에 로깅 해보십시오. 내 생각 엔 끊임없이 변화하고있다.그것은 그것이 자신의 크기가되고 다른 값을 표시 할 때마다 너비가 변경되어 다시 렌더되도록하고 너비가 다른 새로운 크기로 새 참조를 얻게되기 때문입니다. –
아니요, 저는 너무 추측했다. 함수가 더미 일 때도 마찬가지입니다 :'(defn get-real-size [_] [0 0])' –