Vue业务组件封装(二)Form表单

本文详细介绍了如何基于Element UI封装Vue Form组件,包括封装思路、配置文件的创建以及组件的具体实现,旨在提高组件的复用性和扩展性。通过对配置文件的解析,动态生成表单元素,并实现数据的双向绑定和校验功能。

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

前言

这个系列主要是分享自己在工作中常用到的业务组件,以及如何对这些组件进行有效的封装和封装的思路。注:都是基于element ui进行二次封装。

封装组件的基本方法就是通过props和emit进行父子组件的传值和通信。利用插槽、组件等增加组件的可扩展性和复用性。

Form组件介绍

Form表单包含 输入框, 单选框, 下拉选择, 多选框 等用户输入的组件。使用表单,可以收集、验证和提交数据。

表单常用的地方是在搜索、信息提交、内容编辑以及新增。

搜索表单

搜索表单

编辑表单

编辑表单

Form组件封装思路

了解element Form组件代码

这里以最基本的Form代码为例进行分析:

<template>
  <el-form label-width="120px" ref="ruleFormRef" :model="ruleForm" :rules="rules">
    <el-form-item label="Activity name">
      <el-input v-model="form.name" />
    </el-form-item>
    <el-form-item label="Activity zone">
      <el-select v-model="form.region" placeholder="please select your zone">
        <el-option label="Zone one" value="shanghai" />
        <el-option label="Zone two" value="beijing" />
      </el-select>
    </el-form-item>
    <el-form-item>
      <el-button type="primary" @click="onSubmit">Create</el-button>
      <el-button>Cancel</el-button>
    </el-form-item>
  </el-form>
</template>
const form = reactive({
  name: '',
  region: ''
}) 

基本表单

基本表单

根据基本的Form代码,我们可以知道:

  1. 整个Form表单数据绑定在el-form上::model=“form”,form就是表单的数据对象。
  2. 表单里面的每一项是放在el-form-item标签里面,放入我们想渲染出来的组件,如输入框,单选等。
  3. 每个el-form-item中可以绑定了prop、label、rules等属性,我们可以在配置文件中配置对应属性的值进行绑定。
Form组件如何去封装

通过分析Form代码我们可以通过一个配置文件去遍历得到el-form-item,然后在el-form-item上面绑定我们需要的属性就可以得到我们想要的表单。

代码实现

配置文件

我们可以在页面文件夹下面新建一个文件夹config用于存放页面需要的各种配置文件,在里面新建我们表单的配置文件formConfig.ts:

import { IForm } from '@/components/Form/types'
import { rules } from '@/utils/validator'
export const modalConfig: IForm = {
  formItems: [
    {
      field: 'name',
      label: '用户名',
      placeholder: '请输入用户名',
      type: 'input',
      rule: [{ required: true, message: 'Please input name', trigger: 'blur' }]
    },
    {
      field: 'realname',
      type: 'input',
      label: '真实姓名',
      placeholder: '请输入真实姓名',
      rule: [
        { required: true, message: 'Please input realname', trigger: 'blur' }
      ]
    },
    {
      field: 'password',
      type: 'password',
      label: '用户密码',
      placeholder: '请输入密码',
      isHidden: false,
      rule: [
        { required: true, message: 'Please input password', trigger: 'blur' }
      ]
    },
    {
      field: 'cellphone',
      type: 'input',
      label: '电话号码',
      placeholder: '请输入电话号码',
      rule: [
        {
          required: true,
          message: '请输入正确手机号码',
          validator: (rule: any, value: any) => /^1\d{10}$/.test(value)
        }
      ]
    },
    {
      field: 'departmentId',
      type: 'select',
      label: '部门',
      placeholder: '请选择部门',
      options: [],
      rule: [
        {
          required: true,
          message: 'Please input departmentId',
          trigger: 'change'
        }
      ]
    },
    {
      field: 'roleId',
      type: 'select',
      label: '角色',
      placeholder: '请选择角色',
      options: [],
      rule: [
    
### Vue3 中封装 Form 表单组件的最佳实践 #### 1. 基本结构设计 为了实现高效且易于维护的表单组件,在构建之初应遵循一定的原则。考虑到特性的复用以及命名规范的重要性,推荐创建名为 `FormPanel` 的组件来作为基础模板[^2]。 ```html <template> <el-form :model="formData" ref="formRef"> <!-- 动态渲染表单项 --> <div v-for="(item, index) in formCfg" :key="index"> <component :is="getComponent(item.type)" v-bind="item.props" v-model="formData[item.prop]" /> </div> <!-- 提交按钮区域 --> <slot name="actions"></slot> </el-form> </template> ``` 此部分代码展示了如何通过遍历配置数组 `formCfg` 来动态生成不同类型的输入控件,并允许外部传入额外的操作按钮以增强灵活性。 #### 2. 配置项解析 对于每一个字段而言,可以通过传递给子组件的对象来进行详细的设定。这些对象包含了诸如标题 (`title`)、初始状态(`editForm`) 和验证规则 (`formRules`) 等属性[^1]。 ```javascript const props = defineProps({ title: { type: String, required: true }, show: Boolean, refName: String, editForm: Object, formRules: Array, labelPosition: { // 可选值 'left', 'right' type: String, default: "top", }, formCfg: Array, formAction: Array }); ``` 上述 JavaScript 定义了父级向 `FormPanel` 发送的数据模型及其预期格式;其中特别注意的是 `labelPosition` 属性指定了标签相对于输入框的位置,默认设置为顶部对齐方式。 #### 3. 方法与事件处理 为了让使用者能够更加便捷地控制表单行为,还需提供一系列实用的方法和监听器。例如: - **resetFields()**: 清除所有已填写的内容并重置错误提示; - **validate(callback)**: 执行完整的校验流程并将结果反馈给调用者。 ```typescript import { ElMessage } from 'element-plus'; // ...其他导入语句... setup(props, context){ const formRef = ref(null); function resetFields(){ if(formRef.value !== null){ formRef.value.resetFields(); } } async function validate(cb?:Function){ try{ await formRef.value.validate((valid:boolean)=>{ cb && cb(valid); }); }catch(error){ console.error('Validation failed:', error); ElMessage.warning('Please check your input!'); } } return { resetFields, validate }; } ``` 这段 TypeScript 实现了两个核心函数——用于初始化界面状态的 `resetFields()` 和负责触发整个表单检验过程的异步方法 `validate()` 。当遇到不符合条件的情况时会给出相应的警告信息。 #### 4. 插槽机制的应用 最后但同样重要的一点是在适当的地方预留插槽(slot),以便于开发者可以根据实际需求灵活调整布局或增加特殊功能模块。比如可以在底部放置一组自定义的动作按钮,从而满足更多样化的应用场景要求。 ```html <!-- 默认情况下只展示关闭按钮 --> <div slot-scope="{ closeDialog }"> <button @click="closeDialog">Cancel</button> <button @click="handleSubmit()">Submit</button> </div> ``` 以上便是关于在 Vue3 上进行表单组件次开发的一个较为全面的例子介绍。希望这能帮助理解如何有效地组织代码逻辑,同时保持良好的扩展性和易读性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值