Review the React Hook(useReducer)
1: The basic way is similar like useState and basic Redux method which return the updated value.
const countReducer = (state, newState) => newState
function Counter({initialCount = 0, step = 1}) {
const [count, setCount] = React.useReducer(countReducer, initialCount)
const increment = () => setCount(count + step)
return <button onClick={increment}>{count}</button>
}
2: Accept the step as the action
const countReducer = (count, change) => count + change
function Counter({initialCount = 0, step = 1}) {
const [count, changeCount] = React.useReducer(countReducer, initialCount)
const increment = () => changeCount(step)
return <button onClick={increment}>{count}</button>
}
3: Simulate setState with an object
const countReducer = (state, action) => ({...state, ...action})
function Counter({initialCount = 0, step = 1}) {
const [state, setState] = React.useReducer(countReducer, {
count: initialCount,
})
const {count} = state
const increment = () => setState({count: count + step})
return <button onClick={increment}>{count}</button>
}
3: Simulate setState with an object OR function
const countReducer = (state, action) => ({
...state,
...(typeof action === 'function' ? action(state) : action),
})
function Counter({initialCount = 0, step = 1}) {
const [state, setState] = React.useReducer(countReducer, {
count: initialCount,
})
const {count} = state
const increment = () =>
setState(currentState => ({count: currentState.count + step}))
return <button onClick={increment}>{count}</button>
}
4: Traditional dispatch object with a type and switch statement like Redux
function countReducer(state, action) {
const {type, step} = action
switch (type) {
case 'increment': {
return {
...state,
count: state.count + step,
}
}
default: {
throw new Error(`Unsupported action type: ${action.type}`)
}
}
}
function Counter({initialCount = 0, step = 1}) {
const [state, dispatch] = React.useReducer(countReducer, {
count: initialCount,
})
const {count} = state
const increment = () => dispatch({type: 'increment', step})
return <button onClick={increment}>{count}</button>
}