From 9dfa701454d6a94690bad39dbb0e38f2a0b31489 Mon Sep 17 00:00:00 2001
From: Ben Lin <maobin001@msn.com>
Date: 星期二, 18 六月 2024 18:08:47 +0800
Subject: [PATCH] build

---
 src/views/demo/form/CustomerForm.vue |  230 +++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 196 insertions(+), 34 deletions(-)

diff --git a/src/views/demo/form/CustomerForm.vue b/src/views/demo/form/CustomerForm.vue
index abb384d..5217c85 100644
--- a/src/views/demo/form/CustomerForm.vue
+++ b/src/views/demo/form/CustomerForm.vue
@@ -1,22 +1,43 @@
 <template>
   <PageWrapper title="鑷畾涔夌粍浠剁ず渚�">
     <CollapseContainer title="鑷畾涔夎〃鍗�">
-      <BasicForm @register="register" @submit="handleSubmit">
-        <template #f3="{ model, field }">
-          <a-input v-model:value="model[field]" placeholder="鑷畾涔塻lot" />
+      <BasicForm class="local_form" @register="register" @submit="handleSubmit">
+        <template #f3="{ model, field, disabled }">
+          <a-input v-model:value="model[field]" :disabled="disabled" placeholder="鑷畾涔塻lot" />
+        </template>
+        <template #colSlot_field5="{ model, field, disabled }">
+          <FormItem :name="field" label="鑷畾涔塩olSlot" :rules="[{ required: true }]">
+            <a-input
+              v-model:value="model[field]"
+              :disabled="disabled"
+              placeholder="鑷畾涔塩olSlot"
+            />
+          </FormItem>
         </template>
       </BasicForm>
     </CollapseContainer>
   </PageWrapper>
 </template>
-<script lang="ts">
-  import { defineComponent, h } from 'vue';
-  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
-  import { CollapseContainer } from '/@/components/Container/index';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { Input } from 'ant-design-vue';
-  import { PageWrapper } from '/@/components/Page';
+<script lang="tsx" setup>
+  import { h } from 'vue';
+  import { BasicForm, FormSchema, useForm } from '@/components/Form';
+  import { CollapseContainer } from '@/components/Container';
+  import { useMessage } from '@/hooks/web/useMessage';
+  import { Input, FormItem, FormItemRest, Select } from 'ant-design-vue';
+  import { PageWrapper } from '@/components/Page';
 
