有两个需求,一个是录入页面,开始时间和结束时间是两个表单元素,分开着的,要做限制;另一个是时间搜索选项,要选择时间范围,这个是要用同一个日期选择框,要做限制;

两个日期选框需求:

  1. 结束日期不能大于开始日期,
  2. 选择时间在当日(包含当日)后的14天内;

一个日期选框需求:

  1. 选择时间当日前,整体范围在三年内,
  2. 选择时间范围不能超过一个月;

日期限制思路

一个选框,结束日期不能大于日期,可以在选择@change后判断两个日期大小,如果不符合条件,触发表单验证提示。或者在一个选择后,另一个设置disabledDate。选择时间在当日(包含当日)后的14天内也在disabledDate中设置;
两个选框,主要计算一个月范围,不是30天,而且要判断选择的第一个日期的前一个月和后一个月范围去做disabledDate;三年主要是计算三年的时间。


下面直接来案例

1.两个日期选框

<el-form :rules="dataRule" v-bind:model="dataForm" ref="dataForm">
 <el-form-item prop="disStartDate">
  <el-date-picker
    v-model="dataForm.disStartDate"
    type="date"
    value-format="yyyy-MM-dd"
    placeholder="请输入优惠开始日期"
    :picker-options="pickerOptionsS"
    @blur="startDateBlur"
  ></el-date-picker>
</el-form-item>
<el-form-item prop="disEndDate">
  <el-date-picker
    v-model="dataForm.disEndDate"
    type="date"
    value-format="yyyy-MM-dd"
    placeholder="请输入优惠结束日期"
    :picker-options="pickerOptionsE"
    @blur="endDateBlur"
  ></el-date-picker>
 </el-form-item>
