基于element-ui封装可配置表单组件

在这里插入图片描述

“vue”: “^2.7.13”
“element-ui”: “^2.15.7”

代码地址

【说明】
该组件时使用vue3(vue2.7)语法封装,使用时可用vue2语法使用也可以使用vue3语法使用

一、vue2语法使用案例

基础用法

<template>
  <div class="form-demo">
    <div class="form">
      <BasicForm
        :schemas="schemas"
        :colProps="{span: 12}"
        :showActionButtonGroup="false"
        @register="register"
        @change="handleChange"
      />
    </div>
    <div class="btns">
      <el-button type="primary" @click="saveForm">保存</el-button>
      <el-button @click="resetForm">重置</el-button>
    </div>
  </div>
</template>

<script>
  export default {
    name: 'BasicFormDemo',
    data() {
      return {
        schemas: [
          {
            prop: 'id',
            component: 'Input',
            show: false // 显示隐藏
          },
          {
            prop: 'username',
            component: 'Input',
            label: '姓名',
            labelWidth: '100px',
            defaultValue: '张三', // 默认值
            colProps: {
              span: 8
            },
            required: true
          },
          {
            prop: 'address',
            component: 'Input',
            label: '地址',
            labelWidth: '100px',
            defaultValue: 1, // 默认值
            componentProps: {
              maxlength: 10,
              showWordLimit: true
            },
            colProps: {
              span: 8
            }
          },
          {
            prop: 'rate',
            component: 'Input',
            label: '税率',
            labelWidth: '100px',
            componentProps: {
              append: '%'
            },
            colProps: {
              span: 8
            }
          },
          {
            prop: 'url',
            component: 'Input',
            label: '网址',
            labelWidth: '100px',
            componentProps: {
              prepend: 'http'
            },
            colProps: {
              span: 8
            }
          },
          {
            prop: 'inputNumber',
            component: 'InputNumber',
            label: '距离',
            labelWidth: '100px',
            defaultValue: 1 // 默认值
          },
          {
            prop: 'age',
            component: 'Switch',
            label: '年龄',
            labelWidth: '100px',
            defaultValue: true // 默认值
          },
          {
            prop: 'remark',
            component: 'Input',
            label: '评论',
            labelWidth: '100px',
            componentProps: {
              type: 'textarea',
              placeholder: '请输入评论'
            }
          },
          {
            prop: 'divider',
            component: 'Divider',
            labelWidth: '0px',
            componentProps: {
              contentPosition: 'left',
              content: '日期类型组件'
            }
          },
          {
            prop: 'time1',
            component: 'TimePicker',
            label: '时间选择器'
          },
          {
            prop: 'time2',
            component: 'TimePicker',
            label: '时间选择器',
            componentProps: {
              isRange: true,
              rangeSeparator: '至',
              startPlaceholder: '开始时间',
              endPlaceholder: '结束时间',
              placeholder: '选择时间范围'
            }
          },
          {
            prop: 'createDate',
            component: 'DatePicker',
            label: '创建日期',
            componentProps: {}
          },
          {
            prop: 'endDate',
            component: 'DatePicker',
            label: '带快捷选项',
            componentProps: {
              valueFormat: 'yyyy-MM-dd',
              pickerOptions: {
                disabledDate(time) {
                  return time.getTime() > Date.now()
                },
                shortcuts: [
                  {
                    text: '今天',
                    onClick(picker) {
                      picker.$emit('pick', new Date())
                    }
                  },
                  {
                    text: '昨天',
                    onClick(picker) {
                      const date = new Date()
                      date.setTime(date.getTime() - 3600 * 1000 * 24)
                      picker.$emit('pick', date)
                    }
                  },
                  {
                    text: '一周前',
                    onClick(picker) {
                      const date = new Date()
                      date.setTime(date.getTime() - 3600 * 1000 * 24 * 7)
                      picker.$emit('pick', date)
                    }
                  }
                ]
              }
            }
          },
          {
            prop: 'weekly',
            component: 'DatePicker',
            label: '周',
            componentProps: {
              type: 'week',
              format: 'yyyy 第 WW 周',
              placeholder: '请选择周'
            }
          },
          {
            prop: 'dateRange',
            component: 'DatePicker',
            label: '日期范围',
            componentProps: {
              type: 'daterange',
              rangeSeparator: '至',
              startPlaceholder: '开始日期',
              endPlaceholder: '结束日期'
            }
          },
          {
            prop: 'dateRange1',
            component: 'DatePicker',
            label: '日期范围-带快捷选项',
            labelWidth: '140px',
            componentProps: {
              type: 'daterange',
              align: 'right',
              unlinkPanels: true,
              rangeSeparator: '至',
              startPlaceholder: '开始日期',
              endPlaceholder: '结束日期',
              pickerOptions: {
                shortcuts: [
                  {
                    text: '最近一周',
                    onClick(picker) {
                      const end = new Date()
                      const start = new Date()
                      start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
                      picker.$emit('pick', [start, end])
                    }
                  },
                  {
                    text: '最近一个月',
                    onClick(picker) {
                      const end = new Date()
                      const start = new Date()
                      start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
                      picker.$emit('pick', [start, end])
                    }
                  },
                  {
                    text: '最近三个月',
                    onClick(picker) {
                      const end = new Date()
                      const start = new Date()
                      start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
                      picker.$emit('pick', [start, end])
                    }
                  }
                ]
              }
            }
          },
          {
            prop: 'monthRange',
            component: 'DatePicker',
            label: '月份范围',
            componentProps: {
              type: 'monthrange',
              rangeSeparator: '至',
              startPlaceholder: '开始月份',
              endPlaceholder: '结束月份'
            }
          },
          {
            prop: 'monthRange1',
            component: 'DatePicker',
            label: '月份范围-带选项',
            labelWidth: '130px',
            componentProps: {
              type: 'monthrange',
              align: 'right',
              unlinkPanels: true,
              rangeSeparator: '至',
              startPlaceholder: '开始月份',
              endPlaceholder: '结束月份',
              pickerOptions: {
                shortcuts: [
                  {
                    text: '本月',
                    onClick(picker) {
                      picker.$emit('pick', [new Date(), new Date()])
                    }
                  },
                  {
                    text: '今年至今',
                    onClick(picker) {
                      const end = new Date()
                      const start = new Date(new Date().getFullYear(), 0)
                      picker.$emit('pick', [start, end])
                    }
                  },
                  {
                    text: '最近六个月',
                    onClick(picker) {
                      const end = new Date()
                      const start = new Date()
                      start.setMonth(start.getMonth() - 6)
                      picker.$emit('pick', [start, end])
                    }
                  }
                ]
              }
            }
          },
          {
            prop: 'DateTimePicker',
            component: 'DatePicker',
            label: '日期时间选择器',
            labelWidth: '110px',
            componentProps: {
              type: 'datetime'
            }
          },
          {
            prop: 'divider',
            component: 'Divider',
            labelWidth: '0px',
            componentProps: {
              contentPosition: 'left',
              content: '单选框'
            }
          },
          {
            prop: 'radio',
            component: 'RadioGroup',
            label: '单选框',
            defaultValue: '2',
            colProps: { span: 12 },
            componentProps: {
              options: [
                {
                  label: '1',
                  value: '选项1'
                },
                {
                  label: '2',
                  value: '选项2'
                },
                {
                  label: '3',
                  value: '选项3',
                  border: true
                },
                {
                  label: '4',
                  value: '选项4',
                  disabled: true
                }
              ]
            }
          },
          {
            prop: 'divider',
            component: 'Divider',
            labelWidth: '0px',
            componentProps: {
              contentPosition: 'left',
              content: '复选框'
            }
          },
          {
            prop: 'checkbox',
            component: 'CheckboxGroup',
            label: '复选框',
            defaultValue: ['2'],
            colProps: { span: 12 },
            componentProps: {
              options: [
                {
                  label: '1',
                  value: '选项1'
                },
                {
                  label: '2',
                  value: '选项2'
                },
                {
                  label: '3',
                  value: '选项3',
                  border: true
                },
                {
                  label: '4',
                  value: '选项4',
                  disabled: true
                }
              ]
            }
          },
          {
            prop: 'selectAll',
            component: 'SelectAll',
            label: '全选',
            colProps: { span: 12 },
            defaultValue: ['2'],
            componentProps: {
              options: [
                {
                  label: '1',
                  value: '选项1'
                },
                {
                  label: '2',
                  value: '选项2'
                }
              ]
            }
          },
          {
            prop: 'divider',
            component: 'Divider',
            labelWidth: '0px',
            componentProps: {
              contentPosition: 'left',
              content: '下拉框'
            }
          },
          {
            prop: 'select',
            component: 'Select',
            label: '下拉框',
            defaultValue: '2',
            componentProps: {
              options: [
                {
                  label: '选项1',
                  value: '1'
                },
                {
                  label: '选项2',
                  value: '2',
                  disabled: true
                }
              ]
            }
          },
          {
            prop: 'select1',
            component: 'Select',
            label: '多选',
            componentProps: {
              multiple: true,
              placeholder: '请选择',
              options: [
                {
                  unitName: '选项1',
                  id: '1'
                },
                {
                  unitName: '选项2',
                  id: '2',
                  disabled: true
                }
              ],
              fieldNames: {
                label: 'unitName',
                value: 'id'
              }
            }
          },
          {
            prop: 'select11',
            component: 'ApiSelect',
            label: '远程下拉框',
            componentProps: {
              api: () => this.getOpt(),
              resultField: 'result',
              fieldNames: {
                label: 'unitName',
                value: 'id'
              }
            }
          },
          {
            prop: 'ApiTreeSelect',
            component: 'ApiTreeSelect',
            label: '树下拉框',
            componentProps: {
              api: () => this.getTreeData(),
              resultField: 'result',
              fieldNames: {
                label: 'name'
              }
            }
          },

          {
            prop: 'divider1',
            component: 'Divider',
            labelWidth: '0px',
            componentProps: {
              contentPosition: 'left',
              content: '级联选择器'
            }
          },
          {
            prop: 'Cascader',
            component: 'Cascader',
            label: '基本用法',
            componentProps: {
              options: [
                {
                  value: 'zhinan',
                  label: '指南',
                  children: [
                    {
                      value: 'shejiyuanze',
                      label: '设计原则',
                      children: [
                        {
                          value: 'yizhi',
                          label: '一致'
                        },
                        {
                          value: 'fankui',
                          label: '反馈'
                        },
                        {
                          value: 'xiaolv',
                          label: '效率'
                        },
                        {
                          value: 'kekong',
                          label: '可控'
                        }
                      ]
                    },
                    {
                      value: 'daohang',
                      label: '导航',
                      children: [
                        {
                          value: 'cexiangdaohang',
                          label: '侧向导航'
                        },
                        {
                          value: 'dingbudaohang',
                          label: '顶部导航'
                        }
                      ]
                    }
                  ]
                },
                {
                  value: 'zujian',
                  label: '组件',
                  children: [
                    {
                      value: 'basic',
                      label: 'Basic',
                      children: [
                        {
                          value: 'layout',
                          label: 'Layout 布局'
                        },
                        {
                          value: 'color',
                          label: 'Color 色彩'
                        },
                        {
                          value: 'typography',
                          label: 'Typography 字体'
                        },
                        {
                          value: 'icon',
                          label: 'Icon 图标'
                        },
                        {
                          value: 'button',
                          label: 'Button 按钮'
                        }
                      ]
                    },
                    {
                      value: 'form',
                      label: 'Form',
                      children: [
                        {
                          value: 'radio',
                          label: 'Radio 单选框'
                        },
                        {
                          value: 'checkbox',
                          label: 'Checkbox 多选框'
                        },
                        {
                          value: 'input',
                          label: 'Input 输入框'
                        },
                        {
                          value: 'input-number',
                          label: 'InputNumber 计数器'
                        },
                        {
                          value: 'select',
                          label: 'Select 选择器'
                        },
                        {
                          value: 'cascader',
                          label: 'Cascader 级联选择器'
                        },
                        {
                          value: 'switch',
                          label: 'Switch 开关'
                        },
                        {
                          value: 'slider',
                          label: 'Slider 滑块'
                        },
                        {
                          value: 'time-picker',
                          label: 'TimePicker 时间选择器'
                        },
                        {
                          value: 'date-picker',
                          label: 'DatePicker 日期选择器'
                        },
                        {
                          value: 'datetime-picker',
                          label: 'DateTimePicker 日期时间选择器'
                        },
                        {
                          value: 'upload',
                          label: 'Upload 上传'
                        },
                        {
                          value: 'rate',
                          label: 'Rate 评分'
                        },
                        {
                          value: 'form',
                          label: 'Form 表单'
                        }
                      ]
                    },
                    {
                      value: 'data',
                      label: 'Data',
                      children: [
                        {
                          value: 'table',
                          label: 'Table 表格'
                        },
                        {
                          value: 'tag',
                          label: 'Tag 标签'
                        },
                        {
                          value: 'progress',
                          label: 'Progress 进度条'
                        },
                        {
                          value: 'tree',
                          label: 'Tree 树形控件'
                        },
                        {
                          value: 'pagination',
                          label: 'Pagination 分页'
                        },
                        {
                          value: 'badge',
                          label: 'Badge 标记'
                        }
                      ]
                    },
                    {
                      value: 'notice',
                      label: 'Notice',
                      children: [
                        {
                          value: 'alert',
                          label: 'Alert 警告'
                        },
                        {
                          value: 'loading',
                          label: 'Loading 加载'
                        },
                        {
                          value: 'message',
                          label: 'Message 消息提示'
                        },
                        {
                          value: 'message-box',
                          label: 'MessageBox 弹框'
                        },
                        {
                          value: 'notification',
                          label: 'Notification 通知'
                        }
                      ]
                    },
                    {
                      value: 'navigation',
                      label: 'Navigation',
                      children: [
                        {
                          value: 'menu',
                          label: 'NavMenu 导航菜单'
                        },
                        {
                          value: 'tabs',
                          label: 'Tabs 标签页'
                        },
                        {
                          value: 'breadcrumb',
                          label: 'Breadcrumb 面包屑'
                        },
                        {
                          value: 'dropdown',
                          label: 'Dropdown 下拉菜单'
                        },
                        {
                          value: 'steps',
                          label: 'Steps 步骤条'
                        }
                      ]
                    },
                    {
                      value: 'others',
                      label: 'Others',
                      children: [
                        {
                          value: 'dialog',
                          label: 'Dialog 对话框'
                        },
                        {
                          value: 'tooltip',
                          label: 'Tooltip 文字提示'
                        },
                        {
                          value: 'popover',
                          label: 'Popover 弹出框'
                        },
                        {
                          value: 'card',
                          label: 'Card 卡片'
                        },
                        {
                          value: 'carousel',
                          label: 'Carousel 走马灯'
                        },
                        {
                          value: 'collapse',
                          label: 'Collapse 折叠面板'
                        }
                      ]
                    }
                  ]
                },
                {
                  value: 'ziyuan',
                  label: '资源',
                  children: [
                    {
                      value: 'axure',
                      label: 'Axure Components'
                    },
                    {
                      value: 'sketch',
                      label: 'Sketch Templates'
                    },
                    {
                      value: 'jiaohu',
                      label: '组件交互文档'
                    }
                  ]
                }
              ]
            }
          },
          {
            prop: 'Cascader2',
            component: 'Cascader',
            label: '多选',
            componentProps: {
              props: { multiple: true },
              options: [
                {
                  value: 'zhinan',
                  label: '指南',
                  children: [
                    {
                      value: 'shejiyuanze',
                      label: '设计原则',
                      children: [
                        {
                          value: 'yizhi',
                          label: '一致'
                        },
                        {
                          value: 'fankui',
                          label: '反馈'
                        },
                        {
                          value: 'xiaolv',
                          label: '效率'
                        },
                        {
                          value: 'kekong',
                          label: '可控'
                        }
                      ]
                    },
                    {
                      value: 'daohang',
                      label: '导航',
                      children: [
                        {
                          value: 'cexiangdaohang',
                          label: '侧向导航'
                        },
                        {
                          value: 'dingbudaohang',
                          label: '顶部导航'
                        }
                      ]
                    }
                  ]
                },
                {
                  value: 'zujian',
                  label: '组件',
                  children: [
                    {
                      value: 'basic',
                      label: 'Basic',
                      children: [
                        {
                          value: 'layout',
                          label: 'Layout 布局'
                        },
                        {
                          value: 'color',
                          label: 'Color 色彩'
                        },
                        {
                          value: 'typography',
                          label: 'Typography 字体'
                        },
                        {
                          value: 'icon',
                          label: 'Icon 图标'
                        },
                        {
                          value: 'button',
                          label: 'Button 按钮'
                        }
                      ]
                    },
                    {
                      value: 'form',
                      label: 'Form',
                      children: [
                        {
                          value: 'radio',
                          label: 'Radio 单选框'
                        },
                        {
                          value: 'checkbox',
                          label: 'Checkbox 多选框'
                        },
                        {
                          value: 'input',
                          label: 'Input 输入框'
                        },
                        {
                          value: 'input-number',
                          label: 'InputNumber 计数器'
                        },
                        {
                          value: 'select',
                          label: 'Select 选择器'
                        },
                        {
                          value: 'cascader',
                          label: 'Cascader 级联选择器'
                        },
                        {
                          value: 'switch',
                          label: 'Switch 开关'
                        },
                        {
                          value: 'slider',
                          label: 'Slider 滑块'
                        },
                        {
                          value: 'time-picker',
                          label: 'TimePicker 时间选择器'
                        },
                        {
                          value: 'date-picker',
                          label: 'DatePicker 日期选择器'
                        },
                        {
                          value: 'datetime-picker',
                          label: 'DateTimePicker 日期时间选择器'
                        },
                        {
                          value: 'upload',
                          label: 'Upload 上传'
                        },
                        {
                          value: 'rate',
                          label: 'Rate 评分'
                        },
                        {
                          value: 'form',
                          label: 'Form 表单'
                        }
                      ]
                    },
                    {
                      value: 'data',
                      label: 'Data',
                      children: [
                        {
                          value: 'table',
                          label: 'Table 表格'
                        },
                        {
                          value: 'tag',
                          label: 'Tag 标签'
                        },
                        {
                          value: 'progress',
                          label: 'Progress 进度条'
                        },
                        {
                          value: 'tree',
                          label: 'Tree 树形控件'
                        },
                        {
                          value: 'pagination',
                          label: 'Pagination 分页'
                        },
                        {
                          value: 'badge',
                          label: 'Badge 标记'
                        }
                      ]
                    },
                    {
                      value: 'notice',
                      label: 'Notice',
                      children: [
                        {
                          value: 'alert',
                          label: 'Alert 警告'
                        },
                        {
                          value: 'loading',
                          label: 'Loading 加载'
                        },
                        {
                          value: 'message',
                          label: 'Message 消息提示'
                        },
                        {
                          value: 'message-box',
                          label: 'MessageBox 弹框'
                        },
                        {
                          value: 'notification',
                          label: 'Notification 通知'
                        }
                      ]
                    },
                    {
                      value: 'navigation',
                      label: 'Navigation',
                      children: [
                        {
                          value: 'menu',
                          label: 'NavMenu 导航菜单'
                        },
                        {
                          value: 'tabs',
                          label: 'Tabs 标签页'
                        },
                        {
                          value: 'breadcrumb',
                          label: 'Breadcrumb 面包屑'
                        },
                        {
                          value: 'dropdown',
                          label: 'Dropdown 下拉菜单'
                        },
                        {
                          value: 'steps',
                          label: 'Steps 步骤条'
                        }
                      ]
                    },
                    {
                      value: 'others',
                      label: 'Others',
                      children: [
                        {
                          value: 'dialog',
                          label: 'Dialog 对话框'
                        },
                        {
                          value: 'tooltip',
                          label: 'Tooltip 文字提示'
                        },
                        {
                          value: 'popover',
                          label: 'Popover 弹出框'
                        },
                        {
                          value: 'card',
                          label: 'Card 卡片'
                        },
                        {
                          value: 'carousel',
                          label: 'Carousel 走马灯'
                        },
                        {
                          value: 'collapse',
                          label: 'Collapse 折叠面板'
                        }
                      ]
                    }
                  ]
                },
                {
                  value: 'ziyuan',
                  label: '资源',
                  children: [
                    {
                      value: 'axure',
                      label: 'Axure Components'
                    },
                    {
                      value: 'sketch',
                      label: 'Sketch Templates'
                    },
                    {
                      value: 'jiaohu',
                      label: '组件交互文档'
                    }
                  ]
                }
              ]
            }
          },
          {
            prop: 'field3',
            component: 'Cascader',
            label: '可搜索',
            componentProps: {
              filterable: true,
              props: { label: 'unitName', value: 'id' },
              options: [
                {
                  unitName: '神印王座',
                  id: 1,
                  children: [
                    {
                      unitName: '龙皓晨',
                      id: 11
                    },
                    {
                      unitName: '圣彩儿',
                      id: 12
                    }
                  ]
                },
                {
                  unitName: '吞噬星空',
                  id: 2
                },
                {
                  unitName: '天行九歌',
                  id: 3
                }
              ]
            }
          },
          {
            prop: 'field3',
            component: 'ApiCascader',
            label: 'ApiCascader',
            componentProps: {
              filterable: true,
              props: { label: 'unitName', value: 'id' },
              api: () => this.getCascaderOpt()
            }
          },
          {
            prop: 'field4',
            component: 'Divider',
            labelWidth: '0px',
            componentProps: {
              contentPosition: 'left',
              content: '上传'
            }
          },
          {
            prop: 'field4',
            component: 'Upload',
            label: '上传附件',
            componentProps: {
              action: 'https://httpbin.org/post'
            }
          }
        ],
        formAction: {}
      }
    },
    methods: {
      register(e) {
        this.formAction = e
        console.log('e', e)
      },
      handleChange(e) {
        console.log('handleChange', e)
      },
      saveForm() {
        this.formAction.validate()
        console.log('t', this.formAction.getFieldValues())
      },
      resetForm() {
        this.formAction.clearValidate()
      },
      getOpt() {
        return new Promise(resolve => {
          const result = {
            result: [
              {
                id: '选项1',
                unitName: '黄金糕'
              },
              {
                id: '选项2',
                unitName: '双皮奶'
              },
              {
                id: '选项3',
                unitName: '蚵仔煎'
              },
              {
                id: '选项4',
                unitName: '龙须面'
              },
              {
                id: '选项5',
                unitName: '北京烤鸭'
              },
              {
                id: '选项6',
                unitName: '冰激淋'
              },
              {
                id: '7',
                unitName: '榴莲千层'
              },
              {
                id: '8',
                unitName: '煎饼'
              },
              {
                id: '9',
                unitName: '手抓饼'
              }
            ]
          }
          resolve(result)
        })
      },
      getTreeData() {
        return Promise.resolve([
          {
            id: 118808,
            parentId: null,
            name: '新疆',
            children: [
              {
                id: 118809,
                parentId: 118808,
                name: '巴州乐禾',
                children: [
                  {
                    id: 118817,
                    parentId: 118809,
                    name: '采购部'
                  },
                  {
                    id: 118818,
                    parentId: 118809,
                    name: '销售部'
                  },
                  {
                    id: 118824,
                    parentId: 118809,
                    name: '运营部'
                  },
                  {
                    id: 111824,
                    parentId: 113809,
                    name: '研发部'
                  },
                  {
                    id: 118814,
                    parentId: 118829,
                    name: '市场部'
                  }
                ]
              }
            ]
          },
          {
            id: 118809,
            parentId: null,
            name: '广东',
            children: [
              {
                id: 118879,
                parentId: 118801,
                name: '广州'
              }
            ]
          }
        ])
      },
      getCascaderOpt() {
        return Promise.resolve([
          {
            unitName: '神印王座',
            id: 1,
            children: [
              {
                unitName: '龙皓晨',
                id: 11
              },
              {
                unitName: '圣彩儿',
                id: 12
              }
            ]
          },
          {
            unitName: '吞噬星空',
            id: 2
          },
          {
            unitName: '天行九歌',
            id: 3
          }
        ])
      }
    }
  }
