Watch/observe Redux store state changes.
Redux provides you with a subscribe()
method so that you can be notified when the state changes. However, it does not let you know what changed. redux-watch
will let you know what changed.
npm i --save redux-watch
watch(getState [, objectPath [, comparison]])
-> function
getState
: Afunction
that is used to return the state. Also useful in conjunction with selectors.objectPath
: An optionalstring
orArray
that represents the path in an object. Uses object-path (mariocasciaro/object-path) for value extraction.comparison
: An optional function to pass for comparison of the fields. Defaults to strict equal comparison (===
).
// ... other imports/requires
import watch from 'redux-watch'
// assuming you have an admin reducer / state slice
console.log(store.getState().admin.name) // 'JP'
// store is THE redux store
let w = watch(store.getState, 'admin.name')
store.subscribe(w((newVal, oldVal, objectPath) => {
console.log('%s changed from %s to %s', objectPath, oldVal, newVal)
// admin.name changed from JP to JOE
}))
// somewhere else, admin reducer handles ADMIN_UPDATE
store.dispatch({ type: 'ADMIN_UPDATE', payload: { name: 'JOE' }})
example (w/ reselect (reactjs/reselect) selectors)
When using with selectors, you often times won't need to pass the object path. Most times the selectors will handle this for you.
// ... other imports requires
import watch from 'redux-watch'
// assuming mySelector is a reselect selector defined somewhere
let w = watch(() => mySelector(store.getState()))
store.subscribe(w((newVal, oldVal) => {
console.log(newVal)
console.log(oldVal)
}))
By default, redux-watch
uses ===
(strict equal) operator to check for changes. This may not be want you want. Sometimes you may want to do a deep inspection. You should use either deep-equal (substack/node-deep-equal) or is-equal (ljharb/is-equal). is-equal
is better since it supports ES6 types like Maps/Sets.
import isEqual from 'is-equal'
import watch from 'redux-watch'
let w = watch(store.getState, 'admin', isEqual)
store.subscribe(w((newVal, oldVal, objectPath) => {
// response to changes
}))
MIT