form表单的三种封装方法(Vue+ElementUI)

1.首先是最普通,也是大家最先想到的方法,直接封装:

<template>
  <el-form
    :inline="true"
    :model="value"
    label-position="right"
    :label-width="formConfig.labelWidth"
    :rules="rules"
    size='mini'
  >
    <slot name="formItem" />
    <el-form-item
      v-for="(item,index) in formConfig.formItemList"
      :key="index"
      :label="item.label"
      :prop="item.prop"
    >
      <el-input
        v-if="item.type=='input'"
        v-model="value[item.prop]"
        :disabled="item.disabled"
        :clearable="true"
        :placeholder="item.placeholder"
      ></el-input>
      <el-select
        :clearable="true"
        v-else-if="item.type=='select'"
        v-model="value[item.prop]"
        :disabled="item.disabled"
        :placeholder="item.placeholder"
      >
        <el-option
          v-for="(optItem,index) in item.optList"
          :key="index"
          :label="optItem.label"
          :value="optItem.value"
        ></el-option>
      </el-select>
      <el-date-picker
        :value-format="item.dateFormate"
        v-else
        v-model="value[item.prop]"
        :type="item.type"
        :disabled="item.disabled"
        :clearable="true"
        :placeholder="item.label"
      ></el-date-picker>
    </el-form-item>
    <div class="searchBtn">
      <el-button-group>
        <el-button
          v-for="(item, index) in formConfig.operate"
          :key="index"
          size="small"
          :type="item.type"
          :icon="item.icon"
          @click="item.handleClick"
        >{{item.name}}
        </el-button>
      </el-button-group>
      <slot name="operate"></slot>
    </div>
  </el-form>
</template>
<script>
export default {
  components: {},
  props: {
    formConfig: {
      type: Object,
      required: true
    },
    value: {
      type: Object,
      required: true
    },
    rules: {
      type: Object
    }
  },
  computed: {},
  methods: {
    setDefaultValue() {
      const formData = { ...this.value };
      // 设置默认值
      this.formConfig.formItemList.forEach(({ key, value }) => {
        if (formData[key] === undefined || formData[key] === null) {
          formData[key] = value;
        }
      });
      this.$emit("input", formData);
    }
  },
  mounted() {
    this.setDefaultValue();
  }
};
</script>

使用Vue的slot插槽来动态渲染各个表单项。通过传递不同的参数来确定表单项的类型、值和验证规则等。基本能够处理解决大多数的表单问题,并且与slot的完美组合,已经可以达到我们的需求要求。
这种方法的优点是灵活性较高,但需要手动编写大量模板代码,也容易出现一些兼容性问题。

2.实现表单动态渲染、可视化配置的方法,动态表单又可以分为两种方法:(注意:注意 v-model 的绑定问题, 组件内不能直接修改props 。)

  1. 首先,需要配置 el-form :
<template>
  <el-form
          class="dynamic-form"
          :inline="formConfig.inline"
          :model="value"
          :label-position="formConfig.labelPosition"
          :label-width="formConfig.labelWidth"
          :size='formConfig.size'
          :status-icon="formConfig.statusIcon">
    <slot/>
  </el-form>
</template>
<script>
  export default {
    props: {
      formConfig: {
        type: Object,
        required: true
      },
      value: {
        type: Object,
        required: true
      }
    },
    methods: {
      setDefaultValue() {
        const formData = { ...this.value };
        // 设置默认值
        this.formConfig.formItemList.forEach(({ key, value }) => {
          if (formData[key] === undefined || formData[key] === null) {
            formData[key] = value
          }
        });
        this.$emit('input', formData)
      }
    },
    mounted() {
      this.setDefaultValue()
    },
  }
</script>
  1. 开始渲染 form-item :
  • 第一种,利用 vue 内置的 component 组件,写起来可能像这样:
<el-form-item>
 <component :is="`el-${item.type}`" />
</el-form-item>
  • 第二种,使用 v-if 逐个判断:
<el-form-item>
 <el-input v-if="item.type === 'input'" />
 <span v-else>未知控件类型</span>
</el-form-item>

简单介绍

<template>
  <el-form-item :label="label">
    <el-select v-model="currentValue" @input="onInputEvent" size="small">
      <el-option
              v-for="item in options"
              :key="item.value"
              :label="item.label"
              :value="item.value">
      </el-option>
    </el-select>
  </el-form-item>
</template>

<script>
  import formMixins from '~/components/Form/iForm/form-model'
  export default {
    name: "SelectList",
    props: ['name', 'label', 'value', 'options'],
    mixins: [formMixins],
    data() {
      return {
        currentValue: this.value
      }
    }
  }
</script>

由于每个表单组件都是监听父元素的value值变化,数据变化时都是触发onInputEvent并执行this.$emit(‘input’),所以我们可以把这部分内容抽取出来放在mixins里面。

export default {
    props: ['name', 'value'],

    data () {
        return {
            currentValue: this.value
        };
    },
    methods: {
        onInputEvent(value) {
            this.$emit('input', this.name, value);
        },
        reset() {
            this.currentValue = "";
        }
    },
    watch: {
        value (val) {
            this.currentValue = val;
        }
    }
};

3. 动态生成表单

