Commit 79eb909c66ce5f17368c0d6f93945139bc9956a7

Authored by lee
Committed by GitHub
1 parent 92722093

feat: make fields key of form deconstructable (#1663)

Co-authored-by: liheng.wu <liheng.wu@tcl.com>
src/components/Form/src/hooks/useFormValues.ts
... ... @@ -11,6 +11,43 @@ interface UseFormValuesContext {
11 11 getProps: ComputedRef<FormProps>;
12 12 formModel: Recordable;
13 13 }
  14 +
  15 +/**
  16 + * @desription deconstruct array-link key. This method will mutate the target.
  17 + */
  18 +function tryDeconstructArray(key: string, value: any, target: Recordable) {
  19 + const pattern = /^\[(.+)\]$/;
  20 + if (pattern.test(key)) {
  21 + const match = key.match(pattern);
  22 + if (match && match[1]) {
  23 + const keys = match[1].split(',');
  24 + value = Array.isArray(value) ? value : [value];
  25 + keys.forEach((k, index) => {
  26 + set(target, k.trim(), value[index]);
  27 + });
  28 + return true;
  29 + }
  30 + }
  31 +}
  32 +
  33 +/**
  34 + * @desription deconstruct object-link key. This method will mutate the target.
  35 + */
  36 +function tryDeconstructObject(key: string, value: any, target: Recordable) {
  37 + const pattern = /^\{(.+)\}$/;
  38 + if (pattern.test(key)) {
  39 + const match = key.match(pattern);
  40 + if (match && match[1]) {
  41 + const keys = match[1].split(',');
  42 + value = isObject(value) ? value : {};
  43 + keys.forEach((k) => {
  44 + set(target, k.trim(), value[k.trim()]);
  45 + });
  46 + return true;
  47 + }
  48 + }
  49 +}
  50 +
14 51 export function useFormValues({
15 52 defaultValueRef,
16 53 getSchema,
... ... @@ -41,7 +78,10 @@ export function useFormValues({
41 78 if (isString(value)) {
42 79 value = value.trim();
43 80 }
44   - set(res, key, value);
  81 + if (!tryDeconstructArray(key, value, res) && !tryDeconstructObject(key, value, res)) {
  82 + // 没有解构成功的,按原样赋值
  83 + set(res, key, value);
  84 + }
45 85 }
46 86 return handleRangeTimeValue(res);
47 87 }
... ...
src/views/demo/form/index.vue
... ... @@ -531,6 +531,22 @@
531 531 },
532 532 },
533 533 {
  534 + field: 'divider-deconstruct',
  535 + component: 'Divider',
  536 + label: '字段解构',
  537 + helpMessage: ['如果组件的值是 array 或者 object', '可以根据 ES6 的解构语法分别取值'],
  538 + },
  539 + {
  540 + field: '[startTime, endTime]',
  541 + label: '时间范围',
  542 + component: 'RangePicker',
  543 + componentProps: {
  544 + format: 'YYYY-MM-DD HH:mm:ss',
  545 + placeholder: ['开始时间', '结束时间'],
  546 + showTime: { format: 'HH:mm:ss' },
  547 + },
  548 + },
  549 + {
534 550 field: 'divider-others',
535 551 component: 'Divider',
536 552 label: '其它',
... ... @@ -602,6 +618,7 @@
602 618 keyword.value = '';
603 619 },
604 620 handleSubmit: (values: any) => {
  621 + console.log('values', values);
605 622 createMessage.success('click search,values:' + JSON.stringify(values));
606 623 },
607 624 check,
... ...