- 有個中央控管的rootStore
- 元件把自己需要的rootStore map回去變成自己的props
- 元件可以發出action去變動rootStore 進而更新自己的畫面
=================Store層========================
rootStore管理整個React App的資料(我們先稱他為root)
ex:
{ root :
profile:{...profileData},
friend: {...friendData},
privacy: {...privacy}
}
=================Action定義層========================action會定義我們的操作
ex:
const ADD_PROFILE_DATA = 'ADD_PROFILE_DATA';
addProfileData(data) {
{
type: ADD_PROFILE_DATA,// for reducer使用
data:data //這個action會變動的資訊
}
}
=================Reducer定義層========================
reducer負責處理 action來的狀態變化
所以跟rootStore類似,我們會拆幾個reducer來處理
rootReducer= combineReducers({
profileReducer,
friendReducer,
privacyReducer
});
const profileReducer = function (state, action ) {
switch(action.type) //action所定義的type
case 'ADD_PROFILE_DATA'
state.profile = action.data
return state; //這兩個的意義 (state, action) => new state
default:
return state;//沒定義的action不變動state
}
=================Component/Container(view)定義層=========
React-redux的元件跟react元件最大的不同就是有引入react-redux的connect()方法。
import { connect } from 'react-redux';
import {addProfileData} from 'action/profile';
class Profile extends Component {
//react lifecycle method, render methor
}
mapStateToProps (state) {
profile: state.profile
//我的Profile只需要profile的資料
//就map rootStore的 profile變成自己的props
//如果今天有其他的action變動到rootStore profile的資料
//Profile也會跟著更新狀態
}
export default connect(
mapStateToProps, { addProfileData } ,{/*mergeProps*/},{/*option*/})( Profile );
要熟悉react-redux 對他提供的connect一定要熟悉
第一個連接的是這個component的mapStateToPros 這個function
第二個是這個component會發出的action,官方是稱他為 mapDispatchToProps
做了上述兩個動作,這個react component就在redux資料流當中了
this.props.profile就有相對應的資料
this.props.addProfileData 也可以dispatch透過reducer,更新rootStore的資料。
第三個參數 mergeProps 第四個為option
後兩個比較少用,避免混淆觀念,我這篇先跳過,有興趣可以參閱官方API
https://github.com/reactjs/react-redux/blob/master/docs/api.md#connectmapstatetoprops-apdispatchtoprops-mergeprops-options
=================後序========================
以上是最基本的redux在react的應用流程,
之後還有要跟大家說的,如果redux會使用到非同步呼叫或是其他功能需求(ex logger),
我們是使用redux middleware來完成。
沒有留言:
張貼留言