</script>
<style lang="scss">
  .form-demo {
    display: flex;
    flex-direction: column;
    height: 100%;
    overflow: hidden;
    background-color: white;

    .form {
      flex: 1;
      overflow: hidden;
    }

    .btns {
      display: flex;
      align-items: center;
      justify-content: flex-end;
      padding: 16px;
      box-shadow: 0 -1px #ddd;
    }
  }
</style>

可折叠表单

<template>
  <div class="form-demo">
    <div class="form">
      <BasicForm
        :schemas="schemas"
        :colProps="{span: 12}"
        @register="register"
        @change="handleChange"
      />
    </div>
  </div>
</template>

<script>
  export default {
    name: 'BasicFormDemo',
    data() {
      return {
        schemas: [
          {
            prop: 'username',
            component: 'Input',
            label: '姓名'
          },
          {
            prop: 'address',
            component: 'Input',
            label: '地址'
          },
          {
            prop: 'rate',
            component: 'Input',
            label: '税率',
            componentProps: {
              append: '%'
            }
          }
        ],
        formAction: {}
      }
    },
    methods: {
      register(e) {
        this.formAction = e
        console.log('formAction', e)
      },
      handleChange(e) {
        console.log('handleChange', e)
      }
    }
  }
</script>
<style lang="scss">
  .form-demo {
    display: flex;
    flex-direction: column;
    height: 100%;
    overflow: hidden;
    background-color: white;

    .form {
      flex: 1;
      overflow: hidden;
    }

    .btns {
      display: flex;
      align-items: center;
      justify-content: flex-end;
      padding: 16px;
      box-shadow: 0 -1px #ddd;
    }
  }
