第一手尝试 React Hook 的 useReducer:
import React, {useState,useEffect,useReducer} from 'react'; import ReactDOM from 'react-dom'; let histories = []; const initialState = { counter: 10 } const reducer = function(state,action){ switch(action.type){ case('INCREMENT'): return {...state, counter: state.counter + 1}; case('DECREMENT'): return {...state, counter: state.counter - 1}; default: throw new Error(); } } const App = function(props){ let _style = { textAlign: 'center', margin: '100px', fontSize: '50px', lineHeight: '100px' } const [state,dispatch] = useReducer(reducer,initialState); useEffect(() => { histories.push(state.counter); console.log(histories); },[state.counter]); return ( <> <div style={_style}> {state.counter} <br /> <button onClick={() => {dispatch({type:'INCREMENT'})}}>Increment</button> <button>Just Kidding</button> <button onClick={() => {dispatch({type:'DECREMENT'})}}>Decrement</button> </div> </> ) } ReactDOM.render( <App /> , document.getElementById('root') );
Output:
[10] main.js:24870 (2) [10, 11] main.js:24870 (3) [10, 11, 12] main.js:24870 (4) [10, 11, 12, 13] main.js:24870 (5) [10, 11, 12, 13, 14] main.js:24870 (6) [10, 11, 12, 13, 14, 15] main.js:24870 (7) [10, 11, 12, 13, 14, 15, 16] main.js:24870 (8) [10, 11, 12, 13, 14, 15, 16, 15] main.js:24870 (9) [10, 11, 12, 13, 14, 15, 16, 15, 14] main.js:24870 (10) [10, 11, 12, 13, 14, 15, 16, 15, 14, 13] main.js:24870 (11) [10, 11, 12, 13, 14, 15, 16, 15, 14, 13, 12] main.js:24870 (12) [10, 11, 12, 13, 14, 15, 16, 15, 14, 13, 12, 11] main.js:24870 (13) [10, 11, 12, 13, 14, 15, 16, 15, 14, 13, 12, 11, 10] main.js:24870 (14) [10, 11, 12, 13, 14, 15, 16, 15, 14, 13, 12, 11, 10, 11] main.js:24870 (15) [10, 11, 12, 13, 14, 15, 16, 15, 14, 13, 12, 11, 10, 11, 12]