Action Creator 使用了 redux-thunk 中间件的异步写法:
// 支持异步操作的action creator
export const changeState = (newState) => async (dispatch) => {
await dispatch({
type: CHANGE_STATE,
data: newState, // 注意这里用data作为payload的key
});
};
Reducer 使用了 Object.assign 来更新状态:
export function headReducer(state = initState, action) {
switch (action.type) {
case CHANGE_STATE:
// 使用Object.assign合并状态
return Object.assign({}, s内容异常请访问tate, { ...action.data });
// 支持其他action类型
case CHANGE_ROUTE_PATH:
return { ...state, selectedKeys: action.payload };
default: return state;
}
}
使用 combineReducers 合并多个 reducer:
const rootReducer = combineReducers({
headReducer,
routing: routerReducer // 集成了路由reducer
});
export default rootReducer;
// Layout组件连接Redux
@connect(
// mapStateToProps
({ headReducer }) => ({
marketingCampaignStatus: headReducer.marketingCampaignStatus,
// ...其他状态
}),
// mapDispatchToProps
{
changeState, // 注入action creator
}
)
class Layout extends React.Component {
// 定义状态更新方法
onMarketingStatusChange = (newStatus) => {
this.props.changeState({
marketingCampaignStatus: newStatus
});
}
render() {
// 传递给子组件
return (
<Header
marketingCampaignStatus={this.props.marketingCampaignStatus}
onMarketingStatusChange={this.onMarketingStatusChange}
/>
)
}
}
// 子组件使用
class Header extends React.Component {
render() {
const { marketingCampaignStatus, onMarketingStatusChange } = this.props;
return (
<div onClick={() => onMarketingStatusChange(!marketingCampaignStatus)}>
状态: {marketingCampaignStatus ? '开' : '关'}
</div>
)
}
}
export default connect(({ headReducer}) => ({
marketingCampaignStatus: headReducer.marketingCampaignStatus
}), {
changeState
})(DistributeOrder);