</style>

设置表单表项值

<template>
  <div class="form-demo">
    <div class="form">
      <BasicForm
        :schemas="schemas"
        :colProps="{span: 12}"
        :showActionButtonGroup="false"
        @register="register"
        @change="handleChange"
      />
    </div>
    <div class="btns">
      <el-button type="primary" @click="setFormData">设置值</el-button>
      <el-button type="primary" @click="updateSchema">
        更新表单项配置项
      </el-button>
      <el-button type="primary" @click="insetSchema">
        插入表单项
      </el-button>
      <el-button type="primary" @click="removeSchemaByFiled">
        删除表单项
      </el-button>
      <el-button type="primary" @click="resetSchemas">
        重置表单
      </el-button>
    </div>
  </div>
</template>

<script>
  export default {
    name: 'BasicFormDemo',
    data() {
      return {
        schemas: [
          {
            prop: 'username',
            component: 'Input',
            label: '姓名'
          },
          {
            prop: 'address',
            component: 'Input',
            label: '地址'
          },
          {
            prop: 'rate',
            component: 'Input',
            label: '税率',
            componentProps: {
              append: '%'
            }
          }
        ],
        formAction: {}
      }
    },
    methods: {
      register(e) {
        this.formAction = e
        console.log('formAction', e)
      },
      handleChange(e) {
        console.log('handleChange', e)
      },
      setFormData() {
        // 调用 setFieldValues 方法可设置表单项值, 返回值是更新之后表单的值
        const data = this.formAction.setFieldValues({ username: '李四' })
        console.log('data', data)
      },
      updateSchema() {
        this.formAction.updateSchema({
          prop: 'rate',
          component: 'Input',
          label: '税率',
          componentProps: {
            placeholder: '请输入税率'
          }
        })
      },
      insetSchema() {
        this.formAction.insetSchema('rate', {
          prop: 'rate1',
          component: 'Input',
          label: '新增',
          componentProps: {
            placeholder: '请输入'
          }
        })
      },
      removeSchemaByFiled() {
        this.formAction.removeSchemaByFiled('address')
      },
      resetSchemas() {
        this.formAction.resetSchemas()
      }
    }
  }
