首页 > 其他分享 >element-ui 表单组件的简单封装

element-ui 表单组件的简单封装

时间:2022-12-08 08:33:45浏览次数:37  
标签:type formData label prop ui element 组件 表单 modelValue

背景

在管理系统中我们需要经常使用表单组件来收集用户的一些数据,如果按照官网的示例一个个表单项去填写不仅代码会变得很长而且麻烦,所以我们有必要去对组件进行再次的封装

需求

需求1:表单项通过配置文件配置

  • 表单的类型、key、label、是否必填

示例

MyForm.vue

<template>
  <div class="form">
    <hr />
    <h1>form{{ formData }}</h1>
    <el-form ref="formRef" :model="formData" :label-width="labelWidth">
      <el-form-item
        v-for="(item, index) in formItems"
        :key="index"
        :label="item.label"
        :prop="item.prop"
        :rules="item.rules"
      >
        <template v-if="item.type == 'input'">
          <el-input
            v-model="formData[item.prop]"
            :placeholder="item.placeholder"
          ></el-input>
        </template>
        <template v-else-if="item.type == 'select'">
          <el-select
            v-model="formData[item.prop]"
            :placeholder="item.placeholder"
          >
            <el-option
              v-for="option in item.options"
              :key="option.value"
              :label="option.label"
              :value="option.value"
            >
            </el-option>
          </el-select>
        </template>
        <template v-else-if="item.type == 'date'">
          <el-date-picker
            v-model="formData[item.prop]"
            type="date"
            placeholder="选择日期"
          >
          </el-date-picker>
        </template>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
export default {
  name: 'MyForm',
  // 自定义组件上使用v-model
  //   1. 定义model。  2. 需要将model中prop值同时在props中定义
  //   父组件通过v-model指令绑定值时会将数据传递给子组件中的modelValue,子组件通过触发"update:modelValue"事件可以通知父组件
  model: {
    prop: 'modelValue',
    event: 'update:modelValue',
  },
  props: {
    modelValue: Object,
    formItems: {
      type: Array,
      required: true,
    },
    labelWidth: {
      type: String,
    },
  },
  data() {
    return {
      formData: {},
    }
  },
  emits: ['update:modelValue'],
  created() {
    // 表单初始化
    for (let item of this.formItems) {
      this.$set(this.formData, item.prop, '')
    }
    this.$emit('update:modelValue', this.formData)
  },
  watch: {
    formData: {
      handler(newValue) {
        console.log(newValue)
      },
      deep: true,
    },
  },
}
</script>

<style scoped></style>

formConfig.js

const formConfig = {
  formItems: [
    {
      type: 'input',
      prop: 'name',
      label: '姓名:',
      placeholder: '请输入姓名',
      rules: [{ required: true, message: '请输入活动名称', trigger: 'blur' }],
    },
    {
      type: 'input',
      prop: 'age',
      label: '年龄:',
      placeholder: '请输入年龄',
      rules: [{ required: true, message: '请输入活动名称', trigger: 'blur' }],
    },
    {
      type: 'select',
      prop: 'address',
      label: '地址:',
      placeholder: '请输入地址',
      options: [
        {
          label: '广州市',
          value: 'gz',
        },
        {
          label: '上海市',
          value: 'sh',
        },
        {
          label: '深圳市',
          value: 'sz',
        },
      ],
    },
    {
      type: 'date',
      prop: 'birthday',
      label: '生日:',
      placeholder: '请输入生日',
    },
  ],
  labelWidth: '120px',
}

export default formConfig

Test.vue

<template>
  <div>
    test:{{ formData }}
    <hr />
    <my-form v-model="formData" v-bind="formConfig"></my-form>
  </div>
</template>

<script>
import MyForm from '@/components/form'
import formConfig from './config/form-config'
export default {
  name: 'Test',
  components: {
    MyForm,
  },
  data() {
    return {
      formData: {},
      formConfig,
      n: 0,
    }
  },
  methods: {
    handleUpdate() {
      console.log('update')
    },
  },
}
</script>

<style scoped></style>

标签:type,formData,label,prop,ui,element,组件,表单,modelValue
From: https://www.cnblogs.com/it774274680/p/16964901.html

相关文章

  • JS操作form表单倒计时自动提交
     只需要注意表单的id<formid="frm"action="http://www.baidu.com">考试还剩余<divid="time"></div></form><script>vartimes=45*60;//剩余时间,单位......
  • React DevUI 18.0 正式发布
    Jay是一位经验丰富并且对质量要求很高的开发者,对Angular、React等多种框架都很熟悉,我们在开源社区认识,在我做开源社区运营的过程中,Jay给了我很多帮助,他也是ReactDevU......
  • 010.绘制后台首页UI布局
    1.index.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>慕课网办公OA系统</title><!--引入样式--><linkrel="style......
  • vue element tree 上移下移
    效果图需求是:上边没有了应该取最后一个  下边没有了应该取第一个       直接上代码;<template><el-tree:key="tree_key"v-loading=......
  • 关于JQuery validate表单校验插件对级联下拉框的校验问题
         今天在使用JQueryvalidate表单校验插件时,遇见了一个非常诡异的问题了。在此记录一下:     问题描述:               ......
  • vscode配置arduino环境
    vscode配置arduino环境这里再补充下vscodearduino开发环境的设置。前期准备确保本地安装了arduino环境打开vscode,安装arduino扩展:添加配置配置arduino环境......
  • Java难点 | StringBuilder类/StringBuffer类
    StringBuilder类/StringBuffer类stringBuffer/strinaBuilder可以看做可变长度字符串。stringBuffer/stringBuilder初始化容量16.stringBuffer/stringBuilder是完成字符......
  • 提供多种数据看板,瓴羊Quick BI全面提升企业可视化分析能力​
    近几年,随着“互联网+”在各行各业的深入发展,企业对于数据分析的需求愈发强烈,促使国内商业智能BI工具市场迎来了全面爆发。除了Tableau、微软PowerBI等外国品牌的BI工具外,擅......
  • atguigu8 集群
    0.集群介绍(1)集群的目标•高可用(HighAvailability),是当一台服务器停止服务后,对于业务及用户毫无影响。停止服务的原因可能由于网卡、路由器、机房、CPU负载过高、内存溢......
  • atguigu7 秒杀_分布式锁/分布式信号量_MQ_Sentinel (seckill)
    0.前言0.1秒杀架构:0.2分布式下定时任务问题:引入分布式锁秒杀商品上架时,不能多个服务同时上架,防止重复上架秒杀时,不能多个服务同时秒杀成功,防止重复秒杀0.3秒杀系统关注......