Store enhancer for redux which support accurately subscribe.
npm i --save redux-on
import { createStore, applyMiddleware, compose } from 'redux'
import accuratelySubscribe from 'redux-on'
const enhancer = compose(
applyMiddleware(...middleware),
accuratelySubscribe()
)
const store = createStore(reducer, initialState, enhancer)
// example
const off = store.on((prevState, state) => {
return prevState.user !== state.user
}, (prevState, state) => {
alert(`Hi, ${state.user.name}, welcome!`)
})
Adds a change handler. It will be called any time an action with specified type dispatched or successful predication.
type
(String): The type of action.predicate
(Function): The logic of predication. It will be called with two parameters:prevState
,state
. Need to returns a boolean value.handler
(Function): The change handler. It will be called with two parameters:prevState
,state
.once
(Boolean): Whether to handle change only once. Defaultfalse
.
(Function): A function that drop the change handler.
// listen customer change by action type.
const off = store.on('CUSTOMER', (prevState, state) => {
alert(`Hi, ${state.customer.name}! welcome to the bar.`)
})
// listen customer change by predication.
const off1 = store.on(
(prevState, state) => prevState.customer !== state.customer,
(prevState, state) => alert(`Hi, ${state.customer.name}! welcome to the bar.`)
)
// listen customer change by action type and predication.
const off2 = store.on(
'CUSTOMER',
(prevState, state) => state.customer.age < 18,
(prevState, state) => alert(`Hey, boy! Can't drink!`)
)
// cancel listen
off()
Adds a change handler. It will be called only once an action with specified type dispatched or successful predication.
type
(String): The type of action.predicate
(Function): The logic of predication. It will be called with two parameters:prevState
,state
. Need to returns a boolean value.handler
(Function): The change handler. It will be called with two parameters:prevState
,state
.
(Function): A function that drop the change handler.
store.once('CUSTOMER', (prevState, state) => {
alert(`Hey, you are the first customer, free drinking tonight!`)
})
// or
store.once(
(prevState, state) => !prevState.customer && state.customer,
(prevState, state) => alert(`Hey, you are the first customer, free drinking tonight!`)
)
MIT