</script>
<style lang="scss">
  .form-demo {
    display: flex;
    flex-direction: column;
    height: 100%;
    overflow: hidden;
    background-color: white;

    .form {
      flex: 1;
      overflow: hidden;
    }

    .btns {
      display: flex;
      align-items: center;
      justify-content: flex-end;
      padding: 16px;
      box-shadow: 0 -1px #ddd;
    }
  }
</style>

使用插槽 slots

<template>
  <div class="form-demo">
    <div class="form">
      <BasicForm :schemas="schemas" :colProps="{span: 24}">
        <template #username>
          <span>username slot</span>
        </template>
        <template #submitBefore>
          submit 左侧插槽
        </template>
      </BasicForm>
    </div>
  </div>
</template>

<script>
  export default {
    name: 'BasicFormDemo',
    data() {
      return {
        schemas: [
          {
            prop: 'username',
            component: 'Input',
            label: '姓名',
            slots: 'username'
          },
          {
            prop: 'address',
            component: 'Input',
            label: '地址'
          },
          {
            prop: 'rate',
            component: 'Input',
            label: '税率',
            componentProps: {
              append: '%'
            }
          }
        ]
      }
    }
  }
</script>
<style lang="scss">
  .form-demo {
    display: flex;
    flex-direction: column;
    height: 100%;
    overflow: hidden;
    background-color: white;

    .form {
      flex: 1;
      overflow: hidden;
    }

    .btns {
      display: flex;
      align-items: center;
      justify-content: flex-end;
      padding: 16px;
      box-shadow: 0 -1px #ddd;
    }
  }
