---
# System prepended metadata

title: React useReducer

---

<style>
.description{
letter-spacing : 2px;
line-height : 28px;
text-align : justify;
}

.firstLine{
margin-left : 30px;
}

b{
font-weight : 700;
}
</style>

# React useReducer

[影片](https://www.youtube.com/watch?v=1Pks5cmfr4A)

<div class="description">
useReducer和useState類似，都是用來改變State的Hook，但要是State數量變多的話會變得難以管理，而useReducer能讓我們方便管理數個State。<br><br>

useReducer會給予我們兩個值，一個是State，用於管理所有State用，一個是dispatch，透過dispatch我們能直接更改State。
</div>


```javascript=
import { useReducer } from "react";

function App() {
  const [state, dispatch] = useReducer(reducer, {
    name: "",
    age: 0,
  });
  const clickHandler = () => {
    dispatch({ type: "SET_NAME" , name : "weiwei" });
  };

  return (
    <>
      {state.name} // output: start : "" 
      <button onClick={clickHandler}>Click</button>
    </>
  );
}

export default App;
```

<div class="description">
但在使用useReducer前，我們必須先定義自己的Reducer Function，先透過以下範例來看如何定義Reducer。
reducer所包含的參數有<b>state</b>和<b>action</b>。
</div>

reducer : state

:   state為我們使用useReducer時，初定義的state，由以上程式碼來看的話，我們的初定義的state是，<b>name和age</b>，所以我們可以利用參數state來去訪問我們的state內容。

reducer : action

:   action較常用的就是接收外部資料，<b>如果想透過外部資料來改變state時可以用action來取得資料</b>，同時在定義時也常用action.type來去取得dispatch的type為何，然後用switch case來去做後續更改state的動作。


```javascript=
const reducer = (state, action) => {
  switch (action.type) {
    case "SET_NAME":
      return {
        name : action.name,
        age : 0
      };
    default:
      return state;
  }
};
```

<div class="description">
定義好reducer function後，就可以直接來使用啦！
</div>

```javascript=
import { useReducer } from "react";

const reducer = (state, action) => {
  //console.log(action) output : {type : "SET_NAME" , name : "weiwei"}
  switch (action.type) {
    case "SET_NAME":
      return {
        //這邊可以選擇利用其餘參數 ...state 來把age帶入 因為不會動到age
        name : action.name,
        age : 0
      };
    default:
      return state;
  }
};

function App() {
  const [state, dispatch] = useReducer(reducer, {
    name: "",
    age: 0,
  });
  const clickHandler = () => {
    dispatch({ type: "SET_NAME" , name : "weiwei" });
  };

  return (
    <>
      {state.name} // output: start : "" | after click : weiwei
      <button onClick={clickHandler}>Click</button>
    </>
  );
}

export default App;
```