热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Vue3+ElementPlus 表单组件的封装实例

这篇文章主要介绍了Vue3+ElementPlus 表单组件的封装实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完

在系统中,表单作为用户与后端交互的重要传递组件使用频率极高,故对其进行封装是必然的,也是一个编写规范代码的前端程序员必须做的一件事。

在Vue3中封装组件时,能感受到与Vue2有着很大的不同,故作此记录。

form文件夹

在这里插入图片描述

  • FormItem.tsx文件是Typescript中的新特性之一,详细可查阅TS中文文档
  • index.vue是主体文件
  • type.ts表单的规约

FormItem.tsx

import filter from "@/utils/filters"
import {
  ElCheckbox,
  ElCheckboxGroup,
  ElDatePicker,
  ElInput,
  ElInputNumber,
  ElOption,
  ElRadio,
  ElRadioGroup,
  ElSelect,
  ElTimePicker
} from "element-plus"
import { defineComponent } from "vue"
// 普通显示
const Span = (form: Record, data: Record) => (
  {data.valueProp ? form[data.valueProp] : (data.filter ? filter(form[data.prop], data.filter) : form[data.prop] || "无")}
)
// 输入框
const Input = (form: Record, data: Record) => (
  
  
)
// 数字输入框
const InputNumber = (form: Record, data: Record) => (
  
)
const setLabelValue = (_item: any, { optionsKey }: any = {}) => {
  return {
    label: optionsKey ? _item[optionsKey.label] : _item.label,
    value: optionsKey ? _item[optionsKey.value] : _item.value,
  }
}
// 选择框
const Select = (form: Record, data: Record) => (
  
    {data.options.map((item: any) => {
      return 
    })}
  
)
// 单选/区间日期
const Date = (form: Record, data: Record) => (
  
)
// 单选/区间时间
const Time = (form: Record, data: Record) => (
  
)
// 单选
const Radio = (form: Record, data: Record) => (
  
    {data.radios.map(
      (item: { label: string | number | boolean; value: any }) => {
        return (
          
            {setLabelValue(item, data.prop).value}
          
        )
      },
    )}
  
)
// 多选
const Checkbox = (form: Record, data: Record) => (
  
    {data.checkboxs.map(
      (item: { label: string | number | boolean; value: any }) => {
        return (
          
            {setLabelValue(item, data.prop).value}
          
        )
      },
    )}
  
)
const setFormItem = (
  form: Record | undefined,
  data: Record,
  editable: Boolean,
) => {
  if (!form) return null
  if (!editable) return Span(form, data)
  switch (data.type) {
    case "input":
      return Input(form, data)
    case "textarea":
      return Input(form, data)
    case "password":
      return Input(form, data)
    case "inputNumber":
      return InputNumber(form, data)
    case "select":
      return Select(form, data)
    case "date":
    case "daterange":
      return Date(form, data)
    case "time":
      return Time(form, data)
    case "radio":
      return Radio(form, data)
    case "checkbox":
      return Checkbox(form, data)
    default:
      return null
  }
}
export default () =>
  defineComponent({
    props: {
      data: Object,
      formData: Object,
      editable: Boolean,
    },
    setup(props) {
      return () =>
        props.data
          ? setFormItem(props.formData, props.data, props.editable)
          : null
    },
  })

index.vue

type.ts

type itemType =
  | "input"
  | "select"
  | "switch"
  | "radio"
  | "date"
  | "time"
  | "checkbox"
  | "daterange"
interface FormProps {
  inline?: Boolean
  labelWidth?: string | number
  labelPosition?: "left" | "top" | "right"
  btn?: object[]
}
interface FormItems {
  type: itemType
  label?: string
  prop: string
  valueProp?: string
  width?: string | number
  span?: number
  filter?: string
}
export class commonForm {
  public data: any
  private rules?: object
  public elRowGutter?: number
  public editable?: boolean
  public formProps?: FormProps
  public formItems: FormItems[]
  public dataArray?:object[]
  constructor({
    data = {},
    rules = {},
    editable = true,
    formProps = {},
    formItems = [],
    elRowGutter = 0,
  }: any) {
    this.data = data
    this.rules = rules
    this.elRowGutter = elRowGutter
    this.editable = editable
    this.formItems = formItems
    this.formProps = formProps
  }
}

在页面中引用

在这里插入图片描述

  • changCarrier.vue是主题页面,用来显示表单
  • userForm.ts是对表单进行渲染的数据项

index.vue

useForm

import { commonForm } from "@/components/common/form/type"
import { reactive } from "vue"
export default () => {
  const rules = {
    name: [
      { required: true, message: "人员名称", trigger: "blur" }
    ]
  }
  const form = reactive(
    new commonForm({
      data: [],
      editable: true,
      rules: rules,
      formItems: [
        {
          label: "人员名称",
          type: "select",
          prop: "name",
        },
        {
          label: "日期范围",
          type: "daterange",
          prop: "queueDate",
          format:"YYYY-MM-DD",
          valueFormat:"YYYY-MM-DD",
          startPlaceholder:"开始时间",
          endPlaceholder:"结束时间",
          span: 6,
        },
        {
          label: "时间段范围",
          type: "time",
          prop: "timeSlot",
          format:"HH:mm",
          valueFormat:"HH:mm",
          start:"开始时间",
          end:"结束时间",
          isRange:true,
          span: 6,
        },
        {
          label: "允许排队数量",
          type: "input",
          prop: "queueNum",
          span: 6,
        },
        {
          label: "生效类型",
          type: "select",
          prop: "isDelay",
          options: [
            {
              label: "当日生效",
              value: 0,
            },
            {
              label: "次日生效",
              value: 1,
            }
          ],
          span: 6,
        },
        {
          label: "生效时间",
          type: "date",
          prop: "effectiveTime",
          format:"YYYY-MM-DD",
          valueFormat:"YYYY-MM-DD",
          span: 6,
        },
      ],
    }),
  )
  return form
}

总结

一百个人有一百个编写代码的习惯,其上实现是基于模块化的思想,可能看起来有点累,但是我相信能帮助到你。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程笔记。


推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
author-avatar
hanjing0118
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有