</style>

二、vue3语法使用

<template>
	<BasicForm
        @register="register"
        @submit="handleSubmit"
        @reset="handleSubmit"
        @change="handleChange"
      />
</template>

<script setup>
const [register, { updateSchema, getFieldValues, setFieldValues }] = useForm({
  schemas: [
	  {
	    prop: 'orgUnitId',
	    component: 'ApiSelect',
	    label: 'label1',
	    componentProps: {
	      api: $api.getOrgUnitByUserId,
	      fieldNames: { label: 'departmentName', value: 'id' },
	      resultField: 'result'
	    },
	    required: true
	  },
	  {
	    prop: 'projectId',
	    component: 'Select',
	    label: 'label2',
	    required: true
	  },
  ],
  labelWidth: '110px'
})
</script>

Form Attributes

参数说明类型可选值默认值
colonlabel 是否显示冒号boolean显示
schemas必填,表单配置项,具体 看下表array
colProps表单项栅格布局,具体看下表objeact
labelWidthlabel 宽度string‘100px’
labelPosition表单域标签的位置,如果值为 left 或者 right 时,则需要设置 label-widthstringright
showActionButtonGroup是否显示操作按钮booleantrue
showSearchBtn是否显示查询按钮booleantrue
showResetBtn是否显示清空按钮Booleantrue
searchText查询按钮文本string‘查询’
resetText清空按钮文本string清空
isFlex是否开启自适应布局booleantrue
formSize尺寸,不同的lebel设置不同的尺寸以适应屏幕, 设置此属性必须设置isFlex为truebooleantrue
model表单数据对象object
isEnterSearch是否按下回车查询booleantrue
formItemMb表单项的 margin-bottomString‘16px’
Schemas Attributes
参数说明类型可选值默认值
colonlabel 是否显示冒号boolean——true
prop必填,字段名称, 唯一string————
component必填,输入框类型,stringInput、InputNumber 、TimePicker、DatePicker、Switch、RadioGroup、CheckboxGroup、SelectAll、Select、ApiSelect、ApiTreeSelect、Cascader、ApiCascader、Upload、Divider——
label标签文本string————
label-width表单域标签的的宽度string——’100px‘
required是否必填boolean——false
show表单项显示隐藏boolean——false
componentProps可设置组件属性(element 组件的属性,具体可查看 element 组件文档),如禁用输入框componentProps={disabled: true}object——{}
defaultValue输入框默认值any————
colProps表单项栅格布局,具体看下表object————
rules表单验证规则array————
disabled是否禁用, 如此处设置表单禁用,无需在 componentProps 中设置false————
slots表单项插槽string————
renderContent渲染内容, 需要返回渲染函数,否则会报错Function————
formItemMb表单项的 margin-bottomString——‘16px’
colProps Attributes
参数说明类型可选值默认值
span栅格占据的列数number——8
xs<768px 响应式栅格数或者栅格属性对象number————
sm≥768px 响应式栅格数或者栅格属性对象number————
md≥992px 响应式栅格数或者栅格属性对象number————
lg≥1200px 响应式栅格数或者栅格属性对象number————
xl≥1920px 响应式栅格数或者栅格属性对象number————

