1- import { isEmpty , isFunction , isEqual , merge , get , set } from 'lodash-es' ;
1+ import { get , isEmpty , isEqual , isFunction , merge , set } from 'lodash-es' ;
22import log from '@tdesign/common-js/log/index' ;
3+ import useConfig from '../../hooks/useConfig' ;
4+ import { calcFieldValue , findFormItem , findFormItemDeep , objectToArray , travelMapFromObject } from '../utils' ;
5+
6+ import type { FormItemInstance } from '../FormItem' ;
37import type {
4- TdFormProps ,
5- FormValidateResult ,
8+ AllValidateResult ,
69 FormResetParams ,
710 FormValidateMessage ,
8- AllValidateResult ,
11+ FormValidateResult ,
912 NamePath ,
13+ TdFormProps ,
1014} from '../type' ;
11- import useConfig from '../../hooks/useConfig' ;
12- import { getMapValue , objectToArray , travelMapFromObject , calcFieldValue } from '../utils' ;
1315
1416// 检测是否需要校验 默认全量校验
1517function needValidate ( name : NamePath , fields : string [ ] ) {
@@ -40,7 +42,7 @@ function formatValidateResult(validateResultList) {
4042
4143export default function useInstance (
4244 props : TdFormProps ,
43- formRef ,
45+ formRef : React . RefObject < HTMLFormElement > ,
4446 formMapRef : React . MutableRefObject < Map < any , any > > ,
4547 floatingFormDataRef : React . RefObject < Record < any , any > > ,
4648) {
@@ -109,7 +111,7 @@ export default function useInstance(
109111 function getFieldValue ( name : NamePath ) {
110112 if ( ! name ) return null ;
111113
112- const formItemRef = getMapValue ( name , formMapRef ) ;
114+ const formItemRef = findFormItem ( name , formMapRef ) ;
113115 return formItemRef ?. current ?. getValue ?.( ) ;
114116 }
115117
@@ -130,12 +132,12 @@ export default function useInstance(
130132 }
131133 } else {
132134 if ( ! Array . isArray ( nameList ) ) {
133- log . error ( 'Form' , '` getFieldsValue` 参数需要 Array 类型 ' ) ;
135+ log . error ( 'Form' , 'The parameter of " getFieldsValue" must be an array ' ) ;
134136 return { } ;
135137 }
136138
137139 nameList . forEach ( ( name ) => {
138- const formItemRef = getMapValue ( name , formMapRef ) ;
140+ const formItemRef = findFormItem ( name , formMapRef ) ;
139141 if ( ! formItemRef ) return ;
140142
141143 const fieldValue = calcFieldValue ( name , formItemRef ?. current . getValue ?.( ) ) ;
@@ -175,13 +177,15 @@ export default function useInstance(
175177
176178 // 对外方法,设置对应 formItem 的数据
177179 function setFields ( fields = [ ] ) {
178- if ( ! Array . isArray ( fields ) ) throw new Error ( ' setFields 参数需要 Array 类型 ') ;
180+ if ( ! Array . isArray ( fields ) ) throw new TypeError ( 'The parameter of " setFields" must be an array ') ;
179181
180182 fields . forEach ( ( field ) => {
181183 const { name, ...restFields } = field ;
182- const formItemRef = getMapValue ( name , formMapRef ) ;
183-
184- formItemRef ?. current ?. setField ( restFields , field ) ;
184+ let formItemRef = findFormItem ( name , formMapRef ) ;
185+ if ( ! formItemRef ) {
186+ formItemRef = findFormItemDeep ( name , formMapRef ) ;
187+ }
188+ formItemRef ?. current ?. setField ( restFields ) ;
185189 } ) ;
186190 }
187191
@@ -196,7 +200,7 @@ export default function useInstance(
196200 const { type = 'initial' , fields = [ ] } = params ;
197201
198202 fields . forEach ( ( name ) => {
199- const formItemRef = getMapValue ( name , formMapRef ) ;
203+ const formItemRef = findFormItem ( name , formMapRef ) ;
200204 formItemRef ?. current ?. resetField ( type ) ;
201205 } ) ;
202206 }
@@ -211,10 +215,10 @@ export default function useInstance(
211215 formItemRef ?. current ?. resetValidate ( ) ;
212216 } ) ;
213217 } else {
214- if ( ! Array . isArray ( fields ) ) throw new Error ( ' clearValidate 参数需要 Array 类型 ') ;
218+ if ( ! Array . isArray ( fields ) ) throw new TypeError ( 'The parameter of " clearValidate" must be an array ') ;
215219
216220 fields . forEach ( ( name ) => {
217- const formItemRef = getMapValue ( name , formMapRef ) ;
221+ const formItemRef = findFormItem ( name , formMapRef ) ;
218222 formItemRef ?. current ?. resetValidate ( ) ;
219223 } ) ;
220224 }
@@ -229,25 +233,30 @@ export default function useInstance(
229233
230234 // 对外方法,获取 formItem 的错误信息
231235 function getValidateMessage ( fields ?: Array < keyof FormData > ) {
232- const message = { } ;
236+ const formItemRefs =
237+ typeof fields === 'undefined'
238+ ? [ ...formMapRef . current . values ( ) ]
239+ : fields . map ( ( name ) => findFormItem ( name , formMapRef ) ) . filter ( Boolean ) ;
233240
234- if ( typeof fields === 'undefined' ) {
235- [ ...formMapRef . current . values ( ) ] . forEach ( ( formItemRef ) => {
236- const item = formItemRef ?. current ?. getValidateMessage ?.( ) ;
237- if ( isEmpty ( item ) ) return ;
238- message [ formItemRef ?. current ?. name ] = item ;
239- } ) ;
240- } else {
241- if ( ! Array . isArray ( fields ) ) throw new Error ( 'getValidateMessage 参数需要 Array 类型' ) ;
242-
243- fields . forEach ( ( name ) => {
244- const formItemRef = getMapValue ( name , formMapRef ) ;
245- const item = formItemRef ?. current ?. getValidateMessage ?.( ) ;
246- if ( isEmpty ( item ) ) return ;
247- message [ formItemRef ?. current ?. name ] = item ;
248- } ) ;
241+ if ( typeof fields !== 'undefined' && ! Array . isArray ( fields ) ) {
242+ throw new TypeError ( 'The parameter of "getValidateMessage" must be an array' ) ;
249243 }
250244
245+ const extractValidateMessage = ( formItemRef : React . RefObject < FormItemInstance > ) => {
246+ const item = formItemRef ?. current ?. getValidateMessage ?.( ) ;
247+ if ( isEmpty ( item ) ) return null ;
248+ const nameKey = Array . isArray ( formItemRef ?. current ?. name )
249+ ? formItemRef ?. current ?. name . join ( '.' )
250+ : String ( formItemRef ?. current ?. name ) ;
251+ return { nameKey, item } ;
252+ } ;
253+
254+ const message = { } ;
255+ formItemRefs . forEach ( ( formItemRef ) => {
256+ const result = extractValidateMessage ( formItemRef ) ;
257+ if ( result ) message [ result . nameKey ] = result . item ;
258+ } ) ;
259+
251260 if ( isEmpty ( message ) ) return ;
252261
253262 return message ;
0 commit comments