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

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

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

person Chin365    schedule 19.10.2016    source источник
comment
Я думаю, вы могли бы посмотреть на github.com/Day8/re- кадр/клякса/   -  person Michiel Borkent    schedule 19.10.2016
comment
Спасибо. Это было полезно. Я должен был посмотреть его, прежде чем публиковать вопрос.   -  person Chin365    schedule 19.10.2016


Ответы (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}))
person Daniel Compton    schedule 19.10.2016
comment
Если я возвращаю данные из обработчика, могу ли я убедиться, что сначала вызывается load-highlights, а затем init-selection? Я знаю, что обработчики событий не обеспечивают какой-либо порядок эффектов. - person Chin365; 20.10.2016
comment
Ваше второе предложение отвечает вашему первому :) Вам нужно будет сделать это с помощью обратных вызовов или какого-либо другого механизма. - person Daniel Compton; 20.10.2016
comment
Я думаю, что db в приведенных выше функциях reg-event-fx должно быть cofx, но все работает так, как описано, потому что он не используется. - person Phil Cooper; 29.06.2021