iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue 封装一个高质量的表单通用组件
  • 933
分享到

vue 封装一个高质量的表单通用组件

vue 封装表单通用组件vue 封装表单 2023-03-10 11:03:11 933人浏览 薄情痞子
摘要

目录正文基于Element-plus实现二次封装表单组件步骤1步骤2富文本表单项封装上传表单项封装同行多个表单布局封装步骤3总结正文 我们都知道表单组件应该是后台管理系统中用得最多

正文

我们都知道表单组件应该是后台管理系统中用得最多的组件,我们不可能每个业务都写一次表单,然后每一次修改都去各自业务中大幅修改,这样就可能导致代码重复率太高了,工作效率频频降低,所以我们需要封装起来,这样我们就可以复用,大大减少项目体积,方便项目的后期维护,提高前端娃的工作效率。由于我们使用表单都是直接使用UI组件库的组件,所以我们需要做二次封装,那么问题来了,二次封装表单组件我们需要考虑什么?

基于Element-plus实现二次封装表单组件

  • 特性复用:必须继承原有组件的所有特性。
  • 命名规范:二次组件名必须见名知意,我们一般都是起一个公用名+原有组件名,比如lib-fORM
  • 接口简单:自定义暴露出来的接口越简单越好。
  • 容易拓展:留有自定义插槽,让用户可以自己选择。
  • 功能完善:具备更完善的功能如:表单验证、动态删减表单,集成第三方的插件(富文本)...
  • 场景通用:具备多个场景使用,比如弹框嵌套表单、页面嵌套表单。

封装一个高质量的通用组件,上面是真的只是基操,话不多说,直接上实践手把手教你封装组件。

步骤1

继承原有组件的所有特性(这也是封装的核心)。先明确三个大方向:

表单固定属性,继承Form表单的所有属性、方法。

 // 定义el-form的ref继承原有组件的form属性
 export interface FormInstance {
  reGISterLabelWidth(width: number, oldWidth: number): void,
  deregisterLabelWidth(width: number): void,
  autoLabelWidth: string | undefined,
  emit: (evt: string, ...args: any[]) => void,
  labelSuffix: string,
  inline?: boolean,
  model?: Record<string, unknown>,
  size?: string,
  showMessage?: boolean,
  labelPosition?: string,
  labelWidth?: string,
  rules?: Record<string, unknown>,
  statusIcon?: boolean,
  hideRequiredAsterisk?: boolean,
  disabled?: boolean,
  validate: (callback?: Callback) => Promise<boolean>,
  resetFields: () => void,
  clearValidate: (props?: string | string[]) => void,
  validateField: (props: string | string[], cb: ValidateFieldCallback) => void,
}

表单项固定属性,继承表单项的所有属性、方法。

// 表单每一项的配置选项
export interface FormOptions {
  // 表单项显示的元素
  type: '',// 定义表单项类型
  value?: any, // 表单项的值
  label?: string,// 表单项label
  prop?: string,// 表单项的标识
  rules?: RuleItem[],// 表单项的验证规则
  placeholder?: string,// 表单项的占位符
  attrs?: {  // 按需定义不同表单类型属性
    ...
  },
  children?: FormOptions[],// 表单项的子元素,可能存在嵌套表单组件,如select
  ....// 适当扩展我们需要的属性,比如上传组件属性,行布局表单属性
}

由于Element-plus组件都是以el-为前缀,所以type取值只需要取el-后面部分作为值就行,比如el-input取 'input' 为值。

表单验证效果,继承组件原有的所有验证属性。由于Element-plus的验证都是使用 async-validator 这个插件的验证方法,直接复用插件源码路径async-validator/src/interface.ts文件下的所有代码:

// 核心代码:封装验证方式时的属性
export interface RuleItem {
  type?: RuleType; // 验证种类
  required?: boolean;// 是否必填
  pattern?: RegExp | string;// 验证方式匹配
  min?: number; // 表单项最小值
  max?: number; // 表单项最大值
  len?: number; // 表单项字符长度
  trigger?: string | string[];// 验证触发方式
  ....
}

步骤2

实现一个完善的通用组件封装,通过对标签封装、接口 暴露、开发者传参等。明确表单类型,根据不同类型表单复用多种场景,不仅开发者用户拓展,而且,让开发者用最少代码就可以复用:

