Фокус и размытие компонента после воздействия на другой компонент в реагенте
Вот мой код Clojurescript:
(def focus-wrapper
(with-meta identity
{:component-did-update #(.focus (dom-node %))}))
(defn solution-input []
(let [current-char (subscribe [:current-char])
input (subscribe [:input])]
[focus-wrapper
(fn []
[:input {:type "text"
:auto-focus true
:value (:value @input)
:disabled (:disabled @input)
:on-change #(dispatch [:input-value-updated (.-target.value %)])
:on-key-press #(when (= 13 (.-which %))
(if (= (.-target.value %) (:solution @current-char))
(dispatch [:right-option-picked])
(dispatch [:wrong-option-picked])))}])]))
(defn quiz [props childrn this]
(let [current-char (subscribe [:current-char])
counter (subscribe [:counter])
feedback (subscribe [:feedback])]
(fn []
[:div.panel-container
[:h2 "Quiz"]
[:div.counter (str (:correct-guesses @counter) "/" (:total-guesses @counter))]
[:div.char (:hint @current-char)]
[solution-input]
[:div.feedback (when (not= @feedback "off") @feedback)]
[:button {:type "button"
:on-click #(dispatch [:next-char])}
"Skip"]
[:button {:type "button"
:on-click #(dispatch [:panel-changed "result"])}
"Finish"]])))
Обратите внимание, что я также использую перекадр. Я сохраняю состояние ввода (его значение и отключенное состояние) в моем app-db и подписываюсь на них в моем компоненте. Поэтому легко изменить фокус на компоненте, как только любой из этих реквизитов изменится (для этого и предназначен мой упаковщик фокуса).
Тем не менее, я изо всех сил пытаюсь найти способ заставить фокусировку на вводе после нажатия кнопки пропуска. Насколько мне известно, это типичный обоснованный вариант использования ref
в React, которые, кажется, работают по-другому в Reagent.
Может кто-нибудь порекомендовать способ решения этой конкретной проблемы управления фокусом в Реагент / ре-кадр?
1 ответ
Я думаю, что использование эффектов в порядке.
(reframe/reg-event-fx
:next-char
(fn [cofx [_ a]]
(.focus (.getElementById js/document "text-field-id"))
{}))
...
[:button {:type "button"
:on-click #(dispatch [:next-char])}
"Skip"]