</el-form>
<script>
export default {
  name: "addEdit",
  data() {
    return {
     dataForm: {
     	disStartDate: '',
     	disEndDate: ''
     pickerOptionsS: {
	  disabledDate:(time)=> {
	    // 设置可选择的日期为今天之后的一个月内
	    let curDate = (new Date()).getTime();
	    // 这里算出一个月的毫秒数,这里使用30的平均值,实际中应根据具体的每个月有多少天计算
	    let day = 14 * 24 * 3600 * 1000;
	    let dateRegion = curDate + day;
	    let end = "";
	    if(!this.disStartDate && this.disEndDate){
	    	end = new Date(this.disEndDate).getTime();
	    	return time.getTime() < curDate || time.getTime() >= dateRegion || time.getTime() > end;
	    }else{
	    	return time.getTime() < curDate  //限制小于当天的日期
	    	|| time.getTime() >= dateRegion ; //限制大于14天后的日期
	pickerOptionsE: {
	  disabledDate:(time)=> {
	    let curDate = (new Date()).getTime();
	    let day = 14 * 24 * 3600 * 1000;
	    let dateRegion = curDate + day;
	    let start = "";
	    if(this.disStartDate && !this.disEndDate){
	    	start = new Date(this.disStartDate).getTime();
	    	return time.getTime() < curDate || time.getTime() >= dateRegion || time.getTime() < start;
	    }else{
	    	return time.getTime() < curDate  //限制小于当天的日期
	    	|| time.getTime() >= dateRegion ; //限制大于14天后的日期
     dataRule: {
      disStartDate: [
            required: true,
            validator: (rule, value, callback) => {
              let start = value ? new Date(value).getTime() : 0;
              let end = this.dataForm.disEndDate ? new Date(this.dataForm.disEndDate).getTime() : 0;
              if(!start){
                return callback(new Error('优惠开始日期不能为空'))
              }if(start && end && start > end){
                this.dataForm.disStartDate = "";
                return callback(new Error('优惠结束日期需大于开始日期'))
              }else{
                callback();
            trigger: "blur"
        disEndDate: [
            required: true, 
            validator: (rule, value, callback) => {
              let start = this.dataForm.disStartDate ? new Date(this.dataForm.disStartDate).getTime() : 0;
              let end = value ? new Date(value).getTime() : 0;
              if(!start){
                return callback(new Error('优惠结束日期不能为空'))
              }else if(start && end && start > end){
                this.dataForm.disEndDate = "";
                return callback(new Error('优惠结束日期需大于开始日期'))
              }else{
                callback();
            },trigger: "blur"
  methods: {
   startDateBlur(){
  	this.$refs.dataForm.validateField('disEndDate');
   endDateBlur(){
  	this.$refs.dataForm.validateField('disStartDate');
</script>

2.一个日期选框

<el-form-item class="date-range" label="制单日期范围">
    <el-date-picker
      v-model="timeRange"
      :clearable="false"
      type="daterange"
      format="yyyy-MM-dd"
      value-format="yyyy-MM-dd"
      range-separator="至"
      start-placeholder="开始日期"
      end-placeholder="结束日期"
      @change="transferDateChange"
      :picker-options="pickerOptions"
    ></el-date-picker>
 </el-form-item>
export default {
  name: "addEdit",
  data() {
    let _minDate = "";
    let _maxDate = "";
    return {
     dataForm: {
     	timeRange: [],
     	queryData: {},
     	pickerOptions: {
     	 onPick(time){
        _minDate = time.minDate ? time.minDate : '';
        _maxDate = time.maxDate ? time.maxDate : '';
      disabledDate(time) {
        let today = that.$util.formatDate(new Date());
        let threeYearAgo = new Date().getFullYear() - 3 + today.slice(4);//近3年
        if (_minDate && !_maxDate) {
          let threeMonthAgo = "";
          let threeMonthLater = "";
          let selectMinDate = that.$util.formatDate(new Date(_minDate));
          let selectMinDateMon = Number(new Date(_minDate).getMonth());
          //获取三个月前的日期
          if(new Date(_minDate).getMonth()>2){
            threeMonthAgo = selectMinDate.slice(0,5) +  that.$validate.formatMonDay(selectMinDateMon - 2) + selectMinDate.slice(7);
          }else{
            threeMonthAgo = (selectMinDate.slice(0,4) -1) + "-" + that.$validate.formatMonDay(selectMinDateMon - 2 + 12) + selectMinDate.slice(7);
          //获取三个月后的日期
          if(new Date(_minDate).getMonth()>8){
            threeMonthLater = (Number(selectMinDate.slice(0,5))+1) +  that.$validate.formatMonDay(selectMinDateMon -12 + 4) + selectMinDate.slice(7);
          }else{
            threeMonthLater = selectMinDate.slice(0,5) +  that.$validate.formatMonDay(selectMinDateMon + 4) + selectMinDate.slice(7);
          return time.getTime() > new Date(threeMonthLater).getTime() || time.getTime() < new Date(threeMonthAgo).getTime() 
          || time.getTime() > new Date().getTime() || time.getTime() < new Date(threeYearAgo).getTime();
        }else{
          return time.getTime() > new Date().getTime() || time.getTime() < new Date(threeYearAgo).getTime();
  methods:{
   transferDateChange(){
	this.queryData.startDate = this.timeRange ? this.timeRange[0] : '';
	this.queryData.endDate = this.timeRange ? this.timeRange[1] : '';
                    有两个需求,一个是录入页面,开始时间和结束时间是两个表单元素,分开着的,要做限制;另一个是时间搜索选项,要选择时间范围,这个是要用同一个日期选择框,要做限制;两个日期选框需求:结束日期不能大于开始日期,选择时间在当日(包含当日)后的14天内;一个日期选框需求:选择时间当日前,整体范围在三年内,选择时间范围不能超过一个月;日期限制思路一个选框,结束日期不能大于日期,可以在选择@change后判断两个日期大小,如果不符合条件,触发表单验证提示。或者在一个选择后,另一个设置disabled
 // main.js file
import VueDatepickerUi from 'vue-datepicker-ui'
import 'vue-datepicker-ui/lib/vuedatepickerui.css' ;
Vue . component ( 'Datepicker' , VueDatepickerUi )
 < script >
  import ' vue-datepicker-ui/lib/vuedatepickerui.css ' ;
  import VueDatepickerUi from ' vue-datepicker-ui ' ;
  export default {
    components : {
      Datepicker : VueD
<FormItem label="起止时间">
  <DatePicker type="date" v-model="searchForm.startTime" :options="startOptions" placeholder="请选择开始时间" style="width: 200px"></DatePicker>
  <DatePicker type="dat
				
此处做一个解释: :picker-options=“updateTime” 为当前时间日期选择器特有的选项参考下表,而且可以用vue中的函数来做筛选,将data数据源中的updateTime给:picker-options使用 <el-form-item style='width: 100%;' label="开始日期:"> <el-date-picker style='width: 100%;' value-format="yyyy-MM-dd" form
问题描述: 原型中是两个分开的日期选择器,而不是element ui中给出的一个控件里同时选择开始日期结束日期。所以需要自己获取两个框中的选定值然后进行范围限制 1. 原型图效果: 要求开始日期默认当天,且限制例如结束日期选择后,开始日期中的日期在此之后的都不能选,反之亦然。
Element-UI日期选择器是一个常用的组件,可以方便地实现日期选择功能。根据引用\[1\]中的代码,可以看出该日期选择器是一个周选择器,只能选择本周以及本周之前的日期。通过设置picker-options的disabledDate属性,可以限制选择日期范围。在这个例子中,disabledDate函数中的逻辑是禁止选择本周日以后的日期。具体实现是通过获取今天的日期和计算今天是周几来确定禁止选择日期范围。如果今天是周日,则禁止选择今天以后的日期;否则,禁止选择本周日以后的日期。 另外,引用\[2\]中的代码展示了如何在Vue中使用Element-UI日期选择器。通过在Vue实例中定义value1和value2这两个变量,可以实现日期的双向绑定。在HTML中,可以使用el-date-picker标签来创建日期选择器,并通过v-model绑定value1和value2变量。通过设置不同的属性,如type、format、placeholder等,可以自定义日期选择器的样式和功能。 最后,引用\[3\]中的代码展示了在Vue项目中安装和使用dayjs库。dayjs是一个轻量级的日期处理库,可以方便地进行日期的格式化、计算和比较等操作。在Vue项目中,可以通过在main.js中引入dayjs,并将其挂载到Vue的原型上,以便在组件中直接使用dayjs函数来处理日期。 综上所述,Element-UI日期选择器是一个功能强大且易于使用的组件,可以满足各种日期选择的需求。通过合理设置属性和使用相关库,可以实现更加灵活和定制化的日期选择功能。 #### 引用[.reference_title] - *1* *3* [Element UI DatePicker 日期选择器](https://blog.csdn.net/Igiveufireworks/article/details/129047276)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【elementUI-日期选择器(两个框 限制选择范围、快捷键选择】](https://blog.csdn.net/JUN416326495/article/details/126723033)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
一定要坚持创作更多高质量博客哦, 小小红包, 以资鼓励, 更多创作活动请看: 新星计划2023: https://marketing.csdn.net/p/1738cda78d47b2ebb920916aab7c3584?utm_source=csdn_ai_ada_redpacket “2023我在开源峰会”特别征文: https://activity.csdn.net/creatActivity?id=10461?utm_source=csdn_ai_ada_redpacket 程序员的你,有哪些炫技的代码写法?: https://activity.csdn.net/creatActivity?id=10438?utm_source=csdn_ai_ada_redpacket 全部创作活动: https://mp.csdn.net/mp_blog/manage/creative?utm_source=csdn_ai_ada_redpacket