element使用两个日期选择器做联动效果

原因:

element-ui官网上的两个日期选择器并不好用,两个连到一起用户体验不理想

在这里插入图片描述

实现效果

在这里插入图片描述

/** html代码 **/
<div class="choiceTime">
	<el-date-picker
		v-model="startTime"
        type="date"
        value-format="yyyy-MM-dd"
        :picker-options="startNoTime"
         placeholder="选择日期">
	</el-date-picker>
    <div class="timeTo"></div>
    <el-date-picker
    	v-model="endTime"
        type="date"
        value-format="yyyy-MM-dd"
        :picker-options="endNoTime"
         placeholder="选择日期">
	</el-date-picker>
</div>
/** css代码 **/
.choiceTime{
  border: 1px solid #E6E6E6;
  width: 270px;
  height: 32px;
  border-radius: 5px;
  display: flex;
  overflow: hidden;
  .el-date-editor{
    flex: 8;
    .el-input__inner{
      width: 100%;
      border: none;
      height: 100%;
    }
  }
  .timeTo{
    flex: 1;
    color: black;
    text-align: center
  }
}
/** js **/
data() {
	return {
		startTime: '',
	    endTime: '',
	   	// 禁选当天以后的时间
      	startNoTime: {
        	disabledDate(time) {
          		return time.getTime() >= (Date.now() - 8.64e7)
        	}
      	},
      	endNoTime: {
        	disabledDate(time) {
          		return time.getTime() >= (Date.now() - 8.64e7)
        	}
      	},
	}
},
watch: {
	startTime: {
		handler(val) {
        	this.endNoTime = {
          		disabledDate(time) {
            		const time1 = new Date(val).getTime()
            		// 结束时间禁止选择当天及以后并且不能选择开始时间之前的
            		return time.getTime() < time1 || time.getTime() >= (Date.now() - 8.64e7)
            		// 限制结束时间在开始时间的30天以外并在一年以内,限制禁选当天以后时间。
            		// const time1 = new Date(val).getTime() + 3600 * 1000 * 24 * 30
           			// const time2 = new Date(val).getTime() + 3600 * 1000 * 24 * 30 * 12
            		// return (time.getTime() < time1 || time.getTime() > time2 || time.getTime() >= (Date.now() - 8.64e7))
          		}
        	}
      	}
    }
},
mounted() {
	// 默认显示当前时间及前一个月的时间
    const time1 = new Date(new Date().getTime() - 1000 * 3600 * 24 * 31)
    const time2 = new Date(new Date().getTime() - 60 * 60 * 24 * 1000)
    this.startTime = this.procesTime(time1)
    this.endTime = this.procesTime(time2)
},
methods: {
    // 处理日期
    procesTime(time) {
      const year = time.getFullYear()
      const month = time.getMonth() + 1 > 10 ? time.getMonth() + 1 : '0' + (time.getMonth() + 1)
      const day = time.getDate() > 10 ? time.getDate() : '0' + time.getDate()
      return year + '-' + month + '-' + day
    },
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Vue3中的Composition API来实现一个有日期选择组。 首先,需要引入日期选择组件: ```html <template> <div> <label>开始日期:</label> <DatePicker v-model="startDate" :disabled-date="disabledStartDate" @change="handleStartDateChange" /> <label>结束日期:</label> <DatePicker v-model="endDate" :disabled-date="disabledEndDate" @change="handleEndDateChange" /> </div> </template> <script> import { ref, watch } from 'vue'; import { DatePicker } from 'element-plus'; export default { components: { DatePicker, }, setup() { const startDate = ref(null); const endDate = ref(null); // 禁止选择开始日期之前的日期 const disabledStartDate = time => { if (endDate.value) { return time.getTime() > endDate.value.getTime(); } }; // 禁止选择结束日期之后的日期 const disabledEndDate = time => { if (startDate.value) { return time.getTime() < startDate.value.getTime(); } }; // 监听开始日期的变化 const handleStartDateChange = val => { endDate.value = null; }; // 监听结束日期的变化 const handleEndDateChange = val => { startDate.value = null; }; // 监听开始日期和结束日期的变化 watch([startDate, endDate], ([newStartDate, newEndDate]) => { if (newStartDate && newEndDate && newStartDate.getTime() > newEndDate.getTime()) { [startDate.value, endDate.value] = [endDate.value, startDate.value]; } }); return { startDate, endDate, disabledStartDate, disabledEndDate, handleStartDateChange, handleEndDateChange, }; }, }; </script> ``` 在这个组件中,我们引入了Element Plus中的DatePicker组件,并使用了Vue3中的Composition API来实现效果。 具体来说,我们通过ref函数创建了startDate和endDate两个响应式变量,并在模板中使用v-model指令来绑定它们。 我们还分别实现了disabledStartDate和disabledEndDate两个方法来禁止选择不合法的日期。这里需要注意的是,当选择完开始日期之后,要将结束日期重置为null,以避免选择一个无效的结束日期。 最后,我们使用watch函数来监听startDate和endDate的变化,并在它们发生变化时,交换它们的值,以确保开始日期早于结束日期

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值