1、redux-saga的详细使用
工作原理:
1.1 generator的基本语法
工作原理:
2、reducer的拆分与合并
在之前的案例中,我们有counter计数器的案例与home数据的案例,在这两个案例中我们都是将更新状态所有的逻辑放在了一个reducer函数中进行执行,现在redux管理的状态比较少还比较方便,但是随着项目的不断扩大,会发现reducer里面需要处理的逻辑越来越多,这就会造成reducer这个纯函数变得难以维护,那么我们就需要将reducer函数进行相应的拆分,随后合并在一起,让不同的子reducer函数处理不同的逻辑,这样,不仅便于理解,还方便后期的维护与管理。
2.1 未拆分的reducer函数
// 未拆分的reducer的处理方式
import { INCREMENT, ADD_NUMBER, DECREMENT, SUB_NUMBER, CHANGE_BANNER, CHANGE_RECOMMEND } from './constants'
const defaultState = {
counter: 100,
banner: [],
recommend: []
}
function reducer(state = defaultState, action) {
switch(action.type) {
// 处理number的逻辑
case INCREMENT:
return {...state, counter: state.counter + 1 }
case ADD_NUMBER:
return {...state, counter: state.counter + action.num }
case DECREMENT:
return {...state, counter: state.counter - 1 }
case SUB_NUMBER:
return {...state, counter: state.counter - action.num }
// 处理banner和recommend
case CHANGE_BANNER:
return {...state, banner: action.banner }
case CHANGE_RECOMMEND:
return {...state, recommend: action.recommend }
default:
return state
}
}
export default reducer;
// 缺点:多个业务组件的状态全部杂糅在一起了,无法进行详细的区分,状态管理的逻辑都在一个函数中处理是不合理的。
所以在实际的业务开发中,我们需要将reducer函数进行拆分,让不同的子reducer函数处理不同的业务逻辑,这样的话,便于后期的项目状态的跟踪、调试与维护。
2.2 已拆分的reducer函数
// 将reducer函数进行拆分
import { INCREMENT, ADD_NUMBER, DECREMENT, SUB_NUMBER, CHANGE_BANNER, CHANGE_RECOMMEND } from './constants'
// 子reducer的拆分
const initialCounterState = {
counter: 100
}
function counterReducer(state = initialCounterState, action) {
switch(action.type) {
case INCREMENT:
return {...state, counter: state.counter + 1 }
case ADD_NUMBER:
return {...state, counter: state.counter + action.num }
case DECREMENT:
return {...state, counter: state.counter - 1 }
case SUB_NUMBER:
return {...state, counter: state.counter - action.num }
default:
return state
}
}
// 子reducer的拆分
const initialHomeState = {
banner: [],
recommend: []
}
function homeReducer(state = initialHomeState, action) {
switch(action.type) {
case CHANGE_BANNER:
return {...state, banner: action.banner }
case CHANGE_RECOMMEND:
return {...state, recommend: action.recommend }
default:
return state
}
}
// 将上面两个子reducer进行相应的数据的合并
function reducer(state = {}, action) {
return {
counterInfo: counterReducer(state.counterInfo, action),
homeInfo: homeReducer(state.homeInfo, action)
}
}
export default reducer;
2.3 利用redux中的combineReducers将子reducer进行合并
// 引入redux中的conbineReducers工具函数
import { reducer as counterReducer } from './counter';
import { reducer as homeReducer } from './home';
import { conbineReducers } from 'redux';
// 原始的合并方式 自己封装的
//function reducer(state = {}, action) {
// return {
// counterInfo: counterReducer(state.counterInfo, action),
// homeInfo: homeReducer(state.homeInfo, action)
// }
//}
// 这个是总的reducer合并的函数
const reducer = combineReducers({
counterInfo: counterReducer,
homeInfo: homeReducer
})
// 将reducer函数进行导出 提供给具体的业务组件进行使用
export default reducer;
:::tips
以上就是reducer合并的方法了,在实际项目的开发中,我们并不会自己手动进行合并,主要是调用redux提供合并的工具函数进行合并,操作比较简单、实用。
注意:
- 在实际的业务组件中,使用redux中的state的时候,里面多做了一层的包裹,比如我们需要访问state的数据,就需要 这么使用 伪代码 state = state.counterInfo.state banner = state.homeInfo.banner :::