From 26f63b8af938f978badeb4ae7a8259169c7a08ad Mon Sep 17 00:00:00 2001 From: lzq <2495532633@qq.com> Date: Tue, 3 Feb 2026 11:29:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=A7=E5=93=81=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/a-form-panel/AFormPanel.tsx | 50 +++++++++++-- .../gds/goods-category/GoodsCategory.vue | 25 +------ .../gds/goods-category/GoodsCategoryForm.vue | 36 ++++++--- .../gds/goods-category/goods-category.d.ts | 31 +------- src/pages/gds/goods/Goods.vue | 24 ++---- src/pages/gds/goods/GoodsForm.vue | 75 +++++++++++++++---- src/pages/gds/goods/goods.d.ts | 73 +++++++----------- 7 files changed, 171 insertions(+), 143 deletions(-) diff --git a/src/components/a-form-panel/AFormPanel.tsx b/src/components/a-form-panel/AFormPanel.tsx index f3efbec..cb8ef63 100644 --- a/src/components/a-form-panel/AFormPanel.tsx +++ b/src/components/a-form-panel/AFormPanel.tsx @@ -23,7 +23,11 @@ export interface FormPanelType { title: string detailsLoader: (id?: string) => Promise doSubmit: (data: T) => Promise - rules: RuleType + rules: RuleType | ((formData: T) => RuleType) + watchForm: { + formItems: string[] | '_all_' | '_none_' + callback?: (formData: T) => void + } labelWidth: string width: string modal: boolean @@ -70,7 +74,33 @@ const component = defineComponent( showDialog.value = true } expose({open}) - + const formRules = ref(typeof props.rules === 'function' ? props.rules(formData.$clone() as T) : props.rules) + if (props.watchForm.formItems === '_all_') { + watch(formData, + () => { + if (typeof props.rules === 'function') { + formRules.value = props.rules(formData.$clone() as T) + } + props.watchForm.callback?.(formData.$clone() as T) + }, + {deep: true}) + } else if (Array.isArray(props.watchForm.formItems)) { + props.watchForm.formItems.forEach(val => { + watch( + () => val.split('.').reduce((current, key) => { + // @ts-ignore + return current?.[key] + }, formData as T), + () => { + if (typeof props.rules === 'function') { + formRules.value = props.rules(formData.$clone() as T) + } + props.watchForm.callback?.(formData.$clone() as T) + }, + {deep: true}, + ) + }) + } return () => ( showDialog.value = val} @@ -86,7 +116,7 @@ const component = defineComponent( ref="formRef" label-width={props.labelWidth} model={formData} - rules={props.rules} + rules={formRules.value} class={styles.formPanel}> { slots.default?.(formData as T) @@ -104,7 +134,7 @@ const component = defineComponent( }, { name: 'AFormPanel', - props: [ 'title', 'detailsLoader', 'doSubmit', 'rules', 'labelWidth', 'width', 'modal', 'appendToBody' ], + props: [ 'title', 'detailsLoader', 'doSubmit', 'rules', 'watchForm', 'labelWidth', 'width', 'modal', 'appendToBody' ], }) export interface AFormPanelInstance extends InstanceType { @@ -112,7 +142,7 @@ export interface AFormPanelInstance extends InstanceType { } -export function buildFormPanelProps(props: Partial, 'title' | 'detailsLoader' | 'doSubmit'>> & Pick, 'detailsLoader' | 'doSubmit'>) { +export function buildFormPanelProps(props: Partial, 'title' | 'detailsLoader' | 'doSubmit' | 'watchForm'>> & Pick, 'detailsLoader' | 'doSubmit'> & Partial, 'watchForm'>>) { if (props.labelWidth == null) { props.labelWidth = '90px' } @@ -128,11 +158,21 @@ export function buildFormPanelProps(props: Partial } + if (props.watchForm == null) { + props.watchForm = { + formItems: '_none_', + } + } + if (props.watchForm.formItems == null) { + props.watchForm.formItems = '_none_' + } + return reactive({ title: props.title!, detailsLoader: props.detailsLoader!, doSubmit: props.doSubmit!, rules: props.rules, + watchForm: props.watchForm!, labelWidth: props.labelWidth!, width: props.width!, modal: props.modal!, diff --git a/src/pages/gds/goods-category/GoodsCategory.vue b/src/pages/gds/goods-category/GoodsCategory.vue index cd00f88..bb34da7 100644 --- a/src/pages/gds/goods-category/GoodsCategory.vue +++ b/src/pages/gds/goods-category/GoodsCategory.vue @@ -2,23 +2,9 @@ -