Перекадровка Clojurescript: изменение фокуса на вновь созданный элемент
Я строю приложение перерамки со списком полей ввода текста. Я хотел бы, чтобы поведение было таким, когда пользователь нажимает RETURN
создается новая строка и фокус помещается на новую строку. Мне удалось создать новую строку, однако, когда я пытаюсь изменить фокус на эту новую строку с помощью этого вызова в change-focus
обработчик события:
(.focus (.getElementById js/document focus-element))
Я получаю ошибку: Cannot read property 'focus' of null
,
Я предполагаю, что это потому, что представление еще не отрисовало вновь созданную строку. Каков наилучший способ изменения фокуса на новый элемент с помощью перерамки?
Должен ли я поместить активный ряд в свой атом состояния и отобразить его в виде? Или, возможно, запустить другое событие после того, как представление было визуализировано? Я хотел бы некоторый вклад.
1 ответ
Если каждая строка, добавляемая вашей формой, является компонентной, то вы можете установить обработчик на componentDidMount
жизненный цикл обратного вызова. Он будет вызван после того, как компонент уже отрендерен. Чтобы сделать это в re-frame
ты должен использовать reagent
"s create-class
как это
(defn my-row [input-id]
(reagent/create-class
{:component-did-mount
#(.focus (.getElementById js/document input-id))
:reagent-render
(fn [input-id]
[:div.form-group
[:input.form-control {:id input-id, :type "text"}]])}))
Вы можете попробовать поиграть с React.JS refs или reagent/dom-node
вместо использования кода взаимодействия JS в componentDidMount
функция обработчика.