嗨大家好我是 Chris,今天我們今天將在 blog 內建置好 Redux 架構。
這篇文章寫得有點亂,為了在我改好之前先撐撐場面,你可以在這裡搭配我寫好的架構一起看(不要複製貼上喔,手打最有記憶點:P)
首先從一般資料流轉為 redux 需要做的是:思考資料架構
整份專案我們在使用的資料有以下幾個
那首先我們需要創造一個假資料庫,用來存放所有的這些資料,其實這個不管有沒有用 Redux 都需要做啦,只是這次我沒辦法抓好節奏,找不到時間好好說。
我們在 src/ 建立 data 資料夾和 data.js 以後如果把專案做大,就可以專門用來 call database 惹:
const data = {
  article: […],
  skill: […],
  Notes: […],
  experience: […],
};
export default data;
裡面那些資料架構就跟之前用的一樣,直接拿過來就好,為了不浪費版面我就全部移開了: P。
建置好之後,我們來做最重要的事
npm i react-redux
npm i redux
沒有錯啦,就是裝載 package 差點忘記哈哈哈。
裝載完成後,接著把所有跟資料流有關係的用 Redux 的架構取代
這邊提醒一件事情,在專案基本定型之前,一定就要決定好資料架構,不然到時候改起來超麻煩的,這次是我太疏忽了,沒想到改這些這麼麻煩QQ。
首先讀取資料是一定要的(我們好像也只有這一個)
再來就是按照需要實作的功能分別設計各組 action 和 reducer,來達成關注點分離的目的,讓不同邏輯和取用的方法都分開,不過因為這次情況特殊(太趕了ㄚㄚㄚ),就讓我全部寫在一起吧QQ。
所以我們會需要創建4個資料夾,reduex、store、action、reducer,架構會像這樣:
/src-----------/redux-------/store
                  |---------/action
                  |---------/reducer
首先是 action ,action 決定了我們如何傳輸資料的型態,我們需要設置一組 index.js 和 Note_Action.js
// 	redux/action/index.js
export * from "./Note_Action"
// 	redux/action/noteActions.js
import Constants from "../Constants";
const noteActions = {
  GET_NOTE,
  PUT_NOTE,
};
function GET_NOTE() {
  return { type: Constants.GET_NOTE };
}
function PUT_NOTE(article) {
  return {
    type: Constants.PUT_NOTE,
    note: article,
  };
}
export default noteActions;
我們先暫時性的預設兩個 Action type :GET 和 PUT
Type 決定我們 dispatch 時會傳送到哪個 reducer,note 則是我們的 payload 也就是傳輸過去的資料,前一篇應該也說了除了 type 以外的 state 都可以由我們自己決定。
另外這邊可以看到,我的 type 已經使用常數包起來了,我們在 src/redux/ 底下創建一個 Constants.js 用來定義我們的常數:
// 	redux/Constants.js
export const Constants = {
    GET_NOTE: "GET_NOTE",
    PUT_NOTE: "PUT_NOTE",
};
接下來換我們的 reducer,上一篇說過 reducer 的 initstate 決定了 redux 的 state tree,所以在創建 redux 時需要把我們所有需要用到的資料都留好位置:
// 	redux/reducer/index.js
import { combineReducers } from 'redux';
import Note from './Note_reducer'
const rootReducer = combineReducers({
    Note
  });
  export default rootReducer;
// 	redux/reducer/Note_reducer.js
import {Constants} from '../Constants'
const initialState = {
  Notes: [],
  article:[],
  experience: [],
  skill: [],
};
export default function Note(state = initialState, action) {
  switch (action.type) {
    case Constants.GET_NOTE:
      return {
        // get data from your db
      };
    case Constants.PUT_NOTE:
      return {
        // update Notes
      };
    default:
      return state;
  }
}
功能明天補上嗚嗚
最後剩下 store,他將整合整個 redux 系統,像這樣:
//  redux/store/index.js
import {createStore} from "redux";
import rootReducer from "../reducer/index";
const store = createStore(rootReducer);
export default store;
最後,我們像昨天的範例一樣,再 index.js 用 provider 包裹整份專案:
//  index.js
import React from "react";
import ReactDOM from "react-dom";
import { Provider } from "react-redux";
import { BrowserRouter as Router } from "react-router-dom";
import "./index.css";
import App from "./App";
import store from "./redux/Store";
ReactDOM.render(
  <React.StrictMode>
    <Provider store={store}>
      <Router>
        <App />
      </Router>
    </Provider>
  </React.StrictMode>,
  document.getElementById("root")
);
最後我們來試試看有沒有成功吧,在 app.js 裡使用 getState 讀取資料看看:
//  以上省略
import store from "./redux/Store/index"
export default function App() {
  
  console.log(store.getState())
  return (
//  以下省略
  );
}
讓我們來看看 console 吧:

這邊可以看到我們整份文件的架構,就代表我們已經把 redux 實裝在 blog 裡面了,明天我們將會把所有功能移植到 redux 內,讓資料能夠被控制,明天見!