Replies: 3 comments 1 reply
-
|
The answer seems to be Correct me if I am wrong |
Beta Was this translation helpful? Give feedback.
-
|
Logging db state before and after events with an interceptor is a natural use of re-frame's interceptor mechanism. Here's a working implementation: (def db-logger
(re-frame/->interceptor
:id :db-logger
:before (fn [ctx]
(assoc ctx ::before-db (get-in ctx [:coeffects :db])))
:after (fn [ctx]
(let [before-db (::before-db ctx)
after-db (get-in ctx [:effects :db])
event (get-in ctx [:coeffects :event])]
(when (not= before-db after-db)
(js/console.group (str "Event: " (first event)))
(js/console.log "Before:" (clj->js before-db))
(js/console.log "After:" (clj->js after-db))
(js/console.log "Diff:" (clj->js (data/diff before-db after-db)))
(js/console.groupEnd))
ctx))))Register globally (applies to all events): (re-frame/reg-global-interceptor db-logger)Or per-event: (re-frame/reg-event-db
:my-event
[db-logger]
(fn [db [_ data]]
(assoc db :key data)))Using (:require [clojure.data :as data])
;; Returns [only-in-before only-in-after common]
(data/diff before-db after-db)Selective logging (only log specific events): (def db-logger
(re-frame/->interceptor
:id :db-logger
:before ...
:after (fn [ctx]
(let [event (get-in ctx [:coeffects :event])]
(when (contains? #{:event-to-log-1 :event-to-log-2}
(first event))
;; log here
)
ctx))))The |
Beta Was this translation helpful? Give feedback.
-
|
For the record, a slightly more idiomatic version of that selective logging interceptor would be: (def db-logger
(rf/->interceptor
:id :db-logger
:after
(fn [ctx]
(let [event-v (rf/get-coeffect ctx :event)]
(when (contains? #{:event-to-log-1 :event-to-log-2} (first event-v))
(let [db-before (rf/get-coeffect ctx :db)
db-after (rf/get-effect ctx :db)]
;; log here — e.g. (println event-v :before db-before :after db-after)
)))
ctx))) |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
I picture it as the first interceptor in the chain with a
:beforeand:afterfunction that prints the:dbor even the entire context map, the problem is that I want it to trigger on any event without adding the interceptor on every singlereg-event-db's seq of interceptorsBeta Was this translation helpful? Give feedback.
All reactions