<!--表单框架:model就是传入的表单对象,rules就是传入的验证对象 -->
  <el-form
    v-if="model"
    :validate-on-rule-change="false"
    v-bind="$attrs"
    :model="model"
    :rules="rules"
    ref="form"
  >
    ... <!--表单项封装 -->
  </el-form>

普通表单项封装,比如日期、输入等组件。

<template v-for="(item, index) in options" :key="index">
    <el-form-item  :label="item.label" :prop="item.prop">
      <component
        v-else
        :is="`el-${item.type}`"
        v-bind="item.attrs"
        v-model="model[item?.prop!]"
      >
      </component>
    </el-form-item>
</template>

嵌套表单项封装,比如下拉框,除了select组件还嵌套option组件。

<template v-for="(item, index) in options" :key="index">
    <el-form-item
      v-if="item.children && item.children.length"
      :label="item.label"
      :prop="item.prop"
    >
      <component
        :is="`el-${item.type}`"
        v-bind="item.attrs"
        v-model="model[item?.prop!]"
      >
        <component
          v-for="(child, i) in item.children"
          :key="i"
          :label="child.label"
          :value="child.value"
          :is="`el-${child.type}`"
        >
        </component>
      </component>
    </el-form-item>
</template>

富文本表单项封装

本文使用的是wangEditor。

<div id="editor" v-else-if="item.type === 'editor'"></div>
import E from 'wangeditor';
// 遍历传入的prop的options对象,初始化富文本
if (item.type === 'editor') {
// 初始化富文本
nextTick(() => {
  if (document.getElementById('editor')) {
    const editor = new E('#editor');
    editor.config.placeholder = item.placeholder!;
    editor.create();
    // 初始化富文本的内容
    editor.txt.html(item.value);
    editor.config.onchange = (newHtml: string) => {
      model.value[item.prop!] = newHtml;
    };
    edit.value = editor;
  }
});
}

上传表单项封装

向开发者暴露上传的核心方法:预览、删除、上传成功等,同时允许开发者自定义上传信息以及渲染区域等。

<el-form-item  :label="item.label" :prop="item.prop">
  <!-- 上传表单 -->
  <el-upload
    v-if="item.type === 'upload'"
    v-bind="item.uploadAttrs"
    :on-preview="onPreview"
    :on-remove="onRemove"
    :on-success="onSuccess"
    :on-error="onError"
    :on-progress="onProgress"
    :on-change="onChange"
    :before-upload="beforeUpload"
    :before-remove="beforeRemove"
    :Http-request="httpRequest"
  >
    <slot name="uploadArea"></slot>
    <slot name="uploadTip"></slot>
  </el-upload>
</el-form-item>

同行多个表单布局封装

有时业务需要,一行可以定义多个表单,所以需要使用el-row,此时需要修改FormOptions属性接口,完善多个表单场景,cols是一个数组定义FormOptions数组,colOption是el-col组件的相关属性,然后重新复用嵌套表单的代码。

<template v-if="item.type === 'row'">
    <el-row :gutter="item.rowGutter">
    <el-col
    v-for="(jtem, jndex) in item.cols"
    v-bind="jtem.colOption"
    :key="jndex"
    >
    <el-form-item :label="jtem.label" :prop="jtem.prop">
      <component
        :is="`el-${jtem.type}`"
        v-bind="jtem.attrs"
        v-model="model[jtem?.prop!]"
      >
        <template v-if="jtem.children && jtem.children.length">
          <component
            v-for="(child, i) in jtem.children"
            :key="i"
            :label="child.label"
            :value="child.value"
            :is="`el-${child.type}`"
          >
          </component>
        </template>
      </component>
    </el-form-item>
    </el-col>
    </el-row>
</template>
  • 自定义插槽:开发者可以根据需要,在封装的el-form中添加插槽,可以允许组件功能的拓展,我们可以根据自己需要进行封装,这里就不一一演示了。

提交取消按钮区域:这个最好可以实现插槽让开发者可以自定义。

<el-form-item>
      <slot name="action" :form="form" :model="model"></slot>
</el-form-item>

步骤3

开发者的调用封装组件,通过配置不同表单类型的数组,然后调用lib-form封装组件实现业务代码复用。

组件的调用:根据业务需要,可以适当定义我们需要的组件属性以及必须要传的参数。

