iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0
自我挑戰組

30天深入淺出Redux系列 第 21

Redux 深入淺出 - [ Day 21 ] React Redux 商品功能設定 - (蛋糕)

  • 分享至 

  • xImage
  •  

前篇我們已經完成咖啡與咖啡豆兩樣商品的搬遷,今天我們將蛋糕的部分也移植過來我們 React 的專案裡面,也順便加深使用的印象。

還記得怎麼處理嗎?

Start from slice

沒錯,就是從 slice 開始,分類分得好,搬檔案就改得少,一樣我們於相同的路徑下新增一樣的slice,如下:

// src/features/slices/cakeSlice.js
import { createSlice } from "@reduxjs/toolkit";

const initialState = {
  numOfCake: 20
}

const cakeSlice = createSlice({
  name: 'cake',
  initialState,
  reducers: {
    cakeOrdered: (state, action) => {
      state.numOfCake = state.numOfCake - parseInt(action.payload.qty)
      return state;
    },
    cakeRestocked: (state, action) => {
      state.numOfCake = state.numOfCake + parseInt(action.payload.qty)
      return state;
    },
  }
})

// 方便辨識的處理
export const selectCake = (state) => state.cake;

export const { cakeOrdered, cakeRestocked } = cakeSlice.actions

export default cakeSlice.reducer

一樣不要忘記要回 store 做調整:

// src/features/store.js
import { configureStore } from '@reduxjs/toolkit'
import cakeSlice from './slices/cakeSlice'
import coffeeBeanSlice from './slices/coffeeBeanSlice'
import coffeeSlice from './slices/coffeeSlice'

const store = configureStore({
  reducer: {
    coffee: coffeeSlice,
    coffeeBean: coffeeBeanSlice,
    cake: cakeSlice,
  }
})

export default store

基本上功能搬遷就已經完成了。

https://c.tenor.com/Y6LR3vpRyAUAAAAC/%E5%B0%B1%E6%98%AF%E9%80%99%E9%BA%BC%E7%B0%A1%E5%96%AE-%E7%8E%8B%E4%B8%96%E5%A0%85.gif

再來我們來處理畫面的 component,其實你會發現結構上都是一樣的,那麼何不用複製貼上的被動技能完成再做調整勒,這時候你就會發現有做檔案拆分的好處了吧!拆分有拆分的好處喔~

我們移動到 components 的資料夾下新增一個 CakeBlock.jsx 的檔案開始以下表演:

// src/components/CakeBlock.jsx
import React, { useRef } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import { cakeOrdered, cakeRestocked, selectCake } from '../features/slices/cakeSlice'

const CakeBlock = () => {
  const cake = useSelector(selectCake)
  const dispatch = useDispatch()
  // 購買
  const cakeOrderQtyRef = useRef(null)
  const cakeOrderMoneyRef = useRef(null)
  // 進貨
  const cakeRestockQtyRef = useRef(null)
  const cakeRestockMoneyRef = useRef(null)
  // 購買送出
  const doOrderCake = () => {
    const sendData = {
      qty: cakeOrderQtyRef.current.value,
      money: cakeOrderMoneyRef.current.value
    }
    dispatch(cakeOrdered(sendData))
  }
  // 進貨送出
  const doRestockCake = () => {

    const sendData = {
      qty: cakeRestockQtyRef.current.value,
      money: cakeRestockMoneyRef.current.value
    }
    dispatch(cakeRestocked(sendData))
  }

  return (
    <div>
      <h4>蛋糕存量 {cake.numOfCake}</h4>
      <fieldset>
        <legend>蛋糕購買</legend>
        <div>
          <label htmlFor="cakeOrderQty">數量</label>
          <input id="cakeOrderQty" type="number" ref={cakeOrderQtyRef} />
        </div>
        <div>
          <label htmlFor="cakeOrderMoney">價錢</label>
          <input id="cakeOrderMoney" type="number" ref={cakeOrderMoneyRef} />
        </div>
        <button onClick={doOrderCake}>
          購買
        </button>
      </fieldset>
      <fieldset>
        <legend>蛋糕進貨</legend>
        <div>
          <label htmlFor="cakeRestockQty">數量</label>
          <input id="cakeRestockQty" type="number" ref={cakeRestockQtyRef} />
        </div>
        <div>
          <label htmlFor="cakeRestockMoney">價錢</label>
          <input id="cakeRestockMoney" type="number" ref={cakeRestockMoneyRef} />
        </div>
        <button onClick={doRestockCake}>
          進貨
        </button>
      </fieldset>
    </div>
  )
}

export default CakeBlock

完成後,一樣於 App 內引入剛才的 component,如下:

// src/App.jsx
import CakeBlock from "./components/CakeBlock"
import CoffeeBeanBlock from "./components/CoffeeBeanBlock"
import CoffeeBlock from "./components/CoffeeBlock"

function App() {

  return (
    <div className="container">
      <h1>Restaurant Record</h1>
      <CoffeeBlock/>
      <CoffeeBeanBlock/>
      <CakeBlock/>
    </div>
  )
}

export default App

此時,你的畫面應該會多出蛋糕購買、蛋糕進貨兩個區塊,並可以看到蛋糕的庫存會因為你的操作而有增減。

恭喜你又完成了蛋糕商品的功能,以此類推,你應該可以按照相同的步驟去創造出更多不同的商品,透過兩次的練習,應該已經處於駕輕就熟的階段了吧!

下一篇我們將資金的部分也搬遷進來。


上一篇
Redux 深入淺出 - [ Day 20 ] React Redux 商品功能設定-(咖啡&咖啡豆)
下一篇
Redux 深入淺出 - [ Day 22 ] React Redux 資金功能設定
系列文
30天深入淺出Redux31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言