Events

事件名称说明回调参数
change值改变时触发,InputNumber 类型输入如果设置默认值, 初始时会触发一次 change 事件e: any
register注册 BasicForm 组件实例, 获取实例上的方法e: object

Slots

name说明
submitBeforesubmit btn 左侧插槽
resetBeforereset btn 左侧插槽
resetAfterreset btn 右侧插槽
moreAfter更多 右侧插槽

Methods

⚠️ 该组件二次封装后需注册 register事件, 获取实例方法, 并且需要保存到当前组件实例中

方法名说明参数
validate校验
clearValidate清空表单校验
reset清空表单校验, 清空输入框值
getFieldValues获取表单的值
setFieldValues设置表单的值, 返回值是更新之后表单的值object
updateSchema更新表单配置项, prop 必须存在 schemas 中, 不存在则更新失败
insetSchema插入表单项field, schema
removeSchemaByFiled删除表单项field
resetSchemas重置配置项, 恢复初始值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/120407.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

擎创动态 | 开箱即用!擎创科技联合中科可控推出大模型一体机

一、金融行业大模型一体机发布 10月26日至27日&#xff0c;2023金融科技安全与创新大会顺利召开。会上&#xff0c;中科可控联合擎创科技、卓世科技、文因互联、百川智能、捷通华声、智谱华章、易道博识等9大厂商&#xff0c;发布了9款金融行业大模型一体机&#xff0c;为金融…

