Skip to content

Commit 13ff612

Browse files
authored
feat(form): get支持获取上一次的值 (#269)
1 parent ef4b327 commit 13ff612

4 files changed

Lines changed: 139 additions & 60 deletions

File tree

packages/drip-form/src/DripForm/index.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* @Author: jiangxiaowei
33
* @Date: 2020-05-14 16:54:32
44
* @Last Modified by: jiangxiaowei
5-
* @Last Modified time: 2023-02-10 16:39:57
5+
* @Last Modified time: 2023-07-19 13:51:16
66
*/
77
import React, {
88
forwardRef,
@@ -296,6 +296,10 @@ const DripForm = forwardRef<DripFormRefType, DripFormRenderProps>(
296296
typeMap: typePath,
297297
dispatch,
298298
formData,
299+
prevFormData: usePrevious(formData),
300+
prevDataSchema: usePrevious(dataSchema),
301+
prevUiSchema: usePrevious(uiSchema),
302+
prevTypeMap: usePrevious(typePath),
299303
})
300304

301305
// 获取当前fieldKey相对uiSchema、dataSchema路径

packages/hooks/src/useSchema.ts

Lines changed: 103 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
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
*/
88
import { typeCheck } from '@jdfed/utils'
99
import { 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值

packages/utils/src/type.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
import { Map, ClosestEdge } from './common/type'
22
import { UnitedSchema, UiSchema, DataSchema } from './schemaHandle/types'
3-
export type Get = (fieldKey?: string) => {
4-
data: Map | undefined
5-
dataSchema: DataSchema
6-
uiSchema: UiSchema
3+
export type Get = {
4+
(fieldKey?: string): {
5+
data: Map | undefined
6+
dataSchema: DataSchema
7+
uiSchema: UiSchema
8+
}
9+
(fieldKey: string, option: { isPrev: boolean }): {
10+
data: Map | undefined
11+
dataSchema: DataSchema | undefined
12+
uiSchema: UiSchema | undefined
13+
}
714
}
815

916
export type GetKey = (

website/docs/form/API/utils/get.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,14 @@ type Get = (fieldKey?: string) => {
1212
dataSchema: DataSchema
1313
uiSchema: UiSchema
1414
}
15+
type Get = (fieldKey: string,option:{
16+
// 是否获取上一次的值
17+
isPrev:boolean
18+
}) => {
19+
data: unknown
20+
dataSchema: DataSchema|undefined
21+
uiSchema: UiSchema|undefined
22+
}
1523
```
1624
1725
获取表单的数据、ui、校验信息。
@@ -22,6 +30,12 @@ type Get = (fieldKey?: string) => {
2230
2331
需要获取表单的key。如果是空字符,则获取所有表单数据
2432
33+
1. option (object)
34+
35+
**可选**,默认为{isPrev:false}
36+
37+
`get`的配置对象,可配置`isPrev`获取上一次值
38+
2539
### 返回
2640
2741
返回一个包含表单数据、ui配置、校验配置的对象。
@@ -33,10 +47,16 @@ type Get = (fieldKey?: string) => {
3347
```js
3448
//获取全局表单数据
3549
get('').data
50+
//获取上一次的
51+
get('',{isPrev:true}).data
3652
//获取表单a的校验配置
3753
get('a').dataSchema
54+
//获取上一次的
55+
get('',{isPrev:true}).dataSchema
3856
//获取表单 a.b.c 的ui配置
3957
get('a.b.c').uiSchema
58+
//获取上一次的
59+
get('',{isPrev:true}).uiSchema
4060
```
4161
4262
### 获取表单数据

0 commit comments

Comments
 (0)