vue-antd对表单的简单封装

需求原因

  1. 在需求中大量出现表单,每次重写都有些费时,而且dom会很乱
  2. 功能基本类似,接受数据回显、发送数据

封装(仅做了常规input兼容)

<template>
  <div>
    <a-modal
      :title="formConfig.name"
      :visible="visible"
      @cancel="visible = false"
      @ok="submit()"
      width="600px"
      :mask-closable="false"
      :keyboard="false"
    >
      <a-form :form="form">
        <a-form-item
          v-bind="layout"
          v-for="(item,index) in formConfig.item"
          :key="index"
          :label="item.nameCn"
        >
          <a-input
            v-decorator="[item.name, {
              rules: [{required: true, message: `请输入${item.nameCn}`}]
            }]"
            :disabled="item.disabled"
          />
        </a-form-item>
      </a-form>
    </a-modal>
  </div>
</template>
<script>
export default {
  props: {
    formConfig: {
      required: true,
      type: Object
    }
  },
  data() {
    return {
      form: this.$form.createForm(this),
      visible: false,
      layout: { labelCol: { span: 6 }, wrapperCol: { span: 16 } }
    };
  },
  methods: {
    handleOpenForm(obj = []) {
      this.form.resetFields();
      this.visible = true;
      setTimeout(() => {
        this.form.setFieldsValue(obj);
      }, 100);
    },
    submit() {
      this.form.validateFields((err, values) => {
        if (err) {
          return;
        }
        this.$emit('submit', values);
      });
    }
  }
};
</script>

使用示例

<!-- 运维配置表单 -->
<easy-model-form
  :form-config="peonForm"
  ref="peonForm"
  @submit="submit"
/>

// 可以调整这里的属性来进行配置
const PEON_FORM = [
  {
    name: 'id',
    nameCn: 'id',
    disabled: true
  }, {
    name: 'tenant_id',
    nameCn: '租户id',
    disabled: true
  }, {
    name: 'peon_url',
    nameCn: 'peon_url',
    disabled: false
  }
];
data() {
  return {
    peonForm: {
        name: '运维配置表单',
        item: PEON_FORM
    }
  }
}

// 打开表单
this.$refs.peonForm.handleOpenForm(res.data);
首先,你需要安装 `ant-design-vue` 和 `vue3` 。 ``` npm install ant-design-vue@next npm install vue@next ``` 然后,你可以创建一个表单组件 `Form.vue` : ```vue <template> <a-form :form="form" @submit="handleSubmit"> <slot /> </a-form> </template> <script> import { defineComponent, ref } from 'vue'; import { Form } from 'ant-design-vue'; export default defineComponent({ components: { Form }, props: { initialValues: Object, onFinish: Function, onFinishFailed: Function, }, setup(props, { emit }) { const form = ref(null); const handleSubmit = (e) => { e.preventDefault(); form.value .validateFields() .then((values) => { if (props.onFinish) { props.onFinish(values); } }) .catch((error) => { if (props.onFinishFailed) { props.onFinishFailed(error); } }); }; return { form, handleSubmit, }; }, }); </script> ``` 在这个表单组件中,我们使用了 `a-form` 组件和插槽。我们为 `a-form` 组件绑定了 `form` 对象和 `submit` 事件。在组件的 `setup` 函数中,我们定义了一个 `form` 的引用,并且定义了一个 `handleSubmit` 函数,用于处理表单的提交事件。 接下来,我们可以创建一个表单项组件 `FormItem.vue` : ```vue <template> <a-form-item :label="label" :name="name" :rules="rules"> <slot /> </a-form-item> </template> <script> import { defineComponent } from 'vue'; import { FormItem } from 'ant-design-vue'; export default defineComponent({ components: { FormItem }, props: { label: String, name: String, rules: Array, }, }); </script> ``` 在这个表单项组件中,我们使用了 `a-form-item` 组件和插槽。我们为 `a-form-item` 组件绑定了 `label`、`name` 和 `rules` 属性。 现在,我们可以在 `Form.vue` 组件中使用 `FormItem.vue` 组件来创建表单项了: ```vue <template> <Form :form="form" @submit="handleSubmit"> <FormItem label="Username" name="username" :rules="[{ required: true, message: 'Please input your username' }]"> <a-input v-model:value="formData.username" /> </FormItem> <FormItem label="Password" name="password" :rules="[{ required: true, message: 'Please input your password' }]"> <a-input-password v-model:value="formData.password" /> </FormItem> <FormItem> <a-button type="primary" html-type="submit">Submit</a-button> </FormItem> </Form> </template> <script> import { defineComponent, reactive } from 'vue'; import Form from './Form.vue'; import FormItem from './FormItem.vue'; export default defineComponent({ components: { Form, FormItem }, setup() { const formData = reactive({ username: '', password: '', }); const handleSubmit = (values) => { console.log(values); }; return { formData, handleSubmit, }; }, }); </script> ``` 在这个例子中,我们创建了两个表单项:用户名和密码。我们使用 `v-model` 指令将表单数据绑定到 `formData` 对象上。我们也定义了一个 `handleSubmit` 函数,在表单提交时输出表单数据。 最后,我们需要在 `main.js` 文件中引入 `ant-design-vue` 组件库和 `Form.vue` 组件: ```js import { createApp } from 'vue'; import App from './App.vue'; import Antd from 'ant-design-vue'; import 'ant-design-vue/dist/antd.css'; import Form from './components/Form.vue'; const app = createApp(App); app.use(Antd); app.component('Form', Form); app.mount('#app'); ``` 现在,我们就可以在 Vue 3 中使用 Ant Design Vue表单组件了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值