加速度jsudo:小企业会遇到哪些瓶颈期?

什么是瓶颈期&#xff1f;瓶颈期&#xff0c;就是你无论怎么努力&#xff0c;成绩都是上不去&#xff0c;还是停留在原地&#xff1b;而自己表现的还是很匆忙&#xff0c;却不知道如何下手&#xff1f;就像水桶效益一样&#xff0c;水桶的木板高度层次不齐&#xff0c;像极了自…

安防监控系统EasyCVR平台设备通道绑定AI算法的功能设计与开发实现

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台可拓展性强、…

Mysql数据库的备份和恢复及日志管理

一、数据备份概述 1.1 备份的分类 完全备份&#xff1a;整个数据库完整地进行备份 增量备份&#xff1a;在完全备份的基础之上&#xff0c;对后续新增的内容进行备份 冷备份&#xff1a;关机备份&#xff0c;停止mysql服务&#xff0c;然后进行备份 热备份&#xff1a;开机备…

从零开始的C++(十四)

继承&#xff1a; 作用&#xff1a;减少重复代码&#xff0c;简化程序。 用法&#xff1a; class b&#xff1a;public a {//...b中成员 } 在如上代码中&#xff0c;b类以public的方式继承了a类。规定a类是父类、基类&#xff0c;b类是子类、派生类。 关于继承方式&#xf…

