<div id="root"></div>
// stateの初期値
const initialState = { count: 0 };

// actionの定義
const COUNT_INCREMENT = "count/increment";
const COUNT_DECREMENT = "count/decrement";
const COUNT_RESET = "count/reset";

// reducerの定義
const reducerFunc = (state, action) => {
  switch (action) {
    case COUNT_INCREMENT:
      return { ...state, count: state.count + 1 };
    case COUNT_DECREMENT:
      return { ...state, count: state.count - 1 };
    case COUNT_RESET:
      return initialState;
    default:
      return state;
  }
};
const Counter = () => {
  const [state, dispatch] = React.useReducer(reducerFunc, initialState);
  
  return (
    <>
      <p>{state.count}</p>
      <button onClick={() => dispatch(COUNT_INCREMENT)}>increment</button>
      <button onClick={() => dispatch(COUNT_DECREMENT)}>decrement</button>
      <button onClick={() => dispatch(COUNT_RESET)}>reset</button>
    </>
  );
};

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<Counter />);
View Compiled

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/react/18.2.0/umd/react.production.min.js
  2. https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.2.0/umd/react-dom.production.min.js