Запись перекадровых событий, которые не меняют app-db

Есть определенные события, которые не приводят к app-db меняется. Они меняют только дом, например: инициализируют пользовательскую прокрутку, получают выделенный текст и т. Д. Как мне обращаться с ними в перекадре, так как обработчик событий требует вернуть новый app-db? Я обхожусь, возвращая существующую базу данных, но это не кажется правильным. Есть ли лучший способ сделать это? Некоторые из моих обработчиков выглядят так:

 (re-frame/reg-event-db
    :init-link-viewer
    (fn [db [_ highlights]]
      (utils/load-highlights highlights)
      (utils/init-selection)
      db))

1 ответ

Решение

Вы можете использовать reg-event-fx функция для регистрации обработчика эффекта, который возвращает карту эффектов (в отличие от reg-event-db который только возвращает db). Ваша карта эффектов может быть пустой и не должна возвращать db, Смотрите Эффекты для получения дополнительной информации об этом.

Вы можете переписать ваше событие как:

(reg-event-fx
  :init-link-viewer
  (fn [db [_ highlights]]
    (utils/load-highlights highlights)
    (utils/init-selection)
    {}))

Однако вы можете пойти дальше и вернуть свои побочные эффекты в виде данных. Это означает, что ваши обработчики событий легко тестируются и отделяют событие от его побочных эффектов. Это будет означать, что вам нужно также написать и зарегистрировать обработчики эффектов. Это может выглядеть примерно так:

(reg-event-fx
  :init-link-viewer
  (fn [db [_ highlights]]
    {:load-highlights highlights
     :init-selection true}))
Другие вопросы по тегам