Только начинаю с Реагента. У меня есть кнопка, значение которой :on-click
вызывает выполнение функции с интенсивным использованием ЦП; возвращение занимает много времени. Я хочу обновить текст самой кнопки, чтобы уведомить пользователя о том, что, возможно, придется подождать, поэтому я определяю ратом, который будет указывать текст кнопки, а затем я reset!
ратом во время работы функции.
Это работает, если я определяю ратом вне моей функции компонента кнопки, но не работает, если я определяю ратом внутри функции компонента через let
или если я reset!
ратом на верхнем уровне в функции компонента. То есть текст кнопки не изменится, если я раскомментирую первую закомментированную строку ниже или раскомментирую две строки для let
. Я делаю что-то неправильно? Это ожидаемое поведение? Какое общее правило относительно ratom и DOM-обновления применимо здесь?
(def label (reagent.core/atom "Make chart"))
(defn chart-button
[normal-label running-label]
; (reset! label normal-label) ; reset globally-defined ratom
; (let [label (reagent.core/atom normal-label)] ; use local ratom
[:button {:on-click (fn []
(reset! label running-label)
(js/setTimeout (fn []
(cpu-intensive-function)
(reset! label normal-label))
10))
}
@label] ;)
)
...
[chart-button "make chart" "running..."]
...
(Не актуально, но для пояснения: я использую прием setTimeout
, описанный здесь, чтобы заставить DOM обновляться, несмотря на то, что в противном случае длительно работающая функция не позволила бы браузеру обновлять DOM во время работы функции.)