import { addFakeList, queryFakeList, removeFakeList, updateFakeList } from '@/services/api'; import { Effect } from 'dva'; import { Reducer } from 'redux'; export interface IListModelState { list: any[]; } export interface IListModel { namespace: 'list'; state: IListModelState; effects: { fetch: Effect; appendFetch: Effect; submit: Effect; }; reducers: { queryList: Reducer; appendList: Reducer; }; } const ListModel: IListModel = { namespace: 'list', 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 : [], }); }, *submit({ payload }, { call, put }) { let callback: (params: any) => Promise; if (payload.id) { callback = Object.keys(payload).length === 1 ? removeFakeList : updateFakeList; } else { callback = addFakeList; } const response = yield call(callback, payload); // post yield put({ type: 'queryList', payload: response, }); }, }, reducers: { queryList(state, action) { return { ...state, list: action.payload, }; }, appendList(state, action) { return { ...state, list: state.list.concat(action.payload), }; }, }, }; export default ListModel;