<lib-form
  ref="form"
  label-width="100px"
  :options="options"
  @on-change="handleChange"
  @before-upload="handleBeforeUpload"
  @on-preview="handlePreview"
  @on-remove="handleRemove"
  @before-remove="beforeRemove"
  @on-success="handleSuccess"
  @on-exceed="handleExceed"
>
  <template #uploadArea>
    <el-button size="small" type="primary">Click to upload</el-button>
  </template>
  <template #uploadTip>
    <div style="color: #ccc; font-size: 12px">
      jpg/png files with a size less than 500kb
    </div>
  </template>
  <template #action="scope">
    <el-button type="primary" @click="submitForm(scope)">提交</el-button>
    <el-button @click="resetForm">重置</el-button>
  </template>
</lib-form>

表单项的配置数组:由于这配置数组比较长,所以一般可以单独抽离出来,不要写在Vue文件中,这样可以提高代码的可读性。

// 这里以多行表单布局为例子
let options: FormOptions[] = [
  {
    type: 'row',
    rowGutter: 20,
    cols: [
      {
        type: 'input',
        value: '',
        label: '用户名',
        prop: 'username',
        placeholder: '请输入用户名',
        rules: [
          {
            required: true,
            message: '用户名不能为空',
            trigger: 'blur',
          },
          {
            min: 2,
            max: 6,
            message: '用户名在2-6位之间',
            trigger: 'blur',
          },
        ],
        attrs: {
          clearable: true,
        },
        colOption: {
          offset: 0,
          span: 12,
        },
      },
      {
        type: 'input',
        value: '',
        label: '用户名',
        prop: 'username',
        placeholder: '请输入用户名',
        rules: [
          {
            required: true,
            message: '用户名不能为空',
            trigger: 'blur',
          },
          {
            min: 2,
            max: 6,
            message: '用户名在2-6位之间',
            trigger: 'blur',
          },
        ],
        attrs: {
          clearable: true,
        },
        colOption: {
          offset: 0,
          span: 12,
        },
      },
    ],
  },
 ]

总结

UI组件二次封装其实不难,只要我们能掌握基本语法,就可以根据业务场景去封装我们需要的组件,然后在慢慢去完善这个组件的功能。只要遵循这些原则:命名规范、组件通用、特性继承、场景通用、接口简单、兼容性强、功能完善。

以上就是vue 封装一个高质量的表单通用组件的详细内容,更多关于vue 封装表单通用组件的资料请关注编程网其它相关文章!

--结束END--

本文标题: vue 封装一个高质量的表单通用组件

