vue2+element表单,循环多个el-form-item并校验或校验多个表单

vue2+element表单,循环多个el-form-item并校验或校验多个表单

循环多个el-form-item并校验

表单样式

 <div class="addAbroad">
        <el-button
          type="primary"
          round
          size="mini"
          icon="el-icon-plus"
          @click="addModule()"
          >添加情况</el-button
        >
      </div>
 <el-form
        label-width="180px"
        :model="AbroadItem"
        ref="AbroadItem"
        :rules="AbroadRules" //***规则名***
        ><div class="edabroadModule">
          <el-form-item
            v-for="(item, goAbroadId) in AbroadItem.AbroadLists"
             //*****重点*****不能直接写(item, goAbroadId) in AbroadLists
            :key="goAbroadId"  //*****重点*****对应下标
            class="AbroadItem"
          >
            <div class="editAbroadItem">
                <el-form-item
                  label="开始时间:"
                  :rules="AbroadRules.goAbroadStartDate"//*****重点*****
                  :prop="`AbroadLists.${goAbroadId}.goAbroadStartDate`"//*****重点*****
                  //AbroadRules:规则名rules,goAbroadId:对应下标
                >
                  <el-date-picker
                    value-format="yyyy-MM-dd"
                    v-model="item.goAbroadStartDate"
                    placeholder="开始时间:"
                    type="date"
                  >
                  </el-date-picker>
                </el-form-item>
                <el-form-item
                  label="结束时间"
                  :rules="AbroadRules.goAbroadEndDate" //*****重点*****
                  :prop="`AbroadLists.${goAbroadId}.goAbroadEndDate`"//*****重点*****
                >
                  <el-date-picker
                    value-format="yyyy-MM-dd"
                    v-model="item.goAbroadEndDate"
                    placeholder="结束时间:"
                    type="date"
                  >
                  </el-date-picker
                ></el-form-item>
              <i class="el-icon-delete" @click="deleteModule(goAbroadId)"></i>
            </div>
            <div>
              <el-image
                style="width: 90%; height: 6px"
                :src="require('../../assets/img/line.png')"
              ></el-image>
            </div>
          </el-form-item></div
      ></el-form>

校验rules

 AbroadRules: {
        goAbroadStartDate: [
          { required: true, message: "必填", trigger: "blur" },
        ],
        goAbroadEndDate: [{ required: true, message: "必填", trigger: "blur" }],
        goAbroadStateUnit: [
          { required: true, message: "必填", trigger: "blur" },
        ],
        goAbroadGoal: [{ required: true, message: "必填", trigger: "blur" }],
        goAbroadMoneySource: [
          { required: true, message: "必填", trigger: "blur" },
        ],
        goAbroadExamineUnit: [
          { required: true, message: "必填", trigger: "blur" },
        ],
      },

添加、删除、和保存时校验的方法

 // 添加---添加方式是重点,直接添加一个空对象{},找不到对应的下标
    addModule() {
      this.AbroadItem.AbroadLists.push(Object.assign({}, this.AbroadItemObj));
    },
    // 删除--行
    deleteModule(index) {
      this.AbroadItem.AbroadLists.splice(index, 1);
    },
   <div class="editButton">
      <el-button
        size="small"
        type="primary"
        icon="el-icon-thumb"
        @click="submitForm('AbroadItem')" //*****重点*****要写参数
        >保存</el-button
      >
    </div>
   // 保存方法
    submitForm(AbroadItem) {//*****重点*****要写对应一致的参数
      this.$refs[AbroadItem].validate((valid) => {
        if (valid) {
        //这里是转map结构,如不需要可忽略
          var AbroadMap = new Map();
          AbroadMap.set(this.goAbroadPeopleNum, this.AbroadItem.AbroadLists);
          let obj = Object.create(null);
          for (let [k, v] of AbroadMap) {
            obj[k] = v;
          }
          let specialty = JSON.stringify(obj); //
          saveAbroadInfo(specialty)
            .then((res) => {
              if (res.status == 200) {
                this.loading = false;
                this.$message({
                  type: "success",
                  message: res.message,
                });
              } else {
                this.$message({
                  type: "info",
                  message: res.message,
                });
              }
            })
            .catch((err) => {
              this.loading = false;
            });
        } else {
          return false;
        }
      });
    },

校验多个表单并循环多个el-form-item

保存的点击事件

 <div class="editButton">
      <el-button
        size="small"
        type="primary"
        icon="el-icon-thumb"
        @click="submitForm('issueItem', 'readItem', 'researchItem')" //要传多个参数
        >保存</el-button
      >
    </div>

保存的方法

    // 保存
    submitForm(readItem, issueItem, researchItem) { //对应一致的多个参数
      const form1 = new Promise((resolve, reject) => {
        this.$refs[readItem].validate((valid) => {
          if (valid) resolve();
        });
      });
      const form2 = new Promise((resolve, reject) => {
        this.$refs[issueItem].validate((valid) => {
          if (valid) resolve();
        });
      });
      const form3 = new Promise((resolve, reject) => {
        this.$refs[researchItem].validate((valid) => {
          if (valid) resolve();
        });
      });
      Promise.all([form1, form2, form3]).then(() => {
       //连接口1
       //连接口2
       //连接口3
      });
    },

添加、删除和el-form-item每一项对应的方法如上

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供代码示例,实现用 Vue Element-UI 封装一个带有分块、包含 el-formel-tabs 组件。代码如下: ```vue <template> <div class="xs-tabs-form-container"> <el-tabs v-model="activeTab" style="height: 100%"> <el-tab-pane :label="pane.label" :key="index" v-for="(pane, index) in tabPanes"> <el-form :model="formData" :rules="formRules" ref="xsForm" label-width="100px"> <el-row :gutter="20" v-for="(element, rowIndex) in pane.elements" :key="rowIndex"> <el-col :span="12" v-for="(item, colIndex) in element" :key="colIndex"> <el-form-item :label="item.label" :prop="item.prop"> <template v-if="item.custom"> <slot :name="item.prop" :item="item"></slot> </template> <template v-else> <el-input v-model="formData[item.prop]"></el-input> </template> </el-form-item> </el-col> </el-row> <el-form-item> <el-button type="primary" @click="submitForm">提交</el-button> </el-form-item> </el-form> </el-tab-pane> </el-tabs> </div> </template> <script> export default { name: "XsTabsForm", props: { tabPanes: { type: Array, // [{label: 'Tab 1', elements: [[{label: 'Field 1', prop: 'field1'}]]}] required: true }, rules: { type: Object, // {field1: [{required: true, message: '不能为空', trigger: 'blur'}]} required: true } }, data() { return { activeTab: 0, formData: {} }; }, computed: { formRules() { const rules = {}; for (let key of Object.keys(this.formData)) { if (this.rules[key]) { rules[key] = this.rules[key]; } } return rules; } }, methods: { submitForm() { this.$refs['xsForm'].validate((valid) => { if (valid) { this.$emit('submit-form', this.formData); } else { this.$message.error('表单校验失败,请检查输入'); } }); } } }; </script> <style scoped> .xs-tabs-form-container { height: 100%; } </style> ``` 您可以通过 `tabPanes` 和 `rules` 两个参数传递组件中的标签页面和表单控制参数。每个标签页面可以包含多个行,每行包含多个表单项。可以选择使用默认的输入框,也可以通过 `item.custom` 参数自定义表单控件。您可以在 `submit-form` 事件中获取表单数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值