I'm using withReducer HOC and noticed this behaviour: Calling this on click handler for example:
import React from 'react'
import { withReducer } from 'recompose'
import { compose } from 'ramda'
export default compose(
withReducer('state', 'dispatch', (state, { value }) => {
console.log(value)
return { ...state, value }
}, { value: 'zero' })
)((props) => {
const { dispatch, state } = props,
onClick = () => {
console.log('Hello')
dispatch({ value: 'one' })
dispatch({ value: 'two' })
dispatch({ value: 'three' })
console.log('World')
}
return (
<div>
<div>{state.value}</div>
<button onClick={onClick}>Click me</button>
</div>
)
})
It will produce
Hello
World
one
two
three
This means that reduce function is called asynchronously. What is justification for calling it async rather than applying changes to store right away?
In this case, dispatch is actually a wrapper for the vanilla API method
setState.React implements
setStateasynchronously because state transitions are sometimes batched together for performance reasons.According to the React docs: