首页 > 其他分享 >Vue2中使用Element-ui封装表单(el-form)组件动态渲染数据

Vue2中使用Element-ui封装表单(el-form)组件动态渲染数据

时间:2024-11-10 17:16:52浏览次数:7  
标签:el searchForm form default Element props 组件 label type

1. 创建一个searchForm组件,将需要封装的searchForm组件全局注册,为了方便下次直接使用

main.js文件中全局注册

import SearchForm from './components/SearchForm'
Vue.component('SearchForm', SearchForm)

2. 在searchForm组件中创建基本结构

<template>
  <div class="ces-search">
    <el-form
      class="form"
      ref="refForm"
      :size="size"
      inline
      :label-width="labelWidth"
    >
        <el-form-item
        v-for="item in searchForm"
        :label="item.label"
        :key="item.prop"
        class="formItem"
      >
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
export default {
  name: "SearchForm",
  props: {
    //控制文本框大小
    labelWidth: {
      type: String,
      default: "50px",
    },
    //控制每个控件的尺寸
    size: {
      type: String,
      default: "mini",
    },
    //渲染表单的表头和类型的数据
    searchForm: {
      type: Array,
      default: () => [],
    },
    //表单收集到的值
    searchData: {
      type: Object,
      default: () => {},
    },
  },
  data() {
    return {};
  },
  methods: {},
};
</script>
<style lang="less" >
.ces-search {
  display: flex;
  justify-content: space-between;
  .formItem {
    .el-form-item__label {
      width: 80px !important;
    }
  }
}
</style>

以上通过props传递的数据包含业务相关数据组件前端行为需要的数据

el-form-item会根据传递的searchForm数据进行遍历,每遍历一次会产生一个el-form-item,而我们只需要在遍历时拿着每一项进行判断,进而创建对应的表单组件

<el-form-item
        v-for="item in searchForm"
        :label="item.label"
        :key="item.prop"
        class="formItem"
      >
        <!-- 输入框 -->
        <el-input
          v-if="item.type === 'Input'"
          v-model="searchData[item.prop]"
          size="mini"
          :style="{ width: item.width }"
        >
        </el-input>

       <!-- 下拉框 -->
        <el-select
          v-if="item.type === 'Select'"
          v-model="searchData[item.prop]"
          size="mini"
          @change="item.change(searchData[item.prop])"
          :style="{ width: item.width }"
        >
          <el-option
            v-for="op in item.options"
            :label="op.label"
            :value="op.value"
            :key="op.value"
          >
              </el-option>   
              ...
              ...
              ...
</el-form-item>

3. 使用searchForm组件,并通过props传递数据

<template>
  <div class="ces-main">
    <searchForm
      label-width="50px"
      :searchData="searchData"
      :searchForm="searchForm"
    >
    </searchForm>
  </div>
</template>

export default {
  name: "home",
  data() {
    //表单查询一般分为input,下拉框,和日期,下面是下拉框时的设置下拉信息的情况,我的项目没有用到,但是留着方便看
    let sexs = [
      { label: "男", value: "1" },
      { label: "女", value: "2" },
    ];
    let sexProps = { label: "label", value: "value" };
    return {
      searchData: {
        //查询表单的对应的值
        name: "",
        sex: null,
      },
      searchForm: [
        //这里是渲染查询表单的表头和类型的数据
        {
          type: "Input",
          label: "姓名",
          prop: "name",
          width: "180px",
          placeholder: "请输入姓名...",
        },
        {
          type: "Select",
          label: "性别",
          prop: "sex",
          width: "180px",
          options: sexs,
          props: sexProps,
          change: (row) => console.log(row),
          placeholder: "请选择性别...",
        },
      ],
    };
  },

};
</script>

4. 表单操作按钮=>查询、新增、删除等按钮

searchForm组件通过props传递一个:isHandle="true"属性用来控制是否展示查询按钮等内容

  <searchForm
      :isHandle="true"
      size="mini"
      label-width="50px"
      :searchData="searchData"
      :searchForm="searchForm"
      :searchHandle="searchHandle"
    >
    </searchForm>

searchForm组件声明props属性接收

export default {
  props: {
    isHandle: {
      type: Boolean,
      default: true,	//默认为true,展示
    },
    ...

在模板中使用v-if判断isHandle属性,为true展示否则隐藏

在通过props传递一个searchHandle进行遍历展示具体内容

searchHandle: [
        { label: "查询", type: "primary", handle: this.handleQuery },
        { label: "重置", type: "primary", handle: this.handleReset },
      ],

在子组件声明接收

export default {
  props: {
    isHandle: {
      type: Boolean,
      default: true,	//默认为true,展示
    },
    searchHandle: {
      type: Array,
      default: () => [],
    },
    ...
    ...
    ...

接收完之后在子组件遍历展示

<el-form class="formT" inline v-if="isHandle">
      <el-form-item v-for="(item, index) in searchHandle" :key="index">
        <el-button
          :type="item.type"
          :size="item.size || size"
          @click="item.handle(12)"
          >{{ item.label }}</el-button
        >
      </el-form-item>
    </el-form>

5. 效果图展示:

6. 总结

searchForm中配置一组组对象,对象中包含要生成的控件类型并且添加一个属性,该属性的名字和在父组件的data定义的名字同名,因为要保证收集到的数据是响应式的,然后将该对象通过props传递给searchForm组件,之后会对searchForm进行遍历,每遍历一次就会根据当前对象生成一个表单控件

标签:el,searchForm,form,default,Element,props,组件,label,type
From: https://blog.csdn.net/weixin_53541596/article/details/143663341

相关文章

  • EPPlusExcel
     <ItemGroup><PackageReferenceInclude="EPPlus"Version="7.4.2"/></ItemGroup> usingOfficeOpenXml;namespaceEPPlusExcel{internalclassProgram{privatestaticvoidMain(string[]args)......
  • 45-best-time-to-buy-and-sell-stock-with-cooldown 力扣 714. 买卖股票的最佳时机包
    买卖股票系列【leetcode】40-best-time-to-buy-and-sell-stock力扣121.买卖股票的最佳时机【leetcode】41-best-time-to-buy-and-sell-stock-ii力扣122.买卖股票的最佳时机II【leetcode】42-best-time-to-buy-and-sell-stock-iii力扣123.买卖股票的最佳时机II......
  • 音乐创作人工具:capella-software 2024
    capellaFormymusicWriteyourscoresmoreeffectivelyusingautomaticobjectplacement,multipleselectionandrehearsalfunctions.capellareaderDisplay,playbackandprintscoresforfreeRevolutionizesyourrehearsals-everybodyiswellprep......
  • 救命啊!字节大模型算法实习岗面试居然栽在Transformer上了!!
    为什么在进行softmax之前需要对attention进行scaled(为什么除以dk的平方根)?transformer论文中的attention是ScaledDot-PorductAttention来计算keys和queries之间的关系。如下图所示:在公式一中,作者对0和K进行点积以获得注意力权重,然后这些权重用于加权平均V。但在实......
  • ffmpeg Video and Audio file format conversion
    Anysupportedfileformatandprotocolcanserveasinputtoffmpeg:Examples:YoucanuseYUVfilesasinput:ffmpeg-i/tmp/test%d.Y/tmp/out.mpgItwillusethefiles:/tmp/test0.Y,/tmp/test0.U,/tmp/test0.V,/tmp/test1.Y,/tmp/test1.U,/tmp/test1.V,etc......
  • FFmpeg Stream selection
    ffmpegprovidesthe-mapoptionformanualcontrolofstreamselectionineachoutputfile.Userscanskip-mapandletffmpegperformautomaticstreamselectionasdescribedbelow.The-vn/-an/-sn/-dnoptionscanbeusedtoskipinclusionofvideo,......
  • FFmpeg Libraries for developers
    libavutilisalibrarycontainingfunctionsforsimplifyingprogramming,includingrandomnumbergenerators,datastructures,mathematicsroutines,coremultimediautilities,andmuchmore.libavcodecisalibrarycontainingdecodersandencodersforaudio......
  • 图片表格文字模糊转电子版Excel的解决之道
    在面对图片中的表格文字需要转化为电子版Excel或其它格式文本时,当前的主流方法是借助OCR(光学字符识别)技术。然而,OCR技术的识别效果深受成像质量,即图像文字的清晰度影响。图像越模糊,识别的难度越大,效果也越不尽如人意;反之,清晰度越高,识别效果自然更佳。那么,导致图像模糊的原......
  • 总是忘记CSS中的transform 和transition的区别
    CSS中的transform和transition是两个非常重要的属性,它们共同作用于网页元素,以实现丰富的动画效果。以下是对这两个属性的详细解释:一、transform属性transform属性允许你对元素进行旋转、缩放、倾斜或平移等变换操作。这些变换操作可以单独使用,也可以组合使用,以实现更加复......
  • 新手入门Java自动化测试的利器:Selenium WebDriver
    今天我们将深入探讨一款强大的Java自动化测试工具——SeleniumWebDriver。在正式介绍SeleniumWebDriver之前,让我们首先对Selenium本身进行简要概述,以便更好地理解其背景和功能。官方学习网站:https://www.selenium.dev/Selenium是一个开源的自动化测试框架,WebDriver是其核心......