33 * @Author : jiangxiaowei
44 * @Date : 2021-08-06 15:33:25
55 * @Last Modified by: jiangxiaowei
6- * @Last Modified time: 2022-04-22 11:31:56
6+ * @Last Modified time: 2023-07-20 16:45:31
77 */
88import { typeCheck } from '@jdfed/utils'
99import { useCallback } from 'react'
@@ -61,12 +61,20 @@ const useSchema = ({
6161 typeMap,
6262 formData,
6363 dispatch,
64+ prevFormData,
65+ prevUiSchema,
66+ prevDataSchema,
67+ prevTypeMap,
6468} : {
6569 dispatch : Dispatch < Action >
6670 uiSchema : UiSchema
6771 dataSchema : DataSchema
6872 typeMap : Map
6973 formData : Map
74+ prevFormData : Map
75+ prevUiSchema : UiSchema
76+ prevDataSchema : DataSchema
77+ prevTypeMap : Map
7078} ) : {
7179 get : Get
7280 set : Set
@@ -75,69 +83,109 @@ const useSchema = ({
7583 merge : Merge
7684} => {
7785 const { getTypeKey, getKey } = useGetKey ( typeMap )
78- const get = useCallback < Get > (
79- ( fieldKey ) => {
80- // 找不到则获取根目录
81- if ( ! fieldKey ) {
82- return {
83- uiSchema,
84- dataSchema,
85- data : formData ,
86- }
87- } else {
88- const fieldKeyMap = fieldKey . split ( '.' )
89- const arr = getTypeKey ( fieldKey ) . split ( '.' )
90- return arr . reduce (
91- ( prev , cur , index , arr ) => {
92- if ( cur === '' ) {
93- // 返回根目录的dataSchema、uiSchema、formData
94- return prev
95- } else if (
96- index === 0 ||
97- ( typeMap [ arr . slice ( 0 , index ) . join ( '.' ) ] as Map ) . type === 'object'
98- ) {
99- // 对象类型
100- return {
101- uiSchema : ( prev . uiSchema . properties as Map ) [ cur ] ,
102- dataSchema : ( prev . dataSchema . properties as Map ) [ cur ] ,
103- data : prev . data ? prev . data [ cur ] : undefined ,
104- }
105- } else if (
106- ( typeMap [ arr . slice ( 0 , index ) . join ( '.' ) ] as Map ) . type === 'array'
107- ) {
108- // 数组类型
109- if ( cur === '$container' ) {
110- // 普通数组
86+ const get = useCallback <
87+ (
88+ fieldKey ?: string ,
89+ option ?: { isPrev : boolean }
90+ ) => {
91+ data : Map | undefined
92+ dataSchema : DataSchema | undefined
93+ uiSchema : UiSchema | undefined
94+ }
95+ > (
96+ ( fieldKey , option = { isPrev : false } ) => {
97+ const isPrev = option ?. isPrev
98+ const newFormData = isPrev ? prevFormData : formData
99+ const newTypeMap = isPrev ? prevTypeMap : typeMap
100+ const newUiSchema = isPrev ? prevUiSchema : uiSchema
101+ const newDataSchema = isPrev ? prevDataSchema : dataSchema
102+ try {
103+ // 找不到则获取根目录
104+ if ( ! fieldKey ) {
105+ return {
106+ uiSchema : newUiSchema ,
107+ dataSchema : newDataSchema ,
108+ data : newFormData ,
109+ }
110+ } else {
111+ const fieldKeyMap = fieldKey . split ( '.' )
112+ const arr = getTypeKey ( fieldKey ) . split ( '.' )
113+ return arr . reduce (
114+ ( prev , cur , index , arr ) => {
115+ if ( cur === '' ) {
116+ // 返回根目录的dataSchema、uiSchema、formData
117+ return prev
118+ } else if (
119+ index === 0 ||
120+ ( newTypeMap [ arr . slice ( 0 , index ) . join ( '.' ) ] as Map ) . type ===
121+ 'object'
122+ ) {
123+ // 对象类型
111124 return {
112- uiSchema : prev . uiSchema . properties . $container ,
113- dataSchema :
114- prev . dataSchema [ index === 0 ? 'properties' : 'items' ] ,
115- data : prev . data ? prev . data [ fieldKeyMap [ index ] ] : undefined ,
125+ uiSchema : ( prev . uiSchema . properties as Map ) [ cur ] ,
126+ dataSchema : ( prev . dataSchema . properties as Map ) [ cur ] ,
127+ data : prev . data ? prev . data [ cur ] : undefined ,
128+ }
129+ } else if (
130+ ( newTypeMap [ arr . slice ( 0 , index ) . join ( '.' ) ] as Map ) . type ===
131+ 'array'
132+ ) {
133+ // 数组类型
134+ if ( cur === '$container' ) {
135+ // 普通数组
136+ return {
137+ uiSchema : prev . uiSchema . properties . $container ,
138+ dataSchema :
139+ prev . dataSchema [ index === 0 ? 'properties' : 'items' ] ,
140+ data : prev . data ? prev . data [ fieldKeyMap [ index ] ] : undefined ,
141+ }
142+ } else {
143+ // 元祖
144+ return {
145+ uiSchema : prev . uiSchema . properties [ cur ] ,
146+ dataSchema : (
147+ prev . dataSchema [
148+ index === 0 ? 'properties' : 'items'
149+ ] as Map
150+ ) [ cur ] ,
151+ data : prev . data ? prev . data [ cur ] : undefined ,
152+ }
116153 }
117154 } else {
118- // 元祖
119155 return {
120- uiSchema : prev . uiSchema . properties [ cur ] ,
121- dataSchema : (
122- prev . dataSchema [ index === 0 ? 'properties' : 'items' ] as Map
123- ) [ cur ] ,
124- data : prev . data ? prev . data [ cur ] : undefined ,
156+ uiSchema : prev . uiSchema ,
157+ dataSchema : prev . dataSchema ,
158+ data : prev . data ,
125159 }
126160 }
127- } else {
128- return {
129- uiSchema : prev . uiSchema ,
130- dataSchema : prev . dataSchema ,
131- data : prev . data ,
132- }
161+ } ,
162+ {
163+ data : newFormData ,
164+ uiSchema : newUiSchema ,
165+ dataSchema : newDataSchema ,
133166 }
134- } ,
135- { data : formData , uiSchema, dataSchema }
136- )
167+ )
168+ }
169+ } catch ( error ) {
170+ return {
171+ data : undefined ,
172+ uiSchema : undefined ,
173+ dataSchema : undefined ,
174+ }
137175 }
138176 } ,
139- [ dataSchema , formData , getTypeKey , typeMap , uiSchema ]
140- )
177+ [
178+ dataSchema ,
179+ formData ,
180+ getTypeKey ,
181+ prevDataSchema ,
182+ prevFormData ,
183+ prevTypeMap ,
184+ prevUiSchema ,
185+ typeMap ,
186+ uiSchema ,
187+ ]
188+ ) as Get
141189
142190 /**
143191 * 获取当前value值
0 commit comments