[动态规划] (十一) 简单多状态 LeetCode 面试题17.16.按摩师 和 198.打家劫舍

[动态规划] (十一) 简单多状态: LeetCode 面试题17.16.按摩师 和 198.打家劫舍 文章目录 [动态规划] (十一) 简单多状态: LeetCode 面试题17.16.按摩师 和 198.打家劫舍题目分析题目解析状态表示状态转移方程初始化和填表顺序 代码实现按摩师打家劫舍 总结 注&#xff1a;本题与…

iOS 让界面元素的文字随着语言的更改而变化——本地化文字跟随

在我的 App 内置的设置中&#xff0c;修改了语言&#xff0c;这时需要让当前界面的文本跟着改变语言。 解决方法是&#xff1a;添加一个观察者&#xff0c;观察 localize 本地语言的通知&#xff0c;然后一有变化就调用自定义的方法执行操作。&#xff08;而设置中其实是改变了…

ZYNQ_project:key_beep

通过按键控制蜂鸣器工作。 模块框图&#xff1a; 时序图&#xff1a; 代码&#xff1a; /*1位按键消抖 */ module key_filter (input wire sys_clk ,input wire sys_rst_n ,input wire key_in ,output …

搭建嵌入式GDB调试环境以及VSCode+gdbserver 图形化调试

目录 1 搭建嵌入式gdb调试环境 1.1 交叉编译工具链自带的gdb和gdbserver 1.2 使用gdb进行嵌入式程序调试 1.2.1编写简单测试程序 1.2.2 gdb调试程序 1.3 源码编译gdb和gdbserver 1.3.1 下载gdb和gdbserver源码 1.3.2 编译gdb 1.3.3 移植gdbserver 2 VSCodegdbserver 图…

第十八章:Swing自述

18.1 Swing概述 18.2&#xff1a;Swing常用窗体 18.2.1&#xff1a;JFrame窗体 package eightth; import java.awt.*; //导入AWT包 import javax.swing.*; //导入Swing包 public class JFreamTest { public static void main(String args[]) { // 主方法 JFr…

阿里云99元服务器2核2G3M带宽_4年396元_新老用户均可

阿里云2核2G3M带宽99元服务器新老用户同享&#xff0c;续费不涨价&#xff0c;99元即可续费&#xff0c;可以续费到2027年&#xff0c;相当于396元买4年&#xff0c;阿里云百科aliyunbaike.com来详细说下阿里云99元服务器配置、购买条件、优惠价格和续费攻略&#xff1a; 阿里…

计算机毕业设计 基于SpringBoot的私人西服定制系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【Python】Python爬虫使用代理IP的实现

前言 在爬虫的过程中&#xff0c;我们经常会遇到需要使用代理IP的情况。比如&#xff0c;针对目标网站的反爬机制&#xff0c;需要通过使用代理IP来规避风险。因此&#xff0c;本文主要介绍如何在Python爬虫中使用代理IP。 一、代理IP的作用 代理IP&#xff0c;顾名思义&…

flutter生态一统甜夏 @Android @ios @windowse @macos @linux @Web

(愿景)G o o g l e 中 国flutter生态一统天下(IT) @Web

网络安全入门必学内容

网络安全入门 必/学/内/容/ 随着时代的发展&#xff0c;经济、社会、生产、生活越来越依赖网络。而随着万物互联的物联网技术的兴起&#xff0c;线上线下已经打通&#xff0c;虚拟世界和现实世界的边界正变得模糊。这使得来自网络空间的攻击能够穿透虚拟世界的边界&#xff0…

YashanDB发布会圆满收官,V23.1三大新品引领国产数据库技术与应用突破!

11月8日&#xff0c;YashanDB 2023年度产品发布会在线上成功召开。本次产品发布会以“惟实励新”为主题&#xff0c;宣布崖山数据库系统YashanDB 内核能力、产品形态、生态创新全面升级&#xff0c;标志着YashanDB商业化进程又迈出了重要一步&#xff01; 据了解&#xff0c;深…

企业电子招标采购系统源码之从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

java数据结构(红黑树)set集合 HashSet HashSet三个问题 LinkedHashSetTreeSet TreeSet集合默认规则排序规则

目录 数据结构(红黑树)红黑规则红黑树添加结点规则 set集合小结HashSet HashSet三个问题LinkedHashSet小结 TreeSetTreeSet集合默认规则排序规则(第一种排序方法)方式二练习 小练 总结总结 集合的使用应该怎么选择 数据结构(红黑树) 红黑规则 后代节点就是比如13根结点 13下面的…

opengauss权限需求

创建角色 "u_rts" 并授予对数据库 "rts_opsdb" 的只读权限&#xff1a; CREATE ROLE u_rts LOGIN PASSWORD Cloud1234; GRANT CONNECT ON DATABASE rts_opsdb TO u_rts; GRANT USAGE ON SCHEMA public TO u_rts; GRANT SELECT ON ALL TABLES IN SCHEMA pub…

网络安全(黑客)-零基础自学

想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全…