設計概念與實戰
Redux
slide: https://goo.gl/K2y8ck
DMoon
創科資訊全端工程師
國立彰化師範大學 資工系畢業
中央軟工所
前端及 React 愛好者,喜好參與社群交流
近期接觸 React Native 後,開始嘗試跨平台手機應用開發
喜歡前端經常迸出令人驚艷的潮潮東西,還有豐富活躍的社群文化
dmoon.t@gmail.com
Why we need Redux ?
單頁面應用漸趨複雜
JavaScript 需要管理比以往更多的 state
資料操作同步問題
在後端我們怎麼處理的?
React
資料跟 View 的綁定
剛學 React 的時候
使用在專案上開發一陣子後
慘痛案例: props 傳遞地獄
-
React component 的 state 彼此獨立
-
欲修改父 component 的state,需透過 props 傳遞 callback func
Count : 0
What is Redux ?
Design Pattern
Dealing with data
將 state 集中管理
Predictable State container
Redux 是 JavaScript 狀態容器
提供可預測化的狀態管理
Redux
-
Single source of truth (單一資料來源)
-
State is read-only
-
Changes are made with pure functions
唯一改變 state 的方法就是觸發 action (修改資料的申請動作)
對應不同的 action,使用純函數編寫 reducer 來執行 state 修改
整個應用的 state 存在一棵 object tree 中,並且放在唯一的 container (store) 內
三大原則
Redux Flow
開發團隊的日常
PM
Engineer
Project
Product
客戶提出新需求
開規格
實際功能開發
release
Standard Operating Procedures
Redux Flow
View
( React )
Store
Action
Reducer
dispatch
畫面需要改變
=> 產生 Action
return
newState
資料變更
Server
request
PM
Engineer
Project
Product
response
Action
事件的描述
Action
const ADD_TODO = 'ADD_TODO';
// action
{
type: ADD_TODO, // required
text: 'Build my first Redux app',
}
-
JS object
-
包含事件的描述與更新 state 所需的相關資料
-
type 是必要的,表示要執行的動作
Action Creator
產生 Action 的 pure func
Action Creator
const ADD_TODO = 'ADD_TODO';
// action creator
function requestAddTodo() {
return {
type: ADD_TODO,
text: 'Build my first Redux app',
};
}
// dispatch action
dispatch(requestAddTodo());
-
pure function,返回一個 action
-
dispatch 到 reducer
Redux Flow
View
( React )
Store
Action
Reducer
dispatch
畫面需要改變
=> 產生 Action
return
newState
資料變更
Server
request
PM
Engineer
Project
Product
response
Reducers
更新 State
Reducer
function todos(state = [], action) {
switch (action.type) {
case ADD_TODO:
return [...state, {
text: action.text,
completed: false
}];
default:
return state;
}
}
store = {
todos: [{
text: 'todo1 title',
completed: false,
},{
text: 'todo2 title',
completed: true,
}],
}
-
pure function
-
return new state
Redux Flow
View
( React )
Store
Action
Reducer
dispatch
畫面需要改變
=> 產生 Action
return
newState
資料變更
Server
request
PM
Engineer
Project
Product
response
Store
存放共用 state 的容器
Store
{
todos: [
{
text: 'todo1',
completed: true,
},
],
}
-
object tree
-
Immutable
Redux Flow
View
( React )
Store
Action
Reducer
dispatch
畫面需要改變
=> 產生 Action
return
newState
資料變更
Server
request
PM
Engineer
Project
Product
response
One more thing...
Time Travelling Debugger
React-Redux
React 框架綁定
Provider
Redux Store
Connect
Connect
Component A
Component B
Smart Component
v.s
Dumb Component
容器組件 | 展示組件 | |
---|---|---|
Location | 最頂層,路由處理 | 中間和子組件 |
Aware of Redux | 是 | 否 |
讀取數據 | 從 Redux 獲取 state | 從 props 獲取數據 |
修改數據 | 向 Redux 派發 actions | 從 props 調用回調函數 |
Smart
Dumb
Redux Ecosystem
Dan Abramov
gaearon
可以 dispatch thunk function
紀錄所有 Redux action 和下一次 state 的 log
Dan Abramov
Redux Tools
可以 dispatch promise
Resource & Reference
Redux 核心概念介紹
Redux-intro
By dmoon
Redux-intro
- 2,448