import { Reducer, AnyAction } from 'redux'; import { EffectsCommandMap } from 'dva'; import { ListItemDataType } from './data'; import { queryFakeList } from './service'; export interface IStateType { list: ListItemDataType[]; } export type Effect = ( action: AnyAction, effects: EffectsCommandMap & { select: (func: (state: IStateType) => T) => T }, ) => void; export interface ModelType { namespace: string; state: IStateType; effects: { fetch: Effect; appendFetch: Effect; }; reducers: { queryList: Reducer; appendList: Reducer; }; } const Model: ModelType = { namespace: 'BLOCK_NAME_CAMEL_CASE', state: { list: [], }, effects: { *fetch({ payload }, { call, put }) { const response = yield call(queryFakeList, payload); yield put({ type: 'queryList', payload: Array.isArray(response) ? response : [], }); }, *appendFetch({ payload }, { call, put }) { const response = yield call(queryFakeList, payload); yield put({ type: 'appendList', payload: Array.isArray(response) ? response : [], }); }, }, reducers: { queryList(state, action) { return { ...state, list: action.payload, }; }, appendList(state, action) { return { ...state, list: state!.list.concat(action.payload), }; }, }, }; export default Model;