iT邦幫忙

2022 iThome 鐵人賽

DAY 8
0
自我挑戰組

30天深入淺出Redux系列 第 8

Redux 深入淺出 - [ Day 8 ] 範例商品 - 蛋糕

  • 分享至 

  • xImage
  •  

今天要完成的功能為我們預設的第三樣商品蛋糕部分的購買與補貨,邏輯會和前一篇有點類似,目的也是讓大家熟悉一下 redux 資料更新的流程,那麼我們開始吧!

一樣我們先處理 types.js 的檔案,新增蛋糕的購買與補貨:

// ...省略段落
const CAKE_ORDERED = 'CAKE_ORDERED';
const CAKE_RESTOCKED = 'CAKE_RESTOCKED';

module.exports = {
  // ...省略段落
  CAKE_ORDERED,
  CAKE_RESTOCKED
};

這裡的處理流程和前面處理咖啡、咖啡豆的商品是一致的,如果有不懂的話可以回到前面的章節複習一下,那麼我們接著於 order.js 內處理購買蛋糕的部分,如下:

// ... 省略段落
const orderCake = (qty, income) => {
  return {
    type: CAKE_ORDERED,
    payload: {
      qty: qty,
      income: income
    }
  }
}

module.exports = {
  orderCoffee,
  orderCoffeeBean,
  orderCake
}

這裡一樣是與前面處理咖啡與咖啡豆商品相同的作法,用兩個參數去銜接處理前與數量的值,後續由 reducer 接續處理,然後是補貨的動作,於 restock.js 內新增以下:

// ...省略段落
const restockCake = (qty, pay) => {
  return {
    type: CAKE_RESTOCKED,
    payload: {
      qty: qty,
      pay: pay,
    }
  }
}

module.exports = {
  restockCoffee,
  restockCoffeeBean,
  restockCake
}

再來我們處理 reducer 的段落,針對我們剛才新增的動作來處理,於 orderReducer.js 內新增以下:

const orderReducer = (state = initialState, action) => {
  switch(action.type) {
    // ...省略case COFFEE_ORDERED....段落
    case CAKE_ORDERED:
      // 顧客買 => 商品-, 營收+ 
      return {
        ...state,
        numOfCake: state.numOfCake - action.payload.qty,
        assets: state.assets + action.payload.income
      }
    case CAKE_RESTOCKED:
      // 補貨 => 商品+, 營收-
      return {
        ...state,
        numOfCake: state.numOfCake + action.payload.qty,
        assets: state.assets - action.payload.pay
      }
    default: 
      return state;
  }
}

這裡和前面咖啡與咖啡豆商品的做法相同,利用 switch case 針對對應的 action type 做對應的處理,完成後我們於 ./index.js 內進行測試,使用剛剛定義完成的動作吧!

// ...省略段落
// 試看看買蛋糕
store.dispatch(orderCake(2, 30))
// 測試補蛋糕
store.dispatch(restockCake(5, 25))

unsubscribe()

應該會得到以下結果:

initial state {
  orderReducer: { numOfCoffee: 20, numOfCoffeeBean: 20, numOfCake: 20, assets: 1000 }
}
更新 {
  orderReducer: { numOfCoffee: 18, numOfCoffeeBean: 20, numOfCake: 20, assets: 1020 }
}
更新 {
  orderReducer: { numOfCoffee: 38, numOfCoffeeBean: 20, numOfCake: 20, assets: 1010 }
}
更新 {
  orderReducer: { numOfCoffee: 38, numOfCoffeeBean: 17, numOfCake: 20, assets: 1025 }
}
更新 {
  orderReducer: { numOfCoffee: 38, numOfCoffeeBean: 27, numOfCake: 20, assets: 1015 }
}
更新 {
  orderReducer: { numOfCoffee: 38, numOfCoffeeBean: 27, numOfCake: 18, assets: 1045 }
}
更新 {
  orderReducer: { numOfCoffee: 38, numOfCoffeeBean: 27, numOfCake: 23, assets: 1020 }
}

這時候我們回過頭來看看 reducer 的部分是不是已經很雜亂了呢?一般我們會因為要方便維護所以選擇將原本的 initial state 再次分開,讓每個檔案處理對象單一,有點類似工廠泰勒化的概念在處理你的段落,這樣可以方便後續維護。

下一篇我們來整理我們目前的 Reducer,用來模擬專案內複雜化的樣子。


上一篇
Redux 深入淺出 - [ Day 7 ] 範例商品 - 咖啡豆
下一篇
Redux 深入淺出 - [ Day 9 ] Reducer 的拆分
系列文
30天深入淺出Redux31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言