From f2e2144f8eaaab41b8e63c43441cc627382209ba Mon Sep 17 00:00:00 2001 From: nickcdon Date: Mon, 31 Jul 2023 17:14:21 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix(FormList):=201.=20=E5=BF=BD=E7=95=A5?= =?UTF-8?q?=E9=A6=96=E6=AC=A1=E6=89=A7=E8=A1=8C=EF=BC=8C=E9=81=BF=E5=85=8D?= =?UTF-8?q?setFieldsValue=E5=BC=82=E5=B8=B8=202.=20=E4=BF=AE=E5=A4=8Dreset?= =?UTF-8?q?=E6=97=A0=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/form/FormList.tsx | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/src/form/FormList.tsx b/src/form/FormList.tsx index 7c642fb6f..1d6c1df2f 100644 --- a/src/form/FormList.tsx +++ b/src/form/FormList.tsx @@ -11,13 +11,19 @@ import log from '../_common/js/log'; let key = 0; const FormList: React.FC = (props) => { - const { formMapRef, form, onFormItemValueChange, initialData: initialDataFromForm } = useFormContext(); + const { + formMapRef, + form, + onFormItemValueChange, + initialData: initialDataFromForm, + resetType: resetTypeFromContext, + } = useFormContext(); const { name, rules, children } = props; const initialData = props.initialData || get(initialDataFromForm, name) || []; const [formListValue, setFormListValue] = useState(initialData); - const [fields, setFields] = useState>( + const [fields, setFields] = useState>(() => initialData.map((data, index) => ({ data: { ...data }, key: (key += 1), @@ -33,6 +39,15 @@ const FormList: React.FC = (props) => { .filter((item) => item !== undefined) .join('_'); // 转化 name + const isMounted = useRef(false); + + useEffect( + () => () => { + isMounted.current = false; + }, + [], + ); + const operation: FormListFieldOperation = { add(defaultValue?: any, insertIndex?: number) { const cloneFields = [...fields]; @@ -119,6 +134,10 @@ const FormList: React.FC = (props) => { }, [formListValue]); useEffect(() => { + if (!isMounted.current) { + isMounted.current = true; + return; + } // fields 变化通知 watch 事件 form?.getInternalHooks?.(HOOK_MARK)?.notifyWatch?.(name); @@ -207,11 +226,26 @@ const FormList: React.FC = (props) => { originData, ); }, - resetField: () => { + resetField: (type: string) => { + const resetType = type || resetTypeFromContext; [...formListMapRef.current.values()].forEach((formItemRef) => { formItemRef?.current?.resetField?.(); }); setFormListValue([]); + fieldsTaskQueueRef.current = []; + key = 0; + if (resetType === 'initial') { + setFields( + initialData.map((data, index) => ({ + data: { ...data }, + key: (key += 1), + name: index, + isListField: true, + })), + ); + } else { + setFields([]); + } }, setValidateMessage: (fieldData) => { [...formListMapRef.current.values()].forEach((formItemRef) => { From e184634ddbd2efa59e123b3cdce61409b3ce6e5c Mon Sep 17 00:00:00 2001 From: nickcdon Date: Thu, 3 Aug 2023 17:53:51 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix(FormList):=20=E8=B0=83=E6=95=B4FormList?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/form/__tests__/form-list.test.tsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/form/__tests__/form-list.test.tsx b/src/form/__tests__/form-list.test.tsx index c06805151..71c19998d 100644 --- a/src/form/__tests__/form-list.test.tsx +++ b/src/form/__tests__/form-list.test.tsx @@ -102,9 +102,12 @@ describe('Form List 组件测试', () => { fireEvent.click(resetBtn); fireEvent.click(submitBtn); await mockTimeout(() => true); - expect(queryByText('省份必填')).toBeTruthy(); - expect(queryByText('地区必填')).toBeTruthy(); + expect(queryByText('guangdong')).not.toBeTruthy(); + expect(queryByText('shenzhen')).not.toBeTruthy(); + fireEvent.click(addBtn); + expect(queryByDisplayValue('guangdong')).toBeTruthy(); + expect(queryByDisplayValue('shenzhen')).toBeTruthy(); const removeBtn = container.querySelector('.test-remove'); fireEvent.click(removeBtn); expect(queryByDisplayValue('guangdong')).not.toBeTruthy(); @@ -121,11 +124,10 @@ describe('Form List 组件测试', () => { fireEvent.click(queryByText('validateOnly')); await mockTimeout(() => true); expect(queryByText('省份必填')).not.toBeTruthy(); - fireEvent.click(queryByText('reset')); fireEvent.click(queryByText('validate')); await mockTimeout(() => true); - expect(queryByText('省份必填')).toBeTruthy(); + expect(queryByText('地区必填')).toBeTruthy(); fireEvent.click(queryByText('clearValidate')); - expect(queryByText('省份必填')).not.toBeTruthy(); + expect(queryByText('地区必填')).not.toBeTruthy(); }); });