本文链接: https://www.lsjlt.com/news/199255.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue 封装一个高质量的表单通用组件
    目录正文基于Element-plus实现二次封装表单组件步骤1步骤2富文本表单项封装上传表单项封装同行多个表单布局封装步骤3总结正文 我们都知道表单组件应该是后台管理系统中用得最多...
    99+
    2023-03-10
    vue 封装表单通用组件 vue 封装表单
  • vue如何封装一个高质量的表单通用组件
    这篇“vue如何封装一个高质量的表单通用组件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue如何封装一个高质量的表单通用...
    99+
    2023-07-05
  • 开发一个封装iframe的vue组件
    目录一、组件介绍 二、组件内部结构及逻辑 1、代码组织结构2、地图组件三、iframe接口 四、外部接口 五、运行结果六、总结 VUE的基本组成单元,我看应该是组件。用VUE开发前端...
    99+
    2024-04-02
  • vue中使用render封装一个select组件
    目录使用render封装一个select组件vue另类封装--render函数封装先看看文件的结构render函数封装使用render封装一个select组件 父组件 val...
    99+
    2024-04-02
  • 基于Vue实现封装一个虚拟列表组件
    目录组件效果属性插槽封装过程滚动条正常显示加载渲染大量数据不卡顿能对列表数据进行操作增删等完整代码待完善正常情况下,我们对于数据都会分页加载,最近项目中确实遇到了不能分页的场景,如果...
    99+
    2023-03-07
    Vue封装虚拟列表组件 Vue 虚拟列表组件 Vue 虚拟列表
  • 基于Vue如何封装一个虚拟列表组件
    今天小编给大家分享一下基于Vue如何封装一个虚拟列表组件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。组件效果使用方法<...
    99+
    2023-07-05
  • vue二次封装一个高频可复用组件的全过程
    目录前言继承原有组件接口v-model插槽组件更抽象总结前言 在我们的业务里,我们通常会二次封装一些高频业务组件,比如弹框,抽屉,表单等这些业务组件,为什么要二次封装?我们所有人心里...
    99+
    2022-11-13
    vue如何二次封装组件 vue组件封装并复用 vue的组件复用机制
  • vue封装form表单组件拒绝重复写form表单
    目录前言核心思想:实现重点:表单双向绑定的方式有两种: 1.使用v-model进行双向绑定2.使用v-model的语法糖配置项整体字段:效果浏览源码放送1. baseFor...
    99+
    2024-04-02
  • vue封装一个弹幕组件详解
    目录前言功能实现1、获取随机颜色随机数生成随机颜色编码生成2、随机生成弹幕出现的高度坐标3、格式化弹幕对象颜色定位4、创建弹幕对象滚动动画定义创建弹幕dom对象实例弹幕销毁弹幕循环5...
    99+
    2022-11-13
    vue封装弹幕组件 vue封装组件
  • 如何开发一个封装iframe的vue组件
    这篇文章给大家分享的是有关如何开发一个封装iframe的vue组件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。VUE的基本组成单元,我看应该是组件。用VUE开发前端项目,就是开发一个个组件,然后搭积木一样,将项...
    99+
    2023-06-14
  • vue封装一个图案手势锁组件
    目录说在前面效果展示预览地址实现步骤1.组件设计2.组件分析3.组件实现4.组件使用组件库引用源码地址组件文档说在前面 现在很多人都喜欢使用图案手势锁,这里我使用vue来封装了一个可...
    99+
    2024-04-02
  • 利用Vue3封装一个弹框组件简单吗
    目录总结放前面: 前言:公共全局弹框结语:总结放前面: Tipes: 封装弹框组件使用了Teleport,避免了组件嵌套可能导致的定位层级的隐患,还使用了defineProps,de...
    99+
    2024-04-02
  • Vue封装通用table组件的详细步骤
    本篇内容介绍了“Vue封装通用table组件的详细步骤”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录前言为什么需要封装table组件?定...
    99+
    2023-06-20
  • vue tree封装一个可选的树组件方式
    目录组件实现的基本功能先看效果图组件实现的基本功能 1,根据后端返回的数据格式,传入组件动态的渲染出当前角色有哪些权限(新建,修改) 2,适配有2级和只有一级多选的数据 3,有全选(...
    99+
    2024-04-02
  • vue中怎么封装一个弹出框组件
    这期内容当中小编将会给大家带来有关vue中怎么封装一个弹出框组件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.你需要先建一个弹出框的模板://首先创建一个mack.v...
    99+
    2024-04-02
  • Vue实现封装一个切片上传组件
    目录组件效果使用文档封装过程1. 文件切片2. 构造切片请求参数3. 控制分片请求的并发完整代码待完善组件效果 单文件切片上传 多文件切片上传 组件使用案例 <templa...
    99+
    2023-03-19
    Vue封装切片上传组件 Vue切片上传组件 Vue切片上传
  • Vue3+ElementPlus表单组件的封装实例
    目录form文件夹FormItem.tsx在页面中引用总结在系统中,表单作为用户与后端交互的重要传递组件使用频率极高,故对其进行封装是必然的,也是一个编写规范代码的前端程序员必须做的...
    99+
    2024-04-02
  • 使用vue组件封装共用的组件
    目录这里提供两种vue封装共用组件的方法方法一方法二vue封装公共组件调用方法这里提供两种vue封装共用组件的方法 方法一 main.js中 import ListItem from...
    99+
    2024-04-02
  • Vue封装一个Tabbar组件 带组件路由跳转方式
    目录Vue封装Tabbar组件在App.vue 封装 路由跳转 利用router-view的特性子组件Tabbar然后就是配置的路由从零开始封装一个Tabbar首先底部菜单栏最外层是...
    99+
    2024-04-02
  • 怎么封装一个vue自定义日历组件
    这篇文章主要介绍“怎么封装一个vue自定义日历组件”,在日常操作中,相信很多人在怎么封装一个vue自定义日历组件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么封装一个vue自定义日历组件”的疑惑有所帮助!...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作