1.'immer'的使用目的是:获得不可变的reducer,即一个深拷贝后又修改的全新的state;
2.使用:
reducer/index.tsx:
import produce from 'immer';
import {combineReducers} from 'redux-immer';
let reducers:ReducersMapObject<CombinedState,AnyAction>={
home,
};
let rootReducer:Reducer<CombinedState,any>=combineReducers<CombinedState>(produce,reducers);
home.tsx:
reducer里部分代码:
case types.SET_LESSONS:
state.lessons.loading=false;
state.lessons.hasMore=action.payload.hasMore;
state.lessons.offset=state.lessons.offset+action.payload.list.length;
state.lessons.list=[...state.lessons.list,...action.payload.list];
return state;//这个state不是原来的state,是经过produce 深拷贝之后的state;
3.源码是:
const baseState=[{
todo:'lean',
done:true,
}];
function produce(baseState:any,cb:any){
let draftState=JSON.parse(JSON.stringify(baseState));
return cb(draftState);
}
const nextState=produce(baseState,(draftState:any)=>{
draftState.push({todo:'about',done:true});
return draftState;
});