Element动态多表单验证

Element动态多表单验证

需求

表单可以进行增加删除操作 需要进行表单校验
在这里插入图片描述

思路

每一块作为单独的一个表单组件 每一个表单的规则采用动态规则 规则的数据结构 需要与 数据的数据结构保持一致
eg:`

模板:<el-form-item
          label="业务因子"
          prop="workFactors.factors"
        >
          <el-select
            v-model="correlationForms.workFactors.factors"
            filterable
            placeholder="请选择"
          >
            <el-option
              v-for="item in businessFactorsList"
              :key="item.ID"
              :label="item.Name"
              :value="item.ID"
            >
            </el-option>
          </el-select>
        </el-form-item>
规则:   // 业务因子
        workFactors: {
          factors: [// 业务因子
            {
              required: true, message: '请选择业务因子', trigger: 'change'

            }
          ],
          ruleChar: [// 运算符号
            {
              required: true, message: '请选择运算符号', trigger: 'change'

            }
          ],
          value: [// 指标值
            {
              required: true, message: '请输入指标值', trigger: 'blur'

            }
          ]
        },

数据结构

completionRule: // 去除数据来源
        {
          isUse: '',
          ruleText: [
            {
              dataFrom: '',
              dateScope: [],
              alarm: ''
            }
          ]
        },

实现

1.父组件:将每一块作为单独的表单引进来


   <div
      v-if="resourceAdd.ruleType==='单值预测'"
      key="single"
    >
      <!-- 单值 -->
      <RemoveRule
        ref="removeRuleRef"
        :remove-rule="removeRule"
      />
      <div class="box-space"></div>
      <CompletionRule
        ref="completionRuleRef"
        :completion-rule="completionRule"
      />
      <div class="box-space"></div>
      <MarketingMark
        ref="marketingMarkRef"
        :marketing-mark="marketingMark"
      />
      <div class="box-space"></div>
      <HolidayMark
        ref="holidayMarkRef"
        :holiday-mark="holidayMark"
      />
    </div>

2.子组件 具体的表单 子组件的表单值应由父组件传入 通过函数返回 在父组件中进行调用 拿到修改后的表单值

<template>
  <el-form
    ref="holidayMarkFormRef"
    :inline="true"
    :model="holidayMarks"

    class="demo-form-inline inms-web-form"
    size="small"
    label-width="100px"
  >
    <div class="box-space"></div>
    <div class="box-single">
      <div class="inms-card-bg">
        <div class="inms-innerHeader">
          节假日标识

          <el-switch
            v-model="holidayMarks.isUse"
            active-value="1"
            inactive-value="0"
          ></el-switch>
        </div>
      </div>

      <div
        class="ml30"
        ref="holidayRef"
      >
        <!-- 遮罩层 用来达到只读效果 -->
        <div
          class="box-mask"
          :style="{height:holidayHeight+'px'}"
        ></div>

        <p class="ml10">
          <el-button
            type="primary"
            @click="addHolidayList"
          >
            添加节假日
          </el-button>
        </p>
        <p
          style="position:relative"
          v-for="(o,index) in holidayMarks.ruleText"

          :key="index"
        >
          <el-form-item
            label="节假日名称"
            :prop="'ruleText.'+ index +'.markName'"
            :rules="{
              required: holidayMarks.isUse==='0'?false:true, message: '请输入节假日名称', trigger: 'blur'
            }"
          >
            <el-input
              v-model="o.markName"
              placeholder="请输入搜索内容"
              clearable
            ></el-input>
          </el-form-item>

          <el-form-item
            label="节假日日期"

            :prop="'ruleText.'+ index +'.dateScope'"
            :rules="{
              required: holidayMarks.isUse==='0'?false:true, message: '请选择节假日日期', trigger: 'change'
            }"
          >
            <el-date-picker
              v-model="o.dateScope"
              type="daterange"
              style="width: 80%;"
              range-separator="至"
              start-placeholder="开始日期"
              end-placeholder="结束日期"
              format="yyyy-MM-dd"
              value-format="yyyy-MM-dd"
              size="mini"
            >
            </el-date-picker>
          </el-form-item>

          <el-button
            type="primary"
            style="position:absolute;right:100px"
            @click="()=>delHoliday(index)"
          >
            删除
          </el-button>
        </p>
      </div>
    </div>
  </el-form>
</template>

<script>
export default {
  props: {

    holidayMark: {
      type: Object,
      default: null
    }
  },
  computed: {

  },
  data () {
    return {

      holidayHeight: 0, // 节假日标识遮罩层高度
      holidayMarks: {
        isUse: '',
        ruleText: [{ markName: '', dateScope: [] }]
      },

      // 节假日标识
      holidayList: [
        {
          Name: '1',
          time: []
        }
      ]

    }
  },
  methods: {

    // 节假日添加节假日
    addHolidayList () {
      this.$set(this.holidayMarks.ruleText, this.holidayMarks.ruleText.length, { markName: '', dateScope: [] })
    },
    // 营销活动删除活动
    delHoliday (index) {
      this.$delete(this.holidayMarks.ruleText, index)
    },
    // 清除表单验证 当开关关闭时候 (指定表单清除)
    clearFormItem (dom, form, ruleName) {
      const clearArr = []
      form.forEach((item, index) => {
        Object.keys(item).map((name, idx) => {
          this.$set(clearArr, clearArr.length, ruleName + '.' + index + '.' + name)
        })
      })
      // 获取要清除的数组
      dom.clearValidate(clearArr)
    },
    getData () {
      // 循环遍历holidayMarks.ruleText 处理dateScope
      const obj = JSON.parse(JSON.stringify(this.holidayMarks))
      obj.ruleText.map((item, index) => {
        if (item.dateScope) {
          item.dateScope = item.dateScope.join(',')
        }
      })
      return obj
    }
  },
  watch: {
    // 监听传进来的表单值 拿中间变量接收
    holidayMark: {
      deep: true,
      immediate: true,
      handler (val, oldVal) {
        // 处理其中的dateScope 将其转化为数组
        const obj = JSON.parse(JSON.stringify(val))
        obj.ruleText.map((item, index) => {
          if (item.dateScope) {
            item.dateScope = item.dateScope.split(',')
          }
        })
        this.holidayMarks = obj || {
          isUse: '',
          ruleText: [{ markName: '', dateScope: [] }]
        }
      }
    },
    // 监听节假日活动的开关变化 用来获取此节点高度  赋给遮罩层高度 达到只读效果
    'holidayMarks.isUse': {
      deep: true,
      immediate: true,
      handler (val, oldVal) {
        if (val === '0') { // if val==='false' disabled=true 显示遮罩层
          this.$nextTick(() => {
            this.holidayHeight = this.$refs.holidayRef.offsetHeight
            // this.clearFormItem(this.$refs.holidayMarkFormRef, this.holidayMarks.ruleText, 'ruleText')
            // this.$refs.holidayMarkFormRef.resetFields()
          })
        } else {
          this.holidayHeight = 0
        }
      }
    }

  }
}
</script>
<style scoped lang="scss">
  .ml10{
    margin-left:10px
  }
  .ml30{
    margin-left:30px;
  }
.box-single{
  background-color: #fff;
  margin:0px 12px;
}
.box-space{
  background-color: #f2f2f2;
  box-sizing: border-box;
  margin:0px 12px;
  width:100%;
  height:20px;
}
.box-mask{
  width:100%;
  height:10px;
  position:absolute;
  z-index:1;
  background-color: rgba(255,255,255,0.3);
}
</style>

3.点击提交时 需要对每个表单进行校验(使用promise.all等待表单校验结果) 如果校验通过 将表单的数据都取出来 放到一个对象里带给后端

 // 点击保存
    submit () {
      // 当前表单校验
      const addform = new Promise((resolve, reject) => {
        this.$refs.addFormRef.validate((valid) => {
          if (valid) {
            resolve(true)
          }
        })
      })
      // 表单缺失数据补齐规则校验 removeRuleRef
      const removeRuleform = this.$refs.removeRuleRef && new Promise((resolve, reject) => {
        this.$refs.removeRuleRef.$refs.removeRuleFormRef.validate((valid) => {
          if (valid) {
            resolve(true)
          }
        })
      })

      // 单值表单去除数据校验 completionRuleFormRef
      const completionRuleform = this.$refs.completionRuleRef && new Promise((resolve, reject) => {
        this.$refs.completionRuleRef.$refs.completionRuleFormRef.validate((valid) => {
          if (valid) {
            resolve(true)
          }
        })
      })
      // 单值表单营销活动验证
      const marketingMarkform = this.$refs.marketingMarkRef && new Promise((resolve, reject) => {
        this.$refs.marketingMarkRef.$refs.marketingMarkFormRef.validate((valid) => {
          if (valid) {
            resolve(true)
          }
        })
      })
      // 表单验证节假日
      const holidayMarkform = this.$refs.holidayMarkRef && new Promise((resolve, reject) => {
        this.$refs.holidayMarkRef.$refs.holidayMarkFormRef.validate((valid) => {
          if (valid) {
            resolve(true)
          }
        })
      })
      // 关联校验
      const correlationform = this.$refs.correlationRef && new Promise((resolve, reject) => {
        this.$refs.correlationRef.$refs.correlationFormRef.validate((valid) => {
          if (valid) {
            resolve(true)
          }
        })
      })

      // 判断选择结果
      switch (this.resourceAdd.ruleType) {
        case '单值预测': // 选择单值
        // 进行 当前与单值的表单校验
          Promise.all([addform, removeRuleform, completionRuleform, marketingMarkform, holidayMarkform]).then(() => {
            const removeRuleformData = this.$refs.removeRuleRef.getData()
            const completionRuleformData = this.$refs.completionRuleRef.getData()
            const marketingMarkformData = this.$refs.marketingMarkRef.getData()
            const holidayMarkformData = this.$refs.holidayMarkRef.getData()
            const queryObj = {}
            queryObj.ruleName = this.resourceAdd.ruleName
            queryObj.ruleType = this.resourceAdd.ruleType
            queryObj.isUse = this.resourceAdd.isUse
            queryObj.removeRule = removeRuleformData
            queryObj.completionRule = completionRuleformData
            queryObj.marketingMark = marketingMarkformData
            queryObj.holidayMark = holidayMarkformData

            if (this.intId) {
              // 修改
              queryObj.intId = this.intId
              queryObj.ruleCode = this.ruleCode

              this.updateRules(queryObj)
              this.back()
            } else {
              // 新增
              /*        queryObj.ruleName = this.resourceAdd.ruleName
              queryObj.ruleType = this.resourceAdd.ruleType
              queryObj.isUse = this.resourceAdd.isUse
              queryObj.removeRule = removeRuleformData
              queryObj.completionRule = completionRuleformData
              queryObj.marketingMark = marketingMarkformData
              queryObj.holidayMark = holidayMarkformData */
              this.PredictionRules(queryObj)
              this.back()
            }
          }).catch((message) => {
            this.Tip(message, 'error')
          })

          break
        case '关联预测': // 选择关联
          // 进行 当前与关联的表单校验
          Promise.all([addform, correlationform]).then(() => {
            const correlationformData = this.$refs.correlationRef.getData()
            const queryObj = {
              ...this.resourceAdd, // 当前表单
              ...correlationformData // 关联表单
            }
            if (this.intId) {
              // 修改

              queryObj.intId = this.intId
              queryObj.ruleCode = this.ruleCode

              this.updateRules(queryObj)
              this.back()
            } else {
              // 新增
              this.PredictionRules(queryObj)
              this.back()
            }
            //
            /*             const addFormData = this.$refs.addFrom.getData()
            const correlationformData = this.$refs.correlationform.getData()
            this.Tip({ ...addFormData, ...correlationformData }, 'success') */

            // const reqData = Object.assign(publicData, userData)
            // console.log(reqData)
          }).catch((message) => {
            this.Tip(message, 'error')
          })
          break
      }

完整代码

父组件:

<template>
  <div
    class="inms-web-box"
    style="padding:16px;box-sizing:border-box"
  >
    <div class="inms-container">
      <el-card
        class="inms-box-card"
        shadow="never"
      >
        <div slot="header">
          <el-link
            class="vm"
            @click="back"
            :underline="false"
          >
            <svg-icon
              class="f-12 mr-10"
              icon-class="back"
            />
          </el-link>
          <span class="card-header vm">
            容量预测规则>{{ intId?'修改':'新增' }}
          </span>
        </div>
      </el-card>
    </div>
    <div
      class="box-single"
      style="padding-top:20px"
    >
      <el-form
        ref="addFormRef"
        :inline="true"
        :model="resourceAdd"
        :rules="rules"
        class="demo-form-inline inms-web-form"
        size="small"
        label-width="100px"
      >
        <el-form-item
          label="规则名称"
          prop="ruleName"
        >
          <el-input
            v-model="resourceAdd.ruleName"
            placeholder="请输入搜索内容"
            clearable
          ></el-input>
        </el-form-item>
        <el-form-item
          label="规则类型"
          prop="ruleType"
        >
          <el-select
            :disabled="intId?true:false"
            v-model="resourceAdd.ruleType"
            filterable
            placeholder="请选择"
          >
            <el-option
              v-for="item in commandList"
              :key="item.ID"
              :label="item.Name"
              :value="item.ID"
            >
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item
          label="是否生效"

          style="width:'150px;"
        >
          <el-switch
            v-model="resourceAdd.isUse"
            active-value="1"
            inactive-value="0"
          ></el-switch>
        </el-form-item>
      </el-form>
    </div>
    <div class="box-space"></div>
    <div
      v-if="resourceAdd.ruleType==='单值预测'"
      key="single"
    >
      <!-- 单值 -->
      <RemoveRule
        ref="removeRuleRef"
        :remove-rule="removeRule"
      />
      <div class="box-space"></div>
      <CompletionRule
        ref="completionRuleRef"
        :completion-rule="completionRule"
      />
      <div class="box-space"></div>
      <MarketingMark
        ref="marketingMarkRef"
        :marketing-mark="marketingMark"
      />
      <div class="box-space"></div>
      <HolidayMark
        ref="holidayMarkRef"
        :holiday-mark="holidayMark"
      />
    </div>
    <div
      v-if="resourceAdd.ruleType==='关联预测'"
      key="correlation"
    >
      <Correlation
        ref="correlationRef"
        :rules="rules"
        :correlation-form="correlationForm"
      ></Correlation>
      <!-- 关联 -->
    </div>
    <div class="box-space"></div>
    <div
      class="box-single"
      style="display:flex;justify-content:center;align-items=center"
    >
      <p>
        <el-button
          size="big"
          style="margin-right:100px"
          @click="back"
        >
          取消
        </el-button>
        <el-button
          class="mr40"
          type="primary"
          size="big"
          @click="submit"
        >
          保存
        </el-button>
      </p>
    </div>
  </div>
</template>
<script>
import { addPredictionRules, RulesOne, updatePredictionRules } from '../../api/index.js'
import CompletionRule from './SingleValue/CompletionRule.vue'

import Correlation from './Correlation/Index.vue'
import HolidayMark from './SingleValue/Holiday.vue'

import MarketingMark from './SingleValue/Marketing.vue'
import RemoveRule from './SingleValue/RemoveRule.vue'
// prop绑定的类要与v-model绑定的一致
export default {
  components: {
    CompletionRule,
    MarketingMark,
    HolidayMark,
    RemoveRule,
    Correlation
  },
  data () {
    return {
      intId: '',
      ruleCode: '',
      resourceAdd: {
        ruleName: '',
        ruleType: '',
        isUse: ''
      },
      removeRule: { // 单值数据规则
        isUse: '',
        ruleText: ''
      },
      completionRule: // 去除数据来源
        {
          isUse: '',
          ruleText: [
            {
              dataFrom: '',
              dateScope: [],
              alarm: ''
            }
          ]
        },

      // 单值表单

      marketingMark: {
        isUse: '',
        ruleText: [{ markName: '', dateScope: [] }]
      },
      holidayMark: {
        isUse: '',
        ruleText: [{ markName: '', dateScope: [] }]
      },
      correlationForm: { // 关联表单
        workFactors: {
          factors: 'TPS',
          ruleChar: '',
          value: ''
        },
        forecastResults: {
          dateScope: [],
          value: '',
          rate: ''

        }

      },
      commandList: [
        {
          ID: '单值预测',
          Name: '单值预测'
        },
        {
          ID: '关联预测',
          Name: '关联预测'
        }
      ],
      rules: {
        ruleName: [ // 规则名称
          {
            required: true, message: '请输入规则名称', trigger: 'blur'
          }
        ],
        ruleType: [// 规则类型
          {
            required: true, message: '请选择规则类型', trigger: 'change'
          }
        ],

        // 关联
        // 业务因子
        workFactors: {
          factors: [// 业务因子
            {
              required: true, message: '请选择业务因子', trigger: 'change'

            }
          ],
          ruleChar: [// 运算符号
            {
              required: true, message: '请选择运算符号', trigger: 'change'

            }
          ],
          value: [// 指标值
            {
              required: true, message: '请输入指标值', trigger: 'blur'

            }
          ]
        },
        // 预测结果
        forecastResults: {
          dateScope: [// 未来影响范围
            {
              required: true, message: '请选择未来影响范围', trigger: 'change'

            }
          ],
          value: [// 预测值
            {
              required: true, message: '请选择预测值', trigger: 'change'

            }
          ],
          rate: [// 比率
            {
              required: true, message: '请选择预测值', trigger: 'blur'

            }
          ]
        }

      }

    }
  },
  created () {
    this.intId = this.$route.query.intId
    this.ruleCode = this.$route.query.ruleCode
  },
  mounted () {
    if (this.intId) {
      this.getRulesOne()
    }
  },
  methods: {
    back () {
      this.$router.push('/dcimPrivatenetwork/resourcecapacity')
    },
    // 提示
    Tip (message, type) {
      this.$message({
        message: message,
        type: type
      })
    },

    async PredictionRules (params) {
      try {
        const { data } = addPredictionRules(params)
      } catch {

      }
    },
    // 编辑时  获取表单值
    async getRulesOne () {
      try {
        const { data } = await RulesOne(Number(this.intId))

        // 拿到数据 赋值
        this.resourceAdd.ruleName = data.ruleName
        this.resourceAdd.ruleType = data.ruleType
        this.resourceAdd.isUse = data.isUse
        // 单值表单
        this.completionRule = data.completionRule
        this.holidayMark = data.holidayMark
        this.marketingMark = data.marketingMark || {
          isUse: '',
          ruleText: [{ markName: '', dateScope: [] }]
        }
        this.removeRule = data.removeRule
        // 关联表单

        this.correlationForm.forecastResults = data.forecastResults || {
          dateScope: [],
          value: '',
          rate: ''

        }
        this.correlationForm.workFactors = data.workFactors || {
          factors: 'TPS',
          ruleChar: '',
          value: ''
        }
      } catch {

      }
    },
    // 编辑接口
    async updateRules (params) {
      try {
        const { data } = await updatePredictionRules(params)
      } catch {

      }
    },
    // 点击保存
    submit () {
      // 当前表单校验
      const addform = new Promise((resolve, reject) => {
        this.$refs.addFormRef.validate((valid) => {
          if (valid) {
            resolve(true)
          }
        })
      })
      // 表单确实数据补齐规则校验 removeRuleRef
      const removeRuleform = this.$refs.removeRuleRef && new Promise((resolve, reject) => {
        this.$refs.removeRuleRef.$refs.removeRuleFormRef.validate((valid) => {
          if (valid) {
            resolve(true)
          }
        })
      })

      // 单值表单去除数据校验 completionRuleFormRef
      const completionRuleform = this.$refs.completionRuleRef && new Promise((resolve, reject) => {
        this.$refs.completionRuleRef.$refs.completionRuleFormRef.validate((valid) => {
          if (valid) {
            resolve(true)
          }
        })
      })
      // 单值表单营销活动验证
      const marketingMarkform = this.$refs.marketingMarkRef && new Promise((resolve, reject) => {
        this.$refs.marketingMarkRef.$refs.marketingMarkFormRef.validate((valid) => {
          if (valid) {
            resolve(true)
          }
        })
      })
      // 表单验证节假日
      const holidayMarkform = this.$refs.holidayMarkRef && new Promise((resolve, reject) => {
        this.$refs.holidayMarkRef.$refs.holidayMarkFormRef.validate((valid) => {
          if (valid) {
            resolve(true)
          }
        })
      })
      // 关联校验
      const correlationform = this.$refs.correlationRef && new Promise((resolve, reject) => {
        this.$refs.correlationRef.$refs.correlationFormRef.validate((valid) => {
          if (valid) {
            resolve(true)
          }
        })
      })

      // 判断选择结果
      switch (this.resourceAdd.ruleType) {
        case '单值预测': // 选择单值
        // 进行 当前与单值的表单校验
          Promise.all([addform, removeRuleform, completionRuleform, marketingMarkform, holidayMarkform]).then(() => {
            const removeRuleformData = this.$refs.removeRuleRef.getData()
            const completionRuleformData = this.$refs.completionRuleRef.getData()
            const marketingMarkformData = this.$refs.marketingMarkRef.getData()
            const holidayMarkformData = this.$refs.holidayMarkRef.getData()
            const queryObj = {}
            queryObj.ruleName = this.resourceAdd.ruleName
            queryObj.ruleType = this.resourceAdd.ruleType
            queryObj.isUse = this.resourceAdd.isUse
            queryObj.removeRule = removeRuleformData
            queryObj.completionRule = completionRuleformData
            queryObj.marketingMark = marketingMarkformData
            queryObj.holidayMark = holidayMarkformData

            if (this.intId) {
              // 修改
              queryObj.intId = this.intId
              queryObj.ruleCode = this.ruleCode

              this.updateRules(queryObj)
              this.back()
            } else {
              // 新增
              /*        queryObj.ruleName = this.resourceAdd.ruleName
              queryObj.ruleType = this.resourceAdd.ruleType
              queryObj.isUse = this.resourceAdd.isUse
              queryObj.removeRule = removeRuleformData
              queryObj.completionRule = completionRuleformData
              queryObj.marketingMark = marketingMarkformData
              queryObj.holidayMark = holidayMarkformData */
              this.PredictionRules(queryObj)
              this.back()
            }
          }).catch((message) => {
            this.Tip(message, 'error')
          })

          break
        case '关联预测': // 选择关联
          // 进行 当前与关联的表单校验
          Promise.all([addform, correlationform]).then(() => {
            const correlationformData = this.$refs.correlationRef.getData()
            const queryObj = {
              ...this.resourceAdd, // 当前表单
              ...correlationformData // 关联表单
            }
            if (this.intId) {
              // 修改

              queryObj.intId = this.intId
              queryObj.ruleCode = this.ruleCode

              this.updateRules(queryObj)
              this.back()
            } else {
              // 新增
              this.PredictionRules(queryObj)
              this.back()
            }
            //
            /*             const addFormData = this.$refs.addFrom.getData()
            const correlationformData = this.$refs.correlationform.getData()
            this.Tip({ ...addFormData, ...correlationformData }, 'success') */

            // const reqData = Object.assign(publicData, userData)
            // console.log(reqData)
          }).catch((message) => {
            this.Tip(message, 'error')
          })
          break
      }

    /*   this.$refs.addFrom.validate((valid) => {
        if (valid) {
          alert('submit!')
        } else {
          this.Tip('失败提交', 'error')

          return false
        }
      }) */
    }
  },
  watch: {
    // 监听缺失数据补齐开关
    'resourceAdd.isUse': {
      deep: true,
      immediate: true,
      handler (val, oldVal) {
        if (val === '0') {
          this.$nextTick(() => {
            // this.$refs.addFormRef.resetFields()
          })
        }
      }
    }
  }
}
</script>
<style lang="scss" scoped>
.card-header {
  &::before{
  background:#009FFF
  }
}
.mr40{
  margin-right:40px
}
.box-single{
background-color: #fff;
margin:0px 12px;
}
.box-space{
  background-color: #f2f2f2;
  box-sizing: border-box;
  margin:0px 12px;
  width:100%;
  height:20px;
}
</style>
子组件示例
<template>
  <el-form
    ref="completionRuleFormRef"
    :inline="true"
    :model="completionRules"

    class="demo-form-inline inms-web-form"
    size="small"
    label-width="100px"
  >
    <div class="box-space">
    </div>
    <div class="box-single">
      <div class="inms-card-bg">
        <div class="inms-innerHeader">
          去除数据
          <el-switch
            v-model="completionRules.isUse"
            active-value="1"
            inactive-value="0"
          ></el-switch>
        </div>
      </div>

      <div
        class="ml30"
        ref="removeDataRef"
      >
        <div
          class="box-mask"
          :style="{height:removeDataHeight+'px'}"
        ></div>

        <p class="ml10">
          <el-button
            type="primary"
            @click="addRemoveDataRule"
          >
            添加规则
          </el-button>
        </p>

        <p
          style="position:relative"
          v-for="(o,index) in completionRules.ruleText"
          :key="index"
        >
          <el-form-item
            label="去除数据来源"
            :prop="'ruleText.'+ index +'.dataFrom'"
            :rules="{
              required: completionRules.isUse==='0'?false:true, message: '请选择去除数据来源', trigger:['change','blur']
            }"
          >
            <el-select
              v-model="o.dataFrom"
              filterable
              placeholder="请选择"
            >
              <el-option
                v-for="item in removeDataList"
                :key="item.ID"
                :label="item.Name"
                :value="item.ID"
              >
              </el-option>
            </el-select>
          </el-form-item>

          <el-form-item
            label="扩容日期"
            :prop="'ruleText.'+ index +'.dateScope'"
            :rules="{
              required: completionRules.isUse==='0'?false:true, message: '请选择扩容日期', trigger: 'change'
            }"
            v-if="o.dataFrom==='扩容'"
          >
            <el-date-picker
              v-model="o.dateScope"
              type="daterange"
              style="width: 80%;"
              range-separator="至"
              start-placeholder="开始日期"
              end-placeholder="结束日期"
              format="yyyy-MM-dd"
              value-format="yyyy-MM-dd"
              size="mini"
            >
            </el-date-picker>
          </el-form-item>

          <el-form-item
            label="关联告警"
            :prop="'ruleText.'+ index +'.alarm'"
            :rules="{
              required: completionRules.isUse==='0'?false:true, message: '请选择关联告警', trigger: 'change'
            }"

            v-if="o.dataFrom==='告警'"
          >
            <el-select
              v-model="o.alarm"
              filterable
              placeholder="请选择"
            >
              <el-option
                v-for="item in relatedAlarmList"
                :key="item.ID"
                :label="item.Name"
                :value="item.ID"
              >
              </el-option>
            </el-select>
          </el-form-item>
          <el-form-item
            label="有效日期"
            :prop="'ruleText.'+ index +'.dateScope'"
            :rules="{
              required: completionRules.isUse==='0'?false:true, message: '请选择扩容日期', trigger: 'change'
            }"
            v-if="o.dataFrom==='告警'"
          >
            <el-date-picker
              v-model="o.dateScope"
              type="daterange"
              style="width: 80%;"
              range-separator="至"
              start-placeholder="开始日期"
              end-placeholder="结束日期"
              format="yyyy-MM-dd"
              value-format="yyyy-MM-dd"
              size="mini"
            >
            </el-date-picker>
          </el-form-item>
          <el-button
            type="primary"
            style="position:absolute;right:100px"
            @click="()=>delRemoveDataRule(index)"
          >
            删除
          </el-button>
        </p>
      </div>
    </div>
  </el-form>
</template>

<script>
export default {
  props: {

    completionRule: {
      type: Object,
      default: null
    }
  },

  computed: {

  },
  data () {
    return {
      removeDataHeight: 0, // 去除数据遮罩层高度

      completionRules:
      {
        isUse: '',
        ruleText: [
          {
            dataFrom: '',
            dateScope: '',
            alarm: ''
          }
        ]
      },
      // 去除数据来源
      removeDataList: [
        {
          ID: '扩容',
          Name: '扩容'
        },
        {
          ID: '告警',
          Name: '故障'
        }
      ],
      // 关联告警
      relatedAlarmList: [
        {
          ID: '一级告警',
          Name: '一级告警'
        },
        {
          ID: '二级告警',
          Name: '二级告警'
        },
        {
          ID: '三级告警',
          Name: '三级告警'
        },
        {
          ID: '四级告警',
          Name: '四级告警'
        }
      ],
      // 去除数据添加规则
      removeDataRuleList: [
        {
          removeData: '0',
          dateRange: ''
        },
        {
          removeData: '1',
          dateRange: ''
        }
      ]

    }
  },
  methods: {

    // 去除数据添加规则
    addRemoveDataRule () {
      this.$set(this.completionRules.ruleText, this.completionRules.ruleText.length, {
        dataFrom: '',
        dateScope: [],
        alarm: ''
      })
    },
    // 去除数据删除规则
    delRemoveDataRule (index) {
      this.$delete(this.completionRules.ruleText, index)
    },
    // 清除表单验证 当开关关闭时候
    clearFormItem (dom, form, ruleName) {
      const clearArr = []
      form.forEach((item, index) => {
        Object.keys(item).map((name, idx) => {
          this.$set(clearArr, clearArr.length, ruleName + '.' + index + '.' + name)
        })
      })
      // 获取要清除的数组
      dom.clearValidate(clearArr)
    },
    getData () {
      // 循环遍历completionRules.ruleText 处理dateScope
      const obj = JSON.parse(JSON.stringify(this.completionRules))
      obj.ruleText.map((item, index) => {
        if (item.dateScope) {
          item.dateScope = item.dateScope.join(',')
        }
      })
      return obj
    }

  },
  watch: {
    // 监听传进来的表单值 拿中间变量接收
    completionRule: {
      deep: true,
      immediate: true,
      handler (val, oldVal) {
        // 处理其中的dateScope 将其转化为数组
        const obj = JSON.parse(JSON.stringify(val))
        obj.ruleText.map((item, index) => {
          if (item.dateScope) {
            item.dateScope = item.dateScope.split(',')
          }
        })
        this.completionRules = obj || {
          isUse: '',
          ruleText: [
            {
              dataFrom: '',
              dateScope: [],
              alarm: ''
            }
          ]
        }
      }
    },
    // 监听去除数据的开关变化 用来获取此节点高度  赋给遮罩层高度 达到只读效果
    'completionRules.isUse': {
      deep: true,
      immediate: true,
      handler (val, oldVal) {
        if (val === '0') {
          this.$nextTick(() => {
            this.removeDataHeight = this.$refs.removeDataRef.offsetHeight
            /* const clearArr = []
            this.singleForms.completionRule.ruleText.forEach((item, index) => {
              Object.keys(item).map((name, idx) => {
                this.$set(clearArr, clearArr.length, 'completionRule.ruleText.' + index + '.' + name)
              })
            })
            // 获取要清除的数组
            this.$refs.singleFormRef.clearValidate(clearArr) */
            // this.clearFormItem(this.$refs.completionRuleFormRef, this.completionRules.ruleText, 'ruleText')
          })
        } else {
          this.removeDataHeight = 0
        }
      }
    }

  }
}
</script>
<style scoped lang="scss">
  .ml10{
    margin-left:10px
  }
  .ml30{
    margin-left:30px;
  }
.box-single{
  background-color: #fff;
  margin:0px 12px;
}
.box-space{
  background-color: #f2f2f2;
  box-sizing: border-box;
  margin:0px 12px;
  width:100%;
  height:20px;
}
.box-mask{
  width:100%;
  height:10px;
  position:absolute;
  z-index:1;
  background-color: rgba(255,255,255,0.3);
}
</style>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值