import { useReducer } from 'react'; type ActionType = 'update' | 'delete' | 'reset'; interface ChangedData { [key: string]: string | number; } // 给原始的联系人数组添加id, 没有id的联系人对下即为新添加项,不需要存储添加项 interface Contact { //add: { [key: number]: ChangedData }; // 不需要存储 update: { [key: number]: ChangedData }; del: ChangedData; } const initContact: Contact = { del: {}, update: {} }; const reducer = ( state: Contact, action: { type: ActionType; payload: any }, ): Contact => { const { type, payload } = action; const { update, del } = state; let updateCopy = { ...update }; let delCopy = { ...del }; switch (type) { case 'update': if (!updateCopy[payload.idx]) updateCopy[payload.idx] = payload; else updateCopy[payload.idx] = { ...updateCopy[payload.idx], ...payload }; return { ...state, update: updateCopy, }; case 'delete': if (delCopy[payload] === undefined) delCopy[payload] = delCopy[payload] = 1; if (updateCopy[payload]) delete updateCopy[payload]; return { del: delCopy, update: updateCopy, }; case 'reset': return { del: {}, update: {}, }; default: throw new Error(`不匹配的修改类型type-${action.type}`); } }; export default () => useReducer(reducer, initContact);