iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0
Modern Web

以 React 為主的那些前端事系列 第 15

Day 15 - 用 useReducer 取代 useState !?

  • 分享至 

  • xImage
  •  

如果有錯誤,歡迎留言指教~ Q_Q

上篇提到,如何取得更新後的 state

useReduceruseState 都是拿來管理 state 的 hook

一樣都可以做到儲存和變更 state 的功能,如下:

使用 useState

import { useState } from "react";

export default function App() {
  const [count, setCount] = useState(0);
  
  const handleIncrease = () => {
    setCount((prev) => prev + 1);
  };

  const handleDecrease = () => {
    setCount((prev) => prev - 1);
  };
  
  return (
    <div className="App">
      <button onClick={handleIncrease}>+</button>
      <h1>{count}</h1>
      <button onClick={handleDecrease}>-</button>
    </div>
  );
}

codeSandBox


使用 useReducer

import { useReducer } from "react";

const ACTIONS = {
  INCREMENT: "Increament",
  DECREMENT: "Decreament"
};

const reducer = (state, action) => {
  switch (action.type) {
    case ACTIONS.INCREMENT:
      return { count: state.count + 1 };
    case ACTIONS.DECREMENT:
      return { count: state.count - 1 };
    default:
      throw new Error();
  }
};

const initialState = { count: 0 };

export default function App() {
  const [state, dispatch] = useReducer(reducer, initialState);

  const handleIncreament = () => {
    dispatch({ type: ACTIONS.INCREMENT });
  };

  const handleDecreament = () => {
    dispatch({ type: ACTIONS.DECREMENT });
  };

  return (
    <div className="App">
      <button onClick={handleIncreament}>+</button>
      <h1>{state.count}</h1>
      <button onClick={handleDecreament}>-</button>
    </div>
  );
}


codeSandBox


useReducer 是進階版的 useState

但當 state 的邏輯和值複雜起來時,或是 state 依賴另一個 state 時

這時候 useReducer 會比 useState 更適合使用

更新 state 不依賴 useEffect,傳遞 dispatch 並不會在重新 render 時改變。

useReducer 和 Redux 之間的關係?

啊 他們看起來很像餒? 下篇再續~ XD


ref

  1. https://zh-hant.reactjs.org/docs/hooks-reference.html#usereducer
  2. https://zh-hant.reactjs.org/docs/hooks-faq.html

上一篇
Day 14 - useContext
下一篇
Day 16 - 用 useReducer 取代 Redux !?
系列文
以 React 為主的那些前端事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Wen Ning
iT邦新手 4 級 ‧ 2021-10-01 23:04:20

Day 15 - 用 useReducer 取代 usState !?

標題的 useState 少了 e XD

雪倫Q iT邦新手 5 級 ‧ 2021-10-02 01:38:14 檢舉

謝謝眼尖你的(Y)

我要留言

立即登入留言