这里主要是根据配置的数据,循环生成表单组件。默认提供提交和重置按钮,如果不需要可以通过slot传递其他操作按钮。这里的要点主要有: 监听表单组件的数据变化: 每个表单组件都有一个name标识它的业务含义,绑定的数据也是formData[field.name],@input事件传递updateForm,在updateForm里面更新this.formData[name],保证了this.formData里面的数据是和表单组件选择/填写的内容一致。 重置时改变表单组件的数据: 因为组件内部会监听父元素的value,所以这里只要清空this.formData的值,组件内部的数据也会跟着清空。

<template>
  <div>
    <el-form :inline="true" ref="form" :model="formData" class="demo-form-inline">
      <el-col :span="field.cols" v-for="(field, index) in config.fieldsConfig" v-bind:key="index">
        <component :key="index"
                   :is="field.fieldType"
                   :label="field.label"
                   :value="formData[field.name]"
                   :multiple="field.multiple"
                   @input="updateForm"
                   v-bind="field"
                   :options="field.options"
                   :ref="field.name"
        >
        </component>
      </el-col>
      <slot name="buttons">
        <el-button type="primary" @click="submit" size="small">{{onSubmitText}}</el-button>
        <el-button type="default" @click="reset" size="small">{{onResetText}}</el-button>
      </slot>
    </el-form>
  </div>
</template>

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Vue ElementUI提供了丰富的表单组件,但是在实际开发中,我们可能需要对表单进行封装,以便于复用和统一管理。以下是一些封装表单的思路: 1. 将表单组件封装成一个单独的组件,包括表单项、校验规则、提交事件等。这样可以将表单的逻辑和UI分离,方便维护和修改。 2. 使用插槽(slot)来动态渲染表单项,可以根据需要添加、删除、修改表单项,提高表单的灵活性。 3. 将表单项的校验规则封装成一个单独的对象,可以在多个表单中复用,减少代码冗余。 4. 使用v-model来双向绑定表单数据,方便获取和提交表单数据。 5. 使用ElementUI提供的表单验证规则,可以快速实现表单的校验功能,减少开发时间和代码量。 总之,封装表单可以提高代码的复用性和可维护性,同时也可以提高开发效率和代码质量。 ### 回答2: Vue是一个流行的前端框架,Element UI则是一个基于Vue框架的UI库。在Vue应用程序中使用Element UI封装form表单,可以简化表单的开发流程,并且可以提供一致性的UI风格。 Element UI提供了大量的表单组件,如输入框、下拉框、日期选择等。在Vue中使用Element UI表单组件,需要对其进行封装,以便可以更方便地使用。 首先,在Vue组件中引入ElementUI库,可以通过install方法进行注册。在组件中注册可以方便使用,同时也可以控制内部封装实现,让表单组件更加灵活地适应业务场景。 其次,需要定义表单数据模型,可以使用组件中的data对象来定义,每个数据字段对应一个表单输入框。将表单数据模型和Element UI组件双向绑定,可以实现对表单数据的自动更新。 然后,定义表单校验规则,可以使用Element UI提供的Validator组件,同时也可以自定义校验规则。在提交表单前进行表单校验,可以避免用户输入不合法数据造成数据异常。 最后,封装表单提交方法,可以使用Vue的methods方法进行实现。在提交表单时,需要将表单数据转换为JSON格式,以便可以进行后续处理。 综上所述,通过对Element UI表单组件进行封装,可以实现更加便捷、高效、可维护的表单开发。同时,也可以提高用户体验,降低用户输入错误的概率,提高数据的准确性和可靠性。 ### 回答3: Vue ElementUI是一套基于Vue.js的UI组件库,它的封装了丰富的组件和样式,使得我们在编写前端页面时可以快速搭建页面、提高开发效率。其中Form表单组件是最常用的之一。 在Vue Element UI中使用Form表单组件时,我们往往会发现它所提供的属性和方法已经足够满足我们大部分的需求。但是,在实际开发中,我们可能会遇到一些特殊的需求,需要封装一些自定义的逻辑和验证规则,比如异步校验、业务逻辑校验。这时候,我们就需要对Vue ELementUIForm表单组件进行封装封装Form表单组件的目的就是为了封装我们常用的数据校验、提交等逻辑,提高代码的重用性和可维护性。在封装时,我们需要考虑以下几个方面: 1.表单数据的绑定: 在封装时,我们需要考虑表单数据的双向绑定,通常我们会将表单数据绑定在组件的数据对象中,并且在数据对象中提供一个reset方法,用于重置表单数据。 2.验证规则的扩展: 在Vue Element UI中,每个表单控件都可以设置相应的验证规则,比如必填、邮箱、手机号等等,但是有时候我们会遇到一些特殊的需求,比如异步校验、业务逻辑校验等,我们需要对这些验证进行特殊处理,可以通过自定义的验证方法来实现。 3.表单提交: 封装表单的最终目的就是为了实现表单的提交,并处理提交的结果。我们可以将表单的提交和结果处理封装方法,并以事件的形式发布出去,供父组件调用。 综上所述,封装Vue ElementUIForm表单组件可以帮助我们提高代码的重用性和可维护性,减少代码的重复编写。同时,也可以使得我们的前端页面开发更加高效,更好地实现页面交互效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值