+  const custom_typeKey2typeValueRules = (model) => {
+    return [
+      {
+        required: true,
+        validator: async () => {
+          if (!model.typeKey) return Promise.reject('璇烽�夋嫨绫诲瀷');
+          if (!model.typeValue) return Promise.reject('璇疯緭鍏ユ暟鎹�');
+          Promise.resolve();
+        },
+      },
+    ];
+  };
   const schemas: FormSchema[] = [
     {
       field: 'field1',
@@ -25,14 +46,18 @@
       colProps: {
         span: 8,
       },
+      dynamicDisabled: ({ values }) => {
+        return !!values.field_disabled;
+      },
       rules: [{ required: true }],
-      render: ({ model, field }) => {
+      render: ({ model, field }, { disabled }) => {
         return h(Input, {
           placeholder: '璇疯緭鍏�',
           value: model[field],
-          onChange: (e: ChangeEvent) => {
+          onChange: (e) => {
             model[field] = e.target.value;
           },
+          disabled,
         });
       },
     },
@@ -43,43 +68,180 @@
       colProps: {
         span: 8,
       },
+      dynamicDisabled: ({ values }) => {
+        return !!values.field_disabled;
+      },
       rules: [{ required: true }],
-      renderComponentContent: () => {
+      renderComponentContent: (_, { disabled }) => {
         return {
-          suffix: () => 'suffix',
+          suffix: () => (disabled ? 'suffix_disabled' : 'suffix_default'),
         };
       },
     },
     {
       field: 'field3',
-      component: 'Input',
       label: '鑷畾涔塖lot',
       slot: 'f3',
       colProps: {
         span: 8,
       },
+      dynamicDisabled: ({ values }) => {
+        return !!values.field_disabled;
+      },
       rules: [{ required: true }],
     },
+    {
+      field: 'field4',
+      component: 'Input',
+      // label: 'renderColContent娓叉煋',
+      /**!!!renderColContent 娌℃湁FormItem 鍖呰9, 鑻ユ兂瑕� Form 鎻愪氦闇�瑕佸甫涓婃暟鎹』 <FormItem name={}></FormItem> 鍖呰9锛� 绀轰緥濡備笅*/
+      renderColContent({ model, field }, { disabled }) {
+        return (
+          <FormItem name="field4" label="renderColContent娓叉煋" rules={[{ required: true }]}>
+            <Input placeholder="璇疯緭鍏�" v-model:value={model[field]} disabled={disabled}></Input>
+          </FormItem>
+        );
+      },
+      colProps: {
+        span: 8,
+      },
+      dynamicDisabled: ({ values }) => {
+        return !!values.field_disabled;
+      },
+    },
+    {
+      field: 'field5',
+      component: 'Input',
+      label: '鑷畾涔塩olSlot',
+      /**!!!renderColContent 娌℃湁FormItem 鍖呰9, 鑻ユ兂瑕� Form 鎻愪氦闇�瑕佸甫涓婃暟鎹』 <FormItem name={}></FormItem> 鍖呰9锛� 绀轰緥濡備笅*/
+      colSlot: 'colSlot_field5',
+      colProps: {
+        span: 8,
+      },
+      dynamicDisabled: ({ values }) => {
+        return !!values.field_disabled;
+      },
+    },
+    // 澶嶅悎field 鍦烘櫙 鑷畾涔夎〃鍗曟帶浠� 涓�涓帶浠跺寘鍚涓〃鍗曞綍鍏� 绀轰緥: 閫夋嫨+杈撳叆
+    {
+      required: true,
+      field: 'typeKey2',
+      defaultValue: '娴嬭瘯绫诲瀷',
+      fields: ['typeValue2'],
+      defaultValueObj: { typeValue2: '榛樿娴嬭瘯_鏂囧瓧' },
+      component: 'Input',
+      label: '澶嶅悎field render',
+      render({ model, field }, { disabled }) {
+        return (
+          <Input.Group compact>
+            <Select
+              disabled={disabled}
+              style="width: 120px"
+              allowClear
+              v-model:value={model[field]}
+            >
+              <Select.Option value="娴嬭瘯绫诲瀷">娴嬭瘯绫诲瀷</Select.Option>
+              <Select.Option value="娴嬭瘯鍚嶇О">娴嬭瘯鍚嶇О</Select.Option>
+            </Select>
+            <FormItem name="typeValue2" class="local_typeValue" rules={[{ required: true }]}>
+              <FormItemRest>
+                <Input
+                  placeholder="璇疯緭鍏�"
+                  v-model:value={model['typeValue2']}
+                  disabled={disabled}
+                />
+              </FormItemRest>
+            </FormItem>
+          </Input.Group>
+        );
+      },
+      colProps: {
+        span: 8,
+      },
+      dynamicDisabled: ({ values }) => {
+        return !!values.field_disabled;
+      },
+    },
+    // 澶嶅悎field 鍦烘櫙 鑷畾涔夎〃鍗曟帶浠� 涓�涓帶浠跺寘鍚涓〃鍗曞綍鍏� 绀轰緥: 閫夋嫨+杈撳叆
+    {
+      field: 'typeKey',
+      defaultValue: '鍏徃鍚嶇О',
+      fields: ['typeValue'],
+      defaultValueObj: { typeValue: '榛樿鏂囧瓧' },
+      component: 'Input',
+      // label: 'renderColContent娓叉煋',
+      /**!!!renderColContent 娌℃湁FormItem 鍖呰9, 鑻ユ兂瑕� Form 鎻愪氦闇�瑕佸甫涓婃暟鎹』 <FormItem name={}></FormItem> 鍖呰9锛� 绀轰緥濡備笅*/
+      renderColContent({ model, field }, { disabled }) {
+        return (
+          <FormItem
+            name="typeKey"
+            label="澶嶅悎field renderColContent"
+            rules={custom_typeKey2typeValueRules(model)}
+          >
+            <Input.Group compact>
+              <Select
+                allowClear
+                disabled={disabled}
+                style="width: 120px"
+                v-model:value={model[field]}
+              >
+                <Select.Option value="鍏徃鍚嶇О">鍏徃鍚嶇О</Select.Option>
+                <Select.Option value="浜у搧鍚嶇О">浜у搧鍚嶇О</Select.Option>
+              </Select>
+              <FormItemRest>
+                <Input
+                  style="width: calc(100% - 120px); margin-left: -1px;"
+                  placeholder="璇疯緭鍏�"
+                  v-model:value={model['typeValue']}
+                  disabled={disabled}
+                />
+              </FormItemRest>
+            </Input.Group>
+          </FormItem>
+        );
+      },
+      colProps: {
+        span: 16,
+      },
+      dynamicDisabled: ({ values }) => {
+        return !!values.field_disabled;
+      },
+    },
+    {
+      field: 'field_disabled',
+      component: 'Switch',
+      label: '鏄惁绂佺敤 缂栬緫瀛楁',
+      colProps: {
+        span: 8,
+      },
+      labelWidth: 200,
+    },
   ];
-  export default defineComponent({
-    components: { BasicForm, CollapseContainer, PageWrapper, [Input.name]: Input },
-    setup() {
-      const { createMessage } = useMessage();
-      const [register, { setProps }] = useForm({
-        labelWidth: 120,
-        schemas,
-        actionColOptions: {
-          span: 24,
-        },
-      });
-      return {
-        register,
-        schemas,
-        handleSubmit: (values: any) => {
-          createMessage.success('click search,values:' + JSON.stringify(values));
-        },
-        setProps,
-      };
+  const { createMessage } = useMessage();
+
+  const [register] = useForm({
+    labelWidth: 120,
+    schemas,
+    actionColOptions: {
+      span: 24,
     },
   });
+
+  function handleSubmit(values: any) {
+    console.log('submit values', values);
+    createMessage.success('click search,values:' + JSON.stringify(values));
+  }
 </script>
+
+<style lang="less" scoped>
+  :deep(.local_form) .local_typeValue {
+    width: calc(100% - 120px);
+    margin-bottom: 0;
+    margin-left: -1px;
+    border-right: 0;
+
+    .ant-input {
+      border-radius: 0 6px 6px 0;
+    }
+  }
+</style>

--
Gitblit v1.9.3