iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 18
0
自我挑戰組

react.js 的學習筆記 (沒在用硬要學系列 第 18

day 18 知道useState之後還要知道useReducer

  • 分享至 

  • xImage
  •  

這章要講的是useReducer,他是useState進階的語法,專門來處理複雜邏輯。

useReducer

import React, {useReducer} from 'react'


function reducer(state, action) {
  switch (action.type) {
    case 'noadd':
      return {count: state.count - 1};
    case 'add':
      return {count: state.count + 1};
    default:
      throw new Error();
  }
}

export default function Counter() {
  const [state, opnum] = useReducer(reducer, {count: 0});
  return (
    <>
      Count: {state.count}
      <button onClick={() => opnum({type: 'noadd'})}>-</button>
      <button onClick={() => opnum({type: 'add'})}>+</button>
    </>
  );
}

如上方範例

https://ithelp.ithome.com.tw/upload/images/20200918/20110292sDOwWRlbX3.png

另外補充

  return (
    <>
        ....
    </>
  );

這樣輸出一樣不會顯示最外層

改寫一下 加入重製按鈕

import React, {useReducer} from 'react'


const oldcount = {count: 0};


function reducer(state, action) {
  switch (action.type) {
    case 'noadd':
        return {count: state.count - 1};
    case 'add':
        return {count: state.count + 1};
    case 'rere':
        return oldcount;   
    default:
        throw new Error();
  }
}


export default function Counter() {
  const [state, opnum] = useReducer(reducer, oldcount);
  return (
    <>
      Count: {state.count}
      <button onClick={() => opnum({type: 'noadd'})}>-</button>
      <button onClick={() => opnum({type: 'add'})}>+</button>
      <button onClick={() => opnum({type: 'rere'})}>reset</button>
    </>
  );
}

https://ithelp.ithome.com.tw/upload/images/20200918/20110292ULUJ7Tm4Sx.png


上一篇
day 17 自訂Hooks 打造自己的Hook
下一篇
day 19 Hook中的props(useContext
系列文
react.js 的學習筆記 (沒在用硬要學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言