
컴포넌트 업데이트 로직을 컴포넌트 바깥으로 빼낼수 있다는것 !
더 있겟지만 Redux 를 더 배우고 나서 다시 작성해야 겠다...
😅
import React, { useReducer } from "react"
function reducer(state, action) {
  //action type에 따라 작업 수행
  switch (action.type) {
    case "INCREMENT":
      return { value: state.value + 1 }
    case "DECREMENT":
      return { value: state.value - 1 }
    default:
      //기존 상태 값 반환
      return state
  }
}
const Counter = () => {
  const [state, dispatch] = useReducer(reducer, { value: 0 })
  return (
    <div>
      <p>
        The counter is <strong>{state.value}</strong>
      </p>
      <button onClick={() => dispatch({ type: "INCREMENT" })}> +1 </button>
      <button onClick={() => dispatch({ type: "DECREMENT" })}> -1 </button>
    </div>
  )
}
export default Counter
해설: reducer로 state과 action을 지정한다.
switch case로 action type (실행할 액션을 저장한다)
증가, 하락 ,기본값
간단한 info 예시:

import React, { useReducer } from "react"
import useInputs from "../hooks/useInput"
function reducer(state, action) {
  return {
    ...state,
    [action.name]: action.value,
  }
}
const Info = () => {
  
const [state, dispatch] = useReducer(reducer, { name: "", nickname: "" })
  const { name, nickname } = state
  const onChange = (e) => {
     dispatch(e.target)
  }
  return (
    <div>
      <div>
        <input name="name" value={name} onChange={onChange} placeholder="Name" />
        <input name="nickname" value={nickname} onChange={onChange} placeholder="Nickname" />
      </div>
      <div>
        <li>
          <strong>name:</strong>
          {name}
        </li>
        <li>
          <strong>nickname:</strong>
          {nickname}
        </li>
      </div>
    </div>
  )
}
export default Info
해설: reducer로 state과 action을 지정한다.
현재의 상태를 가져온다 , 값이 두개 (name,nickname)이기 때문에 spread ... 을 사용하여 가져온다.
각 input에 값을 저장해야 하니까 [action.name]:action.value 를 작성한다.
=> 이건 [e.target.name]:e.target.value 랑 같은 개념