Skip to content

Commit 5736372

Browse files
Elm1992sqchen
andauthored
feat: add form handleCollapsedChange event (#6893)
* feat: add form handleCollapsedChange event * fix: ts lint * fix: ts error --------- Co-authored-by: sqchen <chenshiqi@sshlx.com>
1 parent a4aa133 commit 5736372

File tree

7 files changed

+24
-13
lines changed

7 files changed

+24
-13
lines changed

docs/src/components/common-ui/vben-form.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,7 @@ useVbenForm 返回的第二个参数,是一个对象,包含了一些表单
335335
| handleReset | 表单重置回调 | `(values: Record<string, any>,) => Promise<void> \| void` | - |
336336
| handleSubmit | 表单提交回调 | `(values: Record<string, any>,) => Promise<void> \| void` | - |
337337
| handleValuesChange | 表单值变化回调 | `(values: Record<string, any>, fieldsChanged: string[]) => void` | - |
338+
| handleCollapsedChange | 表单收起展开状态变化回调 | `(collapsed: boolean) => void` | - |
338339
| actionButtonsReverse | 调换操作按钮位置 | `boolean` | `false` |
339340
| resetButtonOptions | 重置按钮组件参数 | `ActionButtonOptions` | - |
340341
| submitButtonOptions | 提交按钮组件参数 | `ActionButtonOptions` | - |

packages/@core/ui-kit/form-ui/src/components/form-actions.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ async function handleSubmit(e: Event) {
4747
return;
4848
}
4949
50-
const values = toRaw(await props.formApi.getValues());
50+
const values = toRaw(await props.formApi.getValues()) ?? {};
5151
await props.handleSubmit?.(values);
5252
}
5353
@@ -56,7 +56,7 @@ async function handleReset(e: Event) {
5656
e?.stopPropagation();
5757
const props = unref(rootProps);
5858
59-
const values = toRaw(await props.formApi?.getValues());
59+
const values = toRaw(await props.formApi?.getValues()) ?? {};
6060
6161
if (isFunction(props.handleReset)) {
6262
await props.handleReset?.(values);

packages/@core/ui-kit/form-ui/src/form-api.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ function getDefaultState(): VbenFormProps {
3636
handleReset: undefined,
3737
handleSubmit: undefined,
3838
handleValuesChange: undefined,
39+
handleCollapsedChange: undefined,
3940
layout: 'horizontal',
4041
resetButtonOptions: {},
4142
schema: [],

packages/@core/ui-kit/form-ui/src/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,10 @@ export interface VbenFormProps<
379379
* 表单字段映射
380380
*/
381381
fieldMappingTime?: FieldMappingTime;
382+
/**
383+
* 表单收起展开状态变化回调
384+
*/
385+
handleCollapsedChange?: (collapsed: boolean) => void;
382386
/**
383387
* 表单重置回调
384388
*/

packages/@core/ui-kit/form-ui/src/use-form-context.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { useForm } from 'vee-validate';
1313
import { object, ZodIntersection, ZodNumber, ZodObject, ZodString } from 'zod';
1414
import { getDefaultsForSchema } from 'zod-defaults';
1515

16-
type ExtendFormProps = VbenFormProps & { formApi: ExtendedFormApi };
16+
type ExtendFormProps = VbenFormProps & { formApi?: ExtendedFormApi };
1717

1818
export const [injectFormProps, provideFormProps] =
1919
createContext<[ComputedRef<ExtendFormProps> | ExtendFormProps, FormActions]>(

packages/@core/ui-kit/form-ui/src/vben-form.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ const { delegatedSlots, form } = useFormInitial(props);
4040
provideFormProps([props, form]);
4141
4242
const handleUpdateCollapsed = (value: boolean) => {
43-
currentCollapsed.value = !!value;
43+
currentCollapsed.value = value;
44+
// 触发收起展开状态变化回调
45+
props.handleCollapsedChange?.(value);
4446
};
4547
4648
watchEffect(() => {

packages/@core/ui-kit/form-ui/src/vben-use-form.vue

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import {
2525
} from './use-form-context';
2626
// 通过 extends 会导致热更新卡死,所以重复写了一遍
2727
interface Props extends VbenFormProps {
28-
formApi: ExtendedFormApi;
28+
formApi?: ExtendedFormApi;
2929
}
3030
3131
const props = defineProps<Props>();
@@ -44,11 +44,13 @@ provideComponentRefMap(componentRefMap);
4444
props.formApi?.mount?.(form, componentRefMap);
4545
4646
const handleUpdateCollapsed = (value: boolean) => {
47-
props.formApi?.setState({ collapsed: !!value });
47+
props.formApi?.setState({ collapsed: value });
48+
// 触发收起展开状态变化回调
49+
forward.value.handleCollapsedChange?.(value);
4850
};
4951
5052
function handleKeyDownEnter(event: KeyboardEvent) {
51-
if (!state.value.submitOnEnter || !forward.value.formApi?.isMounted) {
53+
if (!state?.value.submitOnEnter || !forward.value.formApi?.isMounted) {
5254
return;
5355
}
5456
// 如果是 textarea 不阻止默认行为,否则会导致无法换行。
@@ -58,11 +60,11 @@ function handleKeyDownEnter(event: KeyboardEvent) {
5860
}
5961
event.preventDefault();
6062
61-
forward.value.formApi.validateAndSubmitForm();
63+
forward.value.formApi?.validateAndSubmitForm();
6264
}
6365
6466
const handleValuesChangeDebounced = useDebounceFn(async () => {
65-
state.value.submitOnChange && forward.value.formApi?.validateAndSubmitForm();
67+
state?.value.submitOnChange && forward.value.formApi?.validateAndSubmitForm();
6668
}, 300);
6769
6870
const valuesCache: Recordable<any> = {};
@@ -74,7 +76,7 @@ onMounted(async () => {
7476
() => form.values,
7577
async (newVal) => {
7678
if (forward.value.handleValuesChange) {
77-
const fields = state.value.schema?.map((item) => {
79+
const fields = state?.value.schema?.map((item) => {
7880
return item.fieldName;
7981
});
8082
@@ -91,8 +93,9 @@ onMounted(async () => {
9193
9294
if (changedFields.length > 0) {
9395
// 调用handleValuesChange回调,传入所有表单值的深拷贝和变更的字段列表
96+
const values = await forward.value.formApi?.getValues();
9497
forward.value.handleValuesChange(
95-
cloneDeep(await forward.value.formApi.getValues()),
98+
cloneDeep(values ?? {}) as Record<string, any>,
9699
changedFields,
97100
);
98101
}
@@ -109,7 +112,7 @@ onMounted(async () => {
109112
<Form
110113
@keydown.enter="handleKeyDownEnter"
111114
v-bind="forward"
112-
:collapsed="state.collapsed"
115+
:collapsed="state?.collapsed"
113116
:component-bind-event-map="COMPONENT_BIND_EVENT_MAP"
114117
:component-map="COMPONENT_MAP"
115118
:form="form"
@@ -126,7 +129,7 @@ onMounted(async () => {
126129
<slot v-bind="slotProps">
127130
<FormActions
128131
v-if="forward.showDefaultActions"
129-
:model-value="state.collapsed"
132+
:model-value="state?.collapsed"
130133
@update:model-value="handleUpdateCollapsed"
131134
>
132135
<template #reset-before="resetSlotProps">

0 commit comments

Comments
 (0)