Question: Is there a difference between these two useReducer
s in the following codesandbox?
https://codesandbox.io/s/frosty-dubinsky-no5rf?file=/src/App.js
import React, { useReducer } from "react"; export default function App() { const [state1, dispatch1] = useReducer(reducer1, 0); const [state2, dispatch2] = useReducer(reducer2, 0); return ( <div className="App"> <div>1: {`${state1}`}</div> <div>2: {`${state2}`}</div> <button onClick={() => { dispatch1(1); dispatch2(state2 + 1); }} > Click </button> </div> ); } function reducer1(state, action) { return state + action; } function reducer2(state, action) { return action; }
Answer: yes. By using the state that is automatically passed in, reducer1
is safe to be called multiple times because it always gets the most up-to-date state.
reducer2
is not safe to call multiple times because it looks at stale state when it’s called subsequent times. Here's an example of where it breaks:
https://codesandbox.io/s/bitter-currying-bsx6g?file=/src/App.js
//answer: run this code import React, { useReducer } from "react"; export default function App() { const [state1, dispatch1] = useReducer(reducer1, 0); const [state2, dispatch2] = useReducer(reducer2, 0); return ( <div className="App"> <div>1: {`${state1}`}</div> <div>2: {`${state2}`}</div> <button onClick={() => { dispatch1(1); dispatch1(1); dispatch2(state2 + 1); dispatch2(state2 + 1); }} > Click </button> </div> ); } function reducer1(state, action) { return state + action; } function reducer2(state, action) { return action; }
Top comments (0)