@hi-ui/form 4.1.2 → 4.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -0
- package/lib/cjs/Form.js +26 -44
- package/lib/cjs/FormField.js +0 -16
- package/lib/cjs/FormItem.js +15 -37
- package/lib/cjs/FormLabel.js +44 -67
- package/lib/cjs/FormList.js +11 -37
- package/lib/cjs/FormMessage.js +10 -29
- package/lib/cjs/FormReset.js +11 -30
- package/lib/cjs/FormSubmit.js +13 -34
- package/lib/cjs/context.js +0 -6
- package/lib/cjs/index.js +0 -7
- package/lib/cjs/styles/index.scss.js +2 -5
- package/lib/cjs/use-form-field.js +16 -35
- package/lib/cjs/use-form.js +67 -153
- package/lib/cjs/utils/index.js +1 -8
- package/lib/esm/Form.js +24 -32
- package/lib/esm/FormField.js +0 -11
- package/lib/esm/FormItem.js +13 -22
- package/lib/esm/FormLabel.js +42 -54
- package/lib/esm/FormList.js +9 -26
- package/lib/esm/FormMessage.js +8 -18
- package/lib/esm/FormReset.js +8 -16
- package/lib/esm/FormSubmit.js +10 -20
- package/lib/esm/context.js +0 -4
- package/lib/esm/index.js +2 -6
- package/lib/esm/styles/index.scss.js +2 -4
- package/lib/esm/use-form-field.js +14 -24
- package/lib/esm/use-form.js +64 -136
- package/lib/esm/utils/index.js +1 -6
- package/lib/types/Form.d.ts +1 -1
- package/lib/types/FormField.d.ts +0 -3
- package/lib/types/FormItem.d.ts +0 -3
- package/lib/types/FormLabel.d.ts +0 -3
- package/lib/types/FormList.d.ts +0 -3
- package/lib/types/FormMessage.d.ts +0 -3
- package/lib/types/FormReset.d.ts +0 -3
- package/lib/types/FormSubmit.d.ts +0 -3
- package/package.json +13 -14
package/lib/cjs/use-form.js
CHANGED
|
@@ -10,103 +10,81 @@
|
|
|
10
10
|
'use strict';
|
|
11
11
|
|
|
12
12
|
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
13
|
-
|
|
14
13
|
Object.defineProperty(exports, '__esModule', {
|
|
15
14
|
value: true
|
|
16
15
|
});
|
|
17
|
-
|
|
18
16
|
var _regeneratorRuntime = require('@babel/runtime/regenerator');
|
|
19
|
-
|
|
20
17
|
var tslib = require('tslib');
|
|
21
|
-
|
|
22
18
|
var index = require('./utils/index.js');
|
|
23
|
-
|
|
24
19
|
var React = require('react');
|
|
25
|
-
|
|
26
20
|
var useLatest = require('@hi-ui/use-latest');
|
|
27
|
-
|
|
28
21
|
var typeAssertion = require('@hi-ui/type-assertion');
|
|
29
|
-
|
|
30
22
|
var funcUtils = require('@hi-ui/func-utils');
|
|
31
|
-
|
|
32
23
|
var objectUtils = require('@hi-ui/object-utils');
|
|
33
|
-
|
|
34
24
|
var domUtils = require('@hi-ui/dom-utils');
|
|
35
|
-
|
|
36
|
-
function _interopDefaultLegacy(e) {
|
|
25
|
+
function _interopDefaultCompat(e) {
|
|
37
26
|
return e && _typeof(e) === 'object' && 'default' in e ? e : {
|
|
38
27
|
'default': e
|
|
39
28
|
};
|
|
40
29
|
}
|
|
41
|
-
|
|
42
|
-
var
|
|
43
|
-
|
|
44
|
-
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
45
|
-
|
|
30
|
+
var _regeneratorRuntime__default = /*#__PURE__*/_interopDefaultCompat(_regeneratorRuntime);
|
|
31
|
+
var React__default = /*#__PURE__*/_interopDefaultCompat(React);
|
|
46
32
|
var EMPTY_RULES = {};
|
|
47
33
|
var EMPTY_ERRORS = {};
|
|
48
34
|
var EMPTY_TOUCHED = {};
|
|
49
35
|
var DEFAULT_VALIDATE_TRIGGER = ['onChange', 'onBlur'];
|
|
50
|
-
|
|
51
36
|
var EMPTY_FUNC = function EMPTY_FUNC() {};
|
|
52
|
-
|
|
53
37
|
var useForm = function useForm(_a) {
|
|
54
38
|
var initialValues = _a.initialValues,
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
39
|
+
_a$initialErrors = _a.initialErrors,
|
|
40
|
+
initialErrors = _a$initialErrors === void 0 ? EMPTY_ERRORS : _a$initialErrors,
|
|
41
|
+
_a$initialTouched = _a.initialTouched,
|
|
42
|
+
initialTouched = _a$initialTouched === void 0 ? EMPTY_TOUCHED : _a$initialTouched,
|
|
43
|
+
_a$lazyValidate = _a.lazyValidate,
|
|
44
|
+
lazyValidate = _a$lazyValidate === void 0 ? false : _a$lazyValidate,
|
|
45
|
+
onValuesChange = _a.onValuesChange,
|
|
46
|
+
onReset = _a.onReset,
|
|
47
|
+
onSubmit = _a.onSubmit,
|
|
48
|
+
_a$rules = _a.rules,
|
|
49
|
+
rules = _a$rules === void 0 ? EMPTY_RULES : _a$rules,
|
|
50
|
+
_a$validateAfterTouch = _a.validateAfterTouched,
|
|
51
|
+
validateAfterTouched = _a$validateAfterTouch === void 0 ? false : _a$validateAfterTouch,
|
|
52
|
+
_a$validateTrigger = _a.validateTrigger,
|
|
53
|
+
validateTriggerProp = _a$validateTrigger === void 0 ? DEFAULT_VALIDATE_TRIGGER : _a$validateTrigger,
|
|
54
|
+
rest = tslib.__rest(_a, ["initialValues", "initialErrors", "initialTouched", "lazyValidate", "onValuesChange", "onReset", "onSubmit", "rules", "validateAfterTouched", "validateTrigger"]);
|
|
71
55
|
/**
|
|
72
56
|
* 处理校验触发器,保证 memo 依赖的是数组每个项,避免无效重渲染
|
|
73
57
|
*/
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
var validateTrigger = typeAssertion.isArray(validateTriggerProp) ? validateTriggerProp : [validateTriggerProp]; // eslint-disable-next-line react-hooks/exhaustive-deps
|
|
77
|
-
|
|
58
|
+
var validateTrigger = typeAssertion.isArray(validateTriggerProp) ? validateTriggerProp : [validateTriggerProp];
|
|
59
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
78
60
|
var validateTriggersMemo = React.useMemo(function () {
|
|
79
61
|
return validateTrigger;
|
|
80
62
|
}, validateTrigger);
|
|
81
63
|
/**
|
|
82
64
|
* 收集 Field 的校验器注册表
|
|
83
65
|
*/
|
|
84
|
-
|
|
85
66
|
var _useCollection = useCollection(),
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
67
|
+
getValidation = _useCollection[0],
|
|
68
|
+
registerField = _useCollection[1],
|
|
69
|
+
unregisterField = _useCollection[2],
|
|
70
|
+
getRegisteredKeys = _useCollection[3];
|
|
90
71
|
/**
|
|
91
72
|
* form 数据管理中心
|
|
92
73
|
*/
|
|
93
|
-
|
|
94
|
-
|
|
95
74
|
var _useReducer = React.useReducer(formReducer, {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
75
|
+
values: initialValues,
|
|
76
|
+
errors: initialErrors,
|
|
77
|
+
touched: initialTouched,
|
|
78
|
+
validating: false,
|
|
79
|
+
submitting: false
|
|
80
|
+
}),
|
|
81
|
+
formState = _useReducer[0],
|
|
82
|
+
formDispatch = _useReducer[1];
|
|
83
|
+
// 使用 latest ref 维护,保证每次主动拿取的 formState 都是最新的
|
|
84
|
+
var formStateRef = useLatest.useLatestRef(formState);
|
|
85
|
+
// const getFieldNames = useCallback(() => Object.keys(formStateRef.current.values as any), [
|
|
107
86
|
// formStateRef,
|
|
108
87
|
// ])
|
|
109
|
-
|
|
110
88
|
var getFieldValue = React.useCallback(function (fieldName) {
|
|
111
89
|
return objectUtils.getNested(formStateRef.current.values, fieldName);
|
|
112
90
|
}, [formStateRef]);
|
|
@@ -133,7 +111,6 @@ var useForm = function useForm(_a) {
|
|
|
133
111
|
if (touched === void 0) {
|
|
134
112
|
touched = false;
|
|
135
113
|
}
|
|
136
|
-
|
|
137
114
|
formDispatch({
|
|
138
115
|
type: 'SET_FIELD_TOUCHED',
|
|
139
116
|
// @ts-ignore
|
|
@@ -146,7 +123,6 @@ var useForm = function useForm(_a) {
|
|
|
146
123
|
/**
|
|
147
124
|
* 使用单个 Field 规则对给定值进行校验
|
|
148
125
|
*/
|
|
149
|
-
|
|
150
126
|
var validateField = React.useCallback(function (field, value) {
|
|
151
127
|
return tslib.__awaiter(void 0, void 0, void 0, /*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee() {
|
|
152
128
|
var fieldValidation, errorResultAsPromise;
|
|
@@ -155,14 +131,11 @@ var useForm = function useForm(_a) {
|
|
|
155
131
|
switch (_context.prev = _context.next) {
|
|
156
132
|
case 0:
|
|
157
133
|
fieldValidation = getValidation(field);
|
|
158
|
-
|
|
159
134
|
if (fieldValidation) {
|
|
160
135
|
_context.next = 3;
|
|
161
136
|
break;
|
|
162
137
|
}
|
|
163
|
-
|
|
164
138
|
return _context.abrupt("return");
|
|
165
|
-
|
|
166
139
|
case 3:
|
|
167
140
|
formDispatch({
|
|
168
141
|
type: 'SET_VALIDATING',
|
|
@@ -178,16 +151,14 @@ var useForm = function useForm(_a) {
|
|
|
178
151
|
return objectUtils.setNested({}, field, value);
|
|
179
152
|
}, function (errorMsg) {
|
|
180
153
|
var _a, _b, _c;
|
|
181
|
-
|
|
182
154
|
formDispatch({
|
|
183
155
|
type: 'SET_VALIDATING',
|
|
184
156
|
payload: false
|
|
185
|
-
});
|
|
186
|
-
|
|
157
|
+
});
|
|
158
|
+
// @ts-ignore
|
|
187
159
|
setFieldError(field, (_c = (_b = (_a = errorMsg.fields[index.stringify(field)]) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.message) !== null && _c !== void 0 ? _c : '');
|
|
188
160
|
throw errorMsg;
|
|
189
161
|
}));
|
|
190
|
-
|
|
191
162
|
case 6:
|
|
192
163
|
case "end":
|
|
193
164
|
return _context.stop();
|
|
@@ -199,7 +170,6 @@ var useForm = function useForm(_a) {
|
|
|
199
170
|
/**
|
|
200
171
|
* 校验单个 Field 及其当前值
|
|
201
172
|
*/
|
|
202
|
-
|
|
203
173
|
var validateFieldState = React.useCallback(function (field) {
|
|
204
174
|
var value = getFieldValue(field);
|
|
205
175
|
return validateField(field, value);
|
|
@@ -207,7 +177,6 @@ var useForm = function useForm(_a) {
|
|
|
207
177
|
/**
|
|
208
178
|
* 检验所有字段
|
|
209
179
|
*/
|
|
210
|
-
|
|
211
180
|
var validateAll = React.useCallback(function () {
|
|
212
181
|
var fieldNames = getRegisteredKeys();
|
|
213
182
|
formDispatch({
|
|
@@ -217,37 +186,30 @@ var useForm = function useForm(_a) {
|
|
|
217
186
|
return Promise.all(fieldNames.map(function (fieldName) {
|
|
218
187
|
var value = getFieldValue(fieldName);
|
|
219
188
|
var fieldValidation = getValidation(fieldName);
|
|
220
|
-
|
|
221
189
|
if (!fieldValidation) {
|
|
222
190
|
return Promise.resolve(null);
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
|
|
191
|
+
}
|
|
192
|
+
// catch 错误,保证检验所有表单项
|
|
226
193
|
return fieldValidation.validate(value)["catch"](function (error) {
|
|
227
194
|
// 第一个出错,即退出校验
|
|
228
195
|
if (lazyValidate) {
|
|
229
196
|
throw error;
|
|
230
197
|
}
|
|
231
|
-
|
|
232
198
|
return error;
|
|
233
199
|
});
|
|
234
200
|
})).then(function (result) {
|
|
235
201
|
// 合并错误,批量更新并返回
|
|
236
202
|
var combinedError = result.reduce(function (prev, cur, index$1) {
|
|
237
203
|
var _a, _b;
|
|
238
|
-
|
|
239
204
|
var fieldName = fieldNames[index$1];
|
|
240
205
|
var errorMsg;
|
|
241
|
-
|
|
242
206
|
if (cur instanceof Error) {
|
|
243
207
|
// @ts-ignore
|
|
244
208
|
errorMsg = ((_b = (_a = cur.fields[index.stringify(fieldName)]) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.message) || '';
|
|
245
|
-
|
|
246
209
|
if (typeof errorMsg === 'string' && !!errorMsg) {
|
|
247
210
|
return objectUtils.setNested(prev, fieldName, errorMsg);
|
|
248
211
|
}
|
|
249
212
|
}
|
|
250
|
-
|
|
251
213
|
return prev;
|
|
252
214
|
}, {});
|
|
253
215
|
formDispatch({
|
|
@@ -261,16 +223,14 @@ var useForm = function useForm(_a) {
|
|
|
261
223
|
return combinedError;
|
|
262
224
|
})["catch"](function (error) {
|
|
263
225
|
var _a, _b;
|
|
264
|
-
|
|
265
226
|
var fieldNameStrings = fieldNames.map(function (item) {
|
|
266
227
|
return index.stringify(item);
|
|
267
|
-
});
|
|
268
|
-
|
|
228
|
+
});
|
|
229
|
+
// @ts-ignore
|
|
269
230
|
var fieldNameString = Object.keys(error.fields).find(function (item) {
|
|
270
231
|
return fieldNameStrings.includes(item);
|
|
271
232
|
});
|
|
272
233
|
var combinedError = {};
|
|
273
|
-
|
|
274
234
|
if (!fieldNameString) {
|
|
275
235
|
formDispatch({
|
|
276
236
|
type: 'SET_VALIDATING',
|
|
@@ -278,20 +238,15 @@ var useForm = function useForm(_a) {
|
|
|
278
238
|
});
|
|
279
239
|
return error;
|
|
280
240
|
}
|
|
281
|
-
|
|
282
241
|
var errorMsg;
|
|
283
|
-
|
|
284
242
|
if (error instanceof Error) {
|
|
285
243
|
// @ts-ignore
|
|
286
244
|
errorMsg = ((_b = (_a = error.fields[fieldNameString]) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.message) || '';
|
|
287
245
|
}
|
|
288
|
-
|
|
289
246
|
var fieldName = index.parse(fieldNameString);
|
|
290
|
-
|
|
291
247
|
if (typeof errorMsg === 'string' && !!errorMsg) {
|
|
292
248
|
combinedError = objectUtils.setNested(combinedError, fieldName, errorMsg);
|
|
293
249
|
}
|
|
294
|
-
|
|
295
250
|
formDispatch({
|
|
296
251
|
type: 'SET_VALIDATING',
|
|
297
252
|
payload: false
|
|
@@ -306,7 +261,6 @@ var useForm = function useForm(_a) {
|
|
|
306
261
|
/**
|
|
307
262
|
* 控件值更新策略
|
|
308
263
|
*/
|
|
309
|
-
|
|
310
264
|
var setFieldValue = React.useCallback(function (field, value, shouldValidate) {
|
|
311
265
|
formDispatch({
|
|
312
266
|
type: 'SET_FIELD_VALUE',
|
|
@@ -314,10 +268,9 @@ var useForm = function useForm(_a) {
|
|
|
314
268
|
field: field,
|
|
315
269
|
value: value
|
|
316
270
|
}
|
|
317
|
-
});
|
|
318
|
-
|
|
271
|
+
});
|
|
272
|
+
// touched 给外部控制展示,而不是当做参数暴露
|
|
319
273
|
var shouldValidateField = validateAfterTouched ? objectUtils.getNested(formState.touched, field) && shouldValidate : shouldValidate;
|
|
320
|
-
|
|
321
274
|
if (shouldValidateField) {
|
|
322
275
|
validateField(field, value)["catch"](EMPTY_FUNC);
|
|
323
276
|
}
|
|
@@ -332,26 +285,23 @@ var useForm = function useForm(_a) {
|
|
|
332
285
|
}, []);
|
|
333
286
|
var normalizeValueFromChange = React.useCallback(function (eventOrValue, valuePropName) {
|
|
334
287
|
var nextValue = eventOrValue;
|
|
335
|
-
|
|
336
288
|
if (typeAssertion.isObjectLike(eventOrValue) && eventOrValue.target) {
|
|
337
|
-
var event = eventOrValue;
|
|
338
|
-
|
|
289
|
+
var event = eventOrValue;
|
|
290
|
+
// @see https://reactjs.org/docs/events.html#event-pooling
|
|
339
291
|
if (typeAssertion.isFunction(event.persist)) {
|
|
340
292
|
event.persist();
|
|
341
293
|
}
|
|
342
|
-
|
|
343
|
-
|
|
294
|
+
var target = event.target || event.currentTarget;
|
|
295
|
+
// if (hasOwnProp(target, valuePropName)) {
|
|
344
296
|
// nextValue = target[valuePropName]
|
|
345
297
|
// }
|
|
346
298
|
// TODO: support all native html field
|
|
347
|
-
|
|
348
299
|
if (/checkbox/.test(target.type)) {
|
|
349
300
|
nextValue = target.checked;
|
|
350
301
|
} else {
|
|
351
302
|
nextValue = target.value;
|
|
352
303
|
}
|
|
353
304
|
}
|
|
354
|
-
|
|
355
305
|
return nextValue;
|
|
356
306
|
}, []);
|
|
357
307
|
var handleFieldChange = React.useCallback(function (fieldName, valuePropName, valueDispatchTransform, shouldValidate) {
|
|
@@ -359,7 +309,6 @@ var useForm = function useForm(_a) {
|
|
|
359
309
|
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
360
310
|
args[_key - 1] = arguments[_key];
|
|
361
311
|
}
|
|
362
|
-
|
|
363
312
|
var nextValue = typeAssertion.isFunction(valueDispatchTransform) ? valueDispatchTransform.apply(void 0, [evt].concat(args)) : normalizeValueFromChange(evt, valuePropName);
|
|
364
313
|
setFieldValue(fieldName, nextValue, shouldValidate);
|
|
365
314
|
var changedValues = objectUtils.setNested({}, fieldName, nextValue);
|
|
@@ -370,13 +319,11 @@ var useForm = function useForm(_a) {
|
|
|
370
319
|
/**
|
|
371
320
|
* 控件失焦策略
|
|
372
321
|
*/
|
|
373
|
-
|
|
374
322
|
var handleFieldBlur = React.useCallback(function (fieldName, shouldValidate) {
|
|
375
323
|
return function (evt) {
|
|
376
324
|
if (shouldValidate) {
|
|
377
325
|
validateFieldState(fieldName)["catch"](EMPTY_FUNC);
|
|
378
326
|
}
|
|
379
|
-
|
|
380
327
|
setFieldTouched(fieldName, true);
|
|
381
328
|
};
|
|
382
329
|
}, [setFieldTouched, validateFieldState]);
|
|
@@ -388,7 +335,6 @@ var useForm = function useForm(_a) {
|
|
|
388
335
|
/**
|
|
389
336
|
* 表单重置,永远使用第一次的初始值
|
|
390
337
|
*/
|
|
391
|
-
|
|
392
338
|
var initialValuesRef = React.useRef(initialValues);
|
|
393
339
|
var initialErrorsRef = React.useRef(initialErrors);
|
|
394
340
|
var initialTouchedRef = React.useRef(initialTouched);
|
|
@@ -403,13 +349,12 @@ var useForm = function useForm(_a) {
|
|
|
403
349
|
values = nextState && nextState.values ? nextState.values : initialValuesRef.current;
|
|
404
350
|
errors = nextState && nextState.errors ? nextState.errors : initialErrorsRef.current;
|
|
405
351
|
touched = nextState && nextState.touched ? nextState.touched : initialTouchedRef.current;
|
|
406
|
-
initialValuesRef.current = values;
|
|
407
|
-
|
|
352
|
+
initialValuesRef.current = values;
|
|
353
|
+
// @ts-ignore
|
|
408
354
|
initialErrorsRef.current = errors;
|
|
409
355
|
initialTouchedRef.current = touched;
|
|
410
356
|
submitting = !!(nextState && nextState.submitting);
|
|
411
357
|
validating = !!(nextState && nextState.validating);
|
|
412
|
-
|
|
413
358
|
dispatchFn = function dispatchFn() {
|
|
414
359
|
formDispatch({
|
|
415
360
|
type: 'SET_FORM',
|
|
@@ -422,23 +367,18 @@ var useForm = function useForm(_a) {
|
|
|
422
367
|
}
|
|
423
368
|
});
|
|
424
369
|
};
|
|
425
|
-
|
|
426
370
|
if (!onResetLatestRef.current) {
|
|
427
371
|
_context2.next = 15;
|
|
428
372
|
break;
|
|
429
373
|
}
|
|
430
|
-
|
|
431
374
|
_context2.next = 12;
|
|
432
375
|
return onResetLatestRef.current(formState.values);
|
|
433
|
-
|
|
434
376
|
case 12:
|
|
435
377
|
dispatchFn();
|
|
436
378
|
_context2.next = 16;
|
|
437
379
|
break;
|
|
438
|
-
|
|
439
380
|
case 15:
|
|
440
381
|
dispatchFn();
|
|
441
|
-
|
|
442
382
|
case 16:
|
|
443
383
|
case "end":
|
|
444
384
|
return _context2.stop();
|
|
@@ -450,7 +390,6 @@ var useForm = function useForm(_a) {
|
|
|
450
390
|
/**
|
|
451
391
|
* 表单提交
|
|
452
392
|
*/
|
|
453
|
-
|
|
454
393
|
var submitForm = React.useCallback(function () {
|
|
455
394
|
return tslib.__awaiter(void 0, void 0, void 0, /*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee3() {
|
|
456
395
|
return _regeneratorRuntime__default["default"].wrap(function _callee3$(_context3) {
|
|
@@ -463,10 +402,8 @@ var useForm = function useForm(_a) {
|
|
|
463
402
|
return _context3.abrupt("return", validateAll().then(function (combinedErrors) {
|
|
464
403
|
var isInstanceOfError = combinedErrors instanceof Error;
|
|
465
404
|
var isActuallyValid = !!combinedErrors && !isInstanceOfError && Object.keys(combinedErrors).length === 0;
|
|
466
|
-
|
|
467
405
|
if (isActuallyValid) {
|
|
468
406
|
var promiseOrUndefined;
|
|
469
|
-
|
|
470
407
|
try {
|
|
471
408
|
// @ts-ignore
|
|
472
409
|
promiseOrUndefined = onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(formState.values);
|
|
@@ -476,21 +413,19 @@ var useForm = function useForm(_a) {
|
|
|
476
413
|
});
|
|
477
414
|
throw error;
|
|
478
415
|
}
|
|
479
|
-
|
|
480
416
|
if (promiseOrUndefined === undefined) {
|
|
481
417
|
formDispatch({
|
|
482
418
|
type: 'SUBMIT_DONE'
|
|
483
|
-
});
|
|
484
|
-
|
|
419
|
+
});
|
|
420
|
+
// return combinedErrors
|
|
485
421
|
return formState.values;
|
|
486
422
|
}
|
|
487
|
-
|
|
488
423
|
return Promise.resolve(promiseOrUndefined).then(function (result) {
|
|
489
424
|
formDispatch({
|
|
490
425
|
type: 'SUBMIT_DONE'
|
|
491
|
-
});
|
|
426
|
+
});
|
|
427
|
+
// return result
|
|
492
428
|
// TODO: 满足promise 如果既给到values 又给到 errors
|
|
493
|
-
|
|
494
429
|
return formState.values;
|
|
495
430
|
})["catch"](function (_errors) {
|
|
496
431
|
formDispatch({
|
|
@@ -502,7 +437,6 @@ var useForm = function useForm(_a) {
|
|
|
502
437
|
formDispatch({
|
|
503
438
|
type: 'SUBMIT_DONE'
|
|
504
439
|
});
|
|
505
|
-
|
|
506
440
|
if (isInstanceOfError) {
|
|
507
441
|
throw combinedErrors;
|
|
508
442
|
} else {
|
|
@@ -515,7 +449,6 @@ var useForm = function useForm(_a) {
|
|
|
515
449
|
});
|
|
516
450
|
throw error;
|
|
517
451
|
}));
|
|
518
|
-
|
|
519
452
|
case 2:
|
|
520
453
|
case "end":
|
|
521
454
|
return _context3.stop();
|
|
@@ -556,25 +489,23 @@ var useForm = function useForm(_a) {
|
|
|
556
489
|
});
|
|
557
490
|
var getFieldProps = React.useCallback(function (props) {
|
|
558
491
|
var _returnProps;
|
|
559
|
-
|
|
560
492
|
if (props === void 0) {
|
|
561
493
|
props = {};
|
|
562
494
|
}
|
|
563
|
-
|
|
564
495
|
var _props = props,
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
if (!index.isValidField(field)) return {};
|
|
577
|
-
|
|
496
|
+
field = _props.field,
|
|
497
|
+
_props$valuePropName = _props.valuePropName,
|
|
498
|
+
valuePropName = _props$valuePropName === void 0 ? 'value' : _props$valuePropName,
|
|
499
|
+
_props$valueChangeFun = _props.valueChangeFuncPropName,
|
|
500
|
+
valueChangeFuncPropName = _props$valueChangeFun === void 0 ? 'onChange' : _props$valueChangeFun,
|
|
501
|
+
valueDispatchTransform = _props.valueDispatchTransform,
|
|
502
|
+
valueConnectTransform = _props.valueConnectTransform,
|
|
503
|
+
_props$validateTrigge = _props.validateTrigger,
|
|
504
|
+
validateTriggerProp = _props$validateTrigge === void 0 ? validateTriggersMemo : _props$validateTrigge,
|
|
505
|
+
children = _props.children;
|
|
506
|
+
// field 未设置,不进行收集管理
|
|
507
|
+
if (!index.isValidField(field)) return {};
|
|
508
|
+
// 控件的 props
|
|
578
509
|
var controlProps = children && children.props || {};
|
|
579
510
|
var validateTrigger = typeAssertion.isArray(validateTriggerProp) ? validateTriggerProp : [validateTriggerProp];
|
|
580
511
|
var validateOnCollect = validateTrigger.includes(valueChangeFuncPropName);
|
|
@@ -614,62 +545,50 @@ var useForm = function useForm(_a) {
|
|
|
614
545
|
getFieldsError: getFieldsError
|
|
615
546
|
});
|
|
616
547
|
};
|
|
617
|
-
|
|
618
548
|
function formReducer(state, action) {
|
|
619
549
|
switch (action.type) {
|
|
620
550
|
case 'SET_STATE':
|
|
621
551
|
var nextState = typeAssertion.isFunction(action.payload) ? action.payload(state) : action.payload;
|
|
622
552
|
return Object.assign(Object.assign({}, state), nextState);
|
|
623
|
-
|
|
624
553
|
case 'SET_VALUES':
|
|
625
554
|
var nextValues = typeAssertion.isFunction(action.payload) ? action.payload(state.values) : action.payload;
|
|
626
555
|
return Object.assign(Object.assign({}, state), {
|
|
627
556
|
values: nextValues
|
|
628
557
|
});
|
|
629
|
-
|
|
630
558
|
case 'SET_ERRORS':
|
|
631
559
|
return Object.assign(Object.assign({}, state), {
|
|
632
560
|
errors: action.payload
|
|
633
561
|
});
|
|
634
|
-
|
|
635
562
|
case 'SET_TOUCHED':
|
|
636
563
|
return Object.assign(Object.assign({}, state), {
|
|
637
564
|
touched: action.payload
|
|
638
565
|
});
|
|
639
|
-
|
|
640
566
|
case 'SET_SUBMITTING':
|
|
641
567
|
return Object.assign(Object.assign({}, state), {
|
|
642
568
|
submitting: action.payload
|
|
643
569
|
});
|
|
644
|
-
|
|
645
570
|
case 'SET_VALIDATING':
|
|
646
571
|
return Object.assign(Object.assign({}, state), {
|
|
647
572
|
validating: action.payload
|
|
648
573
|
});
|
|
649
|
-
|
|
650
574
|
case 'SET_FIELD_VALUE':
|
|
651
575
|
return Object.assign(Object.assign({}, state), {
|
|
652
576
|
values: objectUtils.setNested(state.values, action.payload.field, action.payload.value)
|
|
653
577
|
});
|
|
654
|
-
|
|
655
578
|
case 'SET_FIELD_TOUCHED':
|
|
656
579
|
return Object.assign(Object.assign({}, state), {
|
|
657
580
|
touched: objectUtils.setNested(state.touched, action.payload.field, action.payload.value)
|
|
658
581
|
});
|
|
659
|
-
|
|
660
582
|
case 'SET_FIELD_ERROR':
|
|
661
583
|
return Object.assign(Object.assign({}, state), {
|
|
662
584
|
errors: objectUtils.setNested(state.errors, action.payload.field, action.payload.value)
|
|
663
585
|
});
|
|
664
|
-
|
|
665
586
|
case 'SET_FORM':
|
|
666
587
|
return Object.assign(Object.assign({}, state), action.payload);
|
|
667
|
-
|
|
668
588
|
case 'SUBMIT_DONE':
|
|
669
589
|
return Object.assign(Object.assign({}, state), {
|
|
670
590
|
submitting: false
|
|
671
591
|
});
|
|
672
|
-
|
|
673
592
|
default:
|
|
674
593
|
return state;
|
|
675
594
|
}
|
|
@@ -677,8 +596,6 @@ function formReducer(state, action) {
|
|
|
677
596
|
/**
|
|
678
597
|
* 一个注册表的收集器
|
|
679
598
|
*/
|
|
680
|
-
|
|
681
|
-
|
|
682
599
|
var useCollection = function useCollection() {
|
|
683
600
|
var collectionMp = React.useMemo(function () {
|
|
684
601
|
return new Map();
|
|
@@ -692,11 +609,9 @@ var useCollection = function useCollection() {
|
|
|
692
609
|
}, []);
|
|
693
610
|
var getCollection = React.useCallback(function (keyOrKeys) {
|
|
694
611
|
var key = index.stringify(keyOrKeys);
|
|
695
|
-
|
|
696
612
|
if (collectionRef.current.has(key)) {
|
|
697
613
|
return collectionRef.current.get(key);
|
|
698
614
|
}
|
|
699
|
-
|
|
700
615
|
return null;
|
|
701
616
|
}, []);
|
|
702
617
|
var getRegisteredKeys = React.useCallback(function () {
|
|
@@ -708,5 +623,4 @@ var useCollection = function useCollection() {
|
|
|
708
623
|
}, []);
|
|
709
624
|
return [getCollection, register, unregister, getRegisteredKeys];
|
|
710
625
|
};
|
|
711
|
-
|
|
712
626
|
exports.useForm = useForm;
|
package/lib/cjs/utils/index.js
CHANGED
|
@@ -12,19 +12,16 @@
|
|
|
12
12
|
Object.defineProperty(exports, '__esModule', {
|
|
13
13
|
value: true
|
|
14
14
|
});
|
|
15
|
-
|
|
16
15
|
var typeAssertion = require('@hi-ui/type-assertion');
|
|
17
|
-
|
|
18
16
|
var objectUtils = require('@hi-ui/object-utils');
|
|
19
17
|
|
|
18
|
+
// TODO: 支持 数字字符串持久化 唯一化
|
|
20
19
|
var stringify = function stringify(field) {
|
|
21
20
|
return JSON.stringify(field);
|
|
22
21
|
};
|
|
23
|
-
|
|
24
22
|
var parse = function parse(fieldStr) {
|
|
25
23
|
return JSON.parse(fieldStr);
|
|
26
24
|
};
|
|
27
|
-
|
|
28
25
|
var isValidField = function isValidField(field) {
|
|
29
26
|
if (typeAssertion.isNullish(field) || field === '') return false;
|
|
30
27
|
if (typeAssertion.isArray(field) && field.every(function (item) {
|
|
@@ -32,21 +29,17 @@ var isValidField = function isValidField(field) {
|
|
|
32
29
|
})) return false;
|
|
33
30
|
return true;
|
|
34
31
|
};
|
|
35
|
-
|
|
36
32
|
var mergeValues = function mergeValues(source, override) {
|
|
37
33
|
if (!override) return source;
|
|
38
34
|
if (!source) return objectUtils.clone(override);
|
|
39
35
|
var target = objectUtils.clone(source);
|
|
40
|
-
|
|
41
36
|
for (var key in override) {
|
|
42
37
|
if (objectUtils.hasOwnProp(override, key)) {
|
|
43
38
|
target[key] = override[key];
|
|
44
39
|
}
|
|
45
40
|
}
|
|
46
|
-
|
|
47
41
|
return target;
|
|
48
42
|
};
|
|
49
|
-
|
|
50
43
|
exports.isValidField = isValidField;
|
|
51
44
|
exports.mergeValues = mergeValues;
|
|
52
45
|
exports.parse = parse;
|