iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0
自我挑戰組

30天深入淺出Redux系列 第 3

Redux 深入淺出 - [ Day 3 ] Action & Action creator

  • 分享至 

  • xImage
  •  

接續上一篇的內容,我們已經釐清我們想做的功能,我們就用咖啡廳的例子往下開發吧。

我們先預想一下我們的咖啡廳要賣些什麼東西,可能有咖啡品項、咖啡豆、蛋糕,那麼我們先粗略的設計一個庫存的標準,皆為20份好了,以物件的方式記錄一下initialState:

{
	numOfCoffee: 20,
	numOfCoffeeBean: 20,
	numOfCake: 20,
}

Actions

那麼以顧客的角度來說他就有三種可能,可能買咖啡、可能買咖啡豆、也可能買蛋糕,我們先不複雜處理同時買多項的概念,在 Redux 的基本觀念裡有提到過 Actions 那麼對應處理的部分就是要先想好客戶能夠享有的購買方案,如果單買一項 ( ex: 單買咖啡 → { type: ‘COFFEE_ORDER’, payload: … } )。

// 用 function 的方式retrun
const orderCoffee = () => {
  return {
    type: COFFEE_ORDERED,
    payload: 1
  }
}
// 一般的 action object
const orderCoffeeObj = {
  type: COFFEE_ORDERED,
  payload: 1
}

Reducers

前面的文章有提到對應 Reducer 的部分就是店員部分的工作了,以上面為例的話接續撰寫的範例如下:

const reducer = (state = initialState, action) => {
	switch(action.type) {
		case 'COFFEE_ORDER':
			return {
				...state,
				numOfCoffee: state.numOfCoffee - 1
			}
	}
}

好的,以上為基本觀念的複習,如果到這裡都很清楚的話那麼稍微提一下目前Redux會發生的樣子:

https://ithelp.ithome.com.tw/upload/images/20220905/20129020u1hiVjEPRD.png

要完成 Redux 的 state change 就必須透過 dispatch function 去處理。
那我們先來試做Action:

// 在index.js
// 這邊其實都可以拆出去,但因為方便Demo,所以先不演示
const COFFEE_ORDERED = 'COFFEE_ORDERED';
// 建立Action
const orderCoffee = () => {
  return {
    type: COFFEE_ORDERED,
    payload: 1
  }
}
// 除上述function的方法以外也可以直接帶入object
const orderCoffeeObj = {
  type: COFFEE_ORDERED,
  payload: 1
}
// 但是我個人是不推薦這樣的做法,透過function還可以帶參數來設定,如下
const orderCoffeeByNum = (num) => {
  return {
    type: COFFEE_ORDERED,
    payload: num
  }
}

上面就是基本針對買咖啡這個動作的試做,基本上 action 的 type 就像是餐廳點餐時的點餐單,定義好單號再去找對應的出餐口店員處理。

那麼今天的內容就到這裡,下一篇我們來實際實作 reducer 的部分。


上一篇
Redux 深入淺出 - [ Day 2 ] Project setup
下一篇
Redux 深入淺出 - [ Day 4 ] Reducer & Store
系列文
30天深入淺出Redux31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言