iT邦幫忙

2022 iThome 鐵人賽

DAY 7
0
自我挑戰組

30天深入淺出Redux系列 第 7

Redux 深入淺出 - [ Day 7 ] 範例商品 - 咖啡豆

  • 分享至 

  • xImage
  •  

前一篇我們完成了咖啡的進貨功能,今天我們來延伸咖啡豆商品的部分,我們一樣先不複雜購買動作的複雜性,讓我們再走一次流程加深印象。

首先,先定義出 action types,於 types.js 檔案內新增如以下:

// ...省略之前的部分
const COFFEEBEAN_ORDERED = 'COFFEEBEAN_ORDERED';
const COFFEEBEAN_RESTOCKED = 'COFFEEBEAN_RESTOCKED';

module.exports = {
  // ...省略段落
  COFFEEBEAN_ORDERED,
  COFFEEBEAN_RESTOCKED
};

這邊將 action type 單獨拆分開來也是有原因的,試想如果當專案的複雜度增加的同時,管理這些變數就會是很棘手的問題,所以這裡才會用這樣的方式分離出來,暸解原由之後接著我們來處理訂單的部分,於 order.js 內新增關於咖啡豆購買的 function:

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

module.exports = {
  // ...省略段落
  orderCoffeeBean
}

簡單講解一下這邊的邏輯,由外部帶入數量與金錢作為 function 的參數,再透過數量與金錢的值由 reducer 來做二次的處理,所以才會成以上的樣子,相同的原理,咖啡豆也有補貨的部分,所以我們一樣要到 restock.js 內新增關於補咖啡豆商品的 function:

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

module.exports = {
  // ...省略段落
  restockCoffeeBean
}

再來我們要處理 reducer 的部分,針對我們新增的兩個動作去指定 switch case,所以我們於 orderReducer.js 檔案內作下列處理:

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

以上就算是完成咖啡豆部分的功能了,讓我們回到 ./index.js 下使用看看剛剛完成的動作吧!

// ...省略段落
// 讓我們來試看看買咖啡豆
store.dispatch(orderCoffeeBean(3, 15))
// 測試補咖啡豆
store.dispatch(restockCoffeeBean(10, 10))

unsubscribe()

這時我們再測試一次 index.js 應該會得到以下結果:

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 }
}

如果有一樣的結果的話,那麼恭喜你完成了咖啡豆部分的功能了,下一篇我們來處理蛋糕部分的功能,我相信有三次的練習應該會很熟悉 redux 的基本運作了吧!


上一篇
Redux 深入淺出 - [ Day 6 ] 範例功能擴充
下一篇
Redux 深入淺出 - [ Day 8 ] 範例商品 - 蛋糕
系列文
30天深入淺出Redux31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言