vue+element日期选择,范围需要互斥

有这样一个需求,多条记录,每条日期的范围互斥,不能有重合

  

 <div style="max-height: 50vh;overflow: auto">
        <div style="text-align: right;margin-bottom: 1vh">
          <el-button type="primary"
                     @click="dutsformData.form.unshift({
              timeList:[],
              amount:''
            })">新增</el-button>
        </div>
        <el-form :model="dutsformData" label-width="100px" ref="dutsyForm"
                 :rules="rulesForm">
          <el-row style="background: #f5f5f6;padding-top: 2vh;border-radius: 0.5vh;margin-bottom: 2vh"
                  v-for="(item,index) in dutsformData.form" :key="index">
            <el-col :span="13">
              <el-form-item label="时间段" :prop="'form.'+index+'.timeList'" :rules="rulesForm.timeList">
                <el-date-picker
                    style="width: 100%"
                    v-model="item.timeList"
                    value-format="yyyy-MM"
                    format="yyyy-MM"
                    type="monthrange"
                    range-separator="至"
                    start-placeholder="开始月份"
                    end-placeholder="结束月份"
                    :picker-options="pickerdustOptions"
                    @focus="changetime(index)"
                >
                </el-date-picker>
              </el-form-item>
            </el-col>
            <el-col :span="9">
              <el-form-item label="缴费金额" :prop="'form.'+index+'.amount'" :rules="rulesForm.amount">
                <el-input style="width: 100%;" v-model="item.amount"></el-input>
              </el-form-item>
            </el-col>
            <el-col :span="2" style="padding-top: 0.8vh">
              <el-button type="primary" icon="el-icon-minus" circle size="mini"
              @click="dutsformData.form.splice(index,1)" :disabled="dutsformData.form.length===1"></el-button>
            </el-col>
          </el-row>
        </el-form>
      </div>
      <div style="padding-top: 2vh">
        <el-button type="primary" @click="dutsConfirm()" :loading="dustLoading">确定</el-button>
      </div>
 dutsformData: {
        form:[{
          timeList: '',
          amount: ''
        }]
      },
      rulesForm:{
        timeList:[{
          required: true,
          message: '请选择时间段',
          trigger: 'change',
        }],
        amount:[{
          required: true,
          message: '请输入缴费金额',
          trigger: 'blur',
        },]
      },
      maxDate:'',
      minDate :'',
      rangeList:[],
      minormax:null,
      dustLoading:false,


computed:{
    pickerdustOptions(){
      let that = this;
      return {
        disabledDate(time) {
          let disable = false
          that.rangeList.forEach(item=>{
            disable=disable||(time.getTime() < item[1]+ 2592000000*1 && time.getTime() > item[0]-2592000000)
          })
          return disable
        },
        onPick(selectTime){
          that.rangeList.forEach(item=>{
            let minDate=null
            let maxDate=null
            if(selectTime.minDate){
              minDate=selectTime.minDate.getTime()
            }
            if(selectTime.maxDate){
              maxDate=selectTime.maxDate.getTime()
            }
            if(item[1]>minDate&&item[0]<maxDate){
              that.$nextTick(()=>{
                that.dutsformData.form[that.minormax].timeList=''
              })
              this.$message({
                message: '时间段选择不可以重合',
                type: 'warning',
              })
              return false
            }
          })
        }
      }
    }
  },
methods: {
    changetime(index){
      this.minormax=index
      this.rangeList=[]
      this.dutsformData.form.forEach(res=>{
        let min=new Date(res.timeList[0]).getTime()
        let max=new Date(res.timeList[1]).getTime()
        if(min&&max){
          this.rangeList.push([min,max])
        }
      })
    },
}

 代码如上

解决思路:用日期控件的disabledDate来进行设置

将选过的日期时间段存到一个数组中,在函数中循环遍历,分别设置disabledDate

中间遇到一个问题,可以选择包含已选过的时间段,这样跟需求不一样

解决思路:用日期控件的onPick,判断如果包含已选过的时间段,则将本次选择的数据清空即可

简单记录一下

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值