vue3+elementPlus+ts封装form表单组件

本文介绍了如何在Vue3项目中结合ElementPlus库和TypeScript来封装自定义的form表单组件,以应对大量表单字段的情况。组件通过动态生成组件并利用props和emits实现数据的双向绑定,减少了重复代码并提高了代码可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、前言

因近期项目中涉及大量的表单字段(一个表单多达40-50个字段)的页面现象存在,因此为了减少大量CV操作(当然封装了之后也少不了CV)和避免自己在写的时候迷失在代码块中,故封装了该form表单组件,下面将会贴出简化版代码(仅供参考)。

2、form表单组件部分

2.1、组件目录结构如下图所示

在这里插入图片描述

2.2、各个文件代码如下

Item.vue文件
<template>
  <component :is="getComponent" />
</template>
<script lang="ts" setup>
import { h } from 'vue';
import { formItemMap } from '../config';
const props = defineProps({
  itemProps: {
    type: Object,
    default: () => ({}),
  },
  modelValue: {
    type: [String, Number, Object, Array],
  },
})
const emits = defineEmits(['changeVal'])

const getComponent = () => {
  return h(formItemMap.get(props.itemProps.type), {
    modelValue: props.modelValue,
    ...props.itemProps.props,
    ['onUpdate:modelValue']: (val: any) => {
      emitChange({
        key: props.itemProps,
        value: val,
      });
    },
    
  });
};
const emitChange = (obj: object) => {
  emits('changeVal', { ...obj });
};
</script>

<style lang="scss" scoped></style>

config.ts文件
import type { VNode } from 'vue'
//基础组件类型
type formItemType = 'input' | 'datePicker'
//表单基础配置接口
export interface formItemInter {
  //此外段为formItem上的属性
  type: formItemType
  label: string
  name: string
  rules?: Array<object>
  width?: string
  //props配置为用到的组件上的属性
  props?: {
    disabled?: boolean
    placeholder?: string
    name?: string
    'value-format'?: string
    type?: string
    size?: string
    clearable?: boolean
    'default-value'?: any
    'default-time'?: any
  }
  render?: (renderCallbackParams: any) => VNode | VNode[] | string
}

import { ElInput, ElDatePicker } from 'element-plus'

export const formItemMap = new Map()
formItemMap.set('input', ElInput)
formItemMap.set('datePicker', ElDatePicker)

index.vue文件
<template>
    <el-form :model="formState" ref="formRef">
        <el-form-item v-for="item in formItems" :key="item.name" :label="item.label">
            <Item :itemProps="item" :modelValue="formState[item.name]" @changeVal="changeVal" @changeItemCom="changeCom"/>
        </el-form-item>
    </el-form>
</template>

<script lang="ts" setup>
import Item from './formItem/Item.vue';
import { formItemInter } from './config';
const emits = defineEmits(['changeCom']);
//外部传入的需求项
const props = defineProps({
    //表单参数项
    formItems: {
        type: Array<formItemInter>,
        default: () => [],
    },
    //表单对应的值
    formState: {
        type: Object,
        default: () => ({}),
    },
});
//数据改变时的双向绑定
const changeVal = (obj:any) => {
    console.log(props.formState,'数据双向绑定');
    props.formState[obj.key.name] = obj.value;
    // emits('change', obj);
  };
  //数据改变时的抛出其他需要的数据
  const changeCom = (obj:any) => {
    emits('changeCom', obj);
  };
</script>

<style lang="scss" scoped></style>

3、组件使用例子如下

  • .vue文件
<template>
    <MyForm :formItems="editFormItem" :formState="formArr.data"></MyForm>
</template>

<script lang="ts" setup>
import { editFormItem } from './work.data';
import { reactive } from 'vue'
const formArr = reactive({
    data: {}
})
</script>

<style lang="scss" scoped></style>

  • XX.data.ts文件
import { formItemInter } from '@/components/form/config';
import { reactive } from 'vue';
export const editFormItem: Array<formItemInter> = reactive([
  {
    type: 'input',
    label: '常驻人口',
    name: 'iptval',
    props: {
      placeholder: '请输入',
    },
  },
  {
    type: 'datePicker',
    label: '时间选择',
    name: 'iptval1',
    props: {
      type: 'datetime',
      placeholder: '请选择时间',
      'value-format' : 'YYYY-MM-DD HH:mm:ss',
    },
  },
]);

最后,如有不足和改进之处,还望指出

你可以尝试以下步骤来封装一个Vue 3TypeScript下使用Element Plus表单提交组件: 1. 安装必要的依赖: - Vue 3:`npm install vue@next` - TypeScript:`npm install -D typescript` - Element Plus:`npm install element-plus` 2. 创建一个新的Vue组件,并为其选择一个合适的名称,例如`FormSubmit.vue`。 3. 在`FormSubmit.vue`文件中,导入必要的模块和样式: ```vue <template> <!-- 表单内容 --> </template> <script lang="ts"> import { defineComponent } from &#39;vue&#39;; import { ElButton, ElForm, ElFormItem } from &#39;element-plus&#39;; export default defineComponent({ components: { ElButton, ElForm, ElFormItem, }, }); </script> <style scoped> /* Element Plus 样式 */ @import &#39;element-plus/packages/theme-chalk/src/index.scss&#39;; /* 自定义样式 */ /* ... */ </style> ``` 4. 在模板中编写表单内容,并使用Element Plus组件来构建表单: ```vue <template> <el-form ref="form" :model="formData" label-width="120px"> <el-form-item label="姓名" prop="name"> <el-input v-model="formData.name"></el-input> </el-form-item> <!-- 更多表单项 --> <el-form-item> <el-button type="primary" @click="submitForm">提交</el-button> </el-form-item> </el-form> </template> <script lang="ts"> // ... export default defineComponent({ // ... data() { return { formData: { name: &#39;&#39;, // 更多表单字段 } }; }, methods: { submitForm() { // 表单提交逻辑 if (this.$refs.form.validate()) { // 表单验证通过,执行提交操作 // ... } } } }); </script> ``` 这样,你就可以使用封装好的表单提交组件来方便地处理表单提交了。你可以根据实际需求添加更多的表单项,并在`submitForm`方法中实现你的提交逻辑。希望这可以帮到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值