一、ant-design-vue中a-date-picker组件只选择年份

今天遇到了在日期选择器中只选择年份的日期选择器,但是是使用的ant-design-vue,目前还没有只选择年份的日期控件,但是需求还是要实现,上代码:
在template中

<a-form-model-item label="开始年限:" prop="all_plan_one" >
   <a-date-picker 
   mode="year" 
   placeholder="请选择年份" 
   format='YYYY' 
   v-model="addForm.all_plan_one"  
   style="width:100%"
   :open='yearShowOne'  
   @openChange="openChangeOne" 
   @panelChange="panelChangeOne" 
   :disabled="modalDisabled"/>
</a-form-model-item>

在模型数据data中

//年度计划的打开关闭状态,true为打开,false为关闭
yearShowOne:false,
//添加对话框的表单绑定
addForm:{
    all_plan_one:null,//开始年限
},

在methods方法中,handleOpenChange回掉函数的参数是boolean值,当打开控件时为true,关闭时为false,但是控制控件的显示和隐藏需要的是open属性,所以让open属性跟随者这个回掉参数改变即可控制面板的显示和隐藏。
handlePanelChange方法可以获取到选择之后的值,在赋值给模型属性就可以使用了。不然会在时期选择之后再页面中不显示获取到的年份。

// 弹出日历和关闭日历的回调
openChangeOne(status){
	//status是打开或关闭的状态
    if(status){
         this.yearShowOne =  true
     }
 },
// 得到年份选择器的值
panelChangeOne(value){
     this.addForm.all_plan_one = value
     this.yearShowOne = false
 },

ant-design-vue文档提供的文章
但是我不知道怎么在a-form-model中使用目前这个年选择控件,这两天还在研究当中,反正头有点大…有大佬知道在a-form-modal中如何做该年份选择器的非空校验或自定义校验吗?研究了好久,没有得到正解。经过研究,目前的情况是这样的,在ant中,触发检验规则只有在blur或者change时才可以触发,但是当前年份控件并不会触发这两个事件,当前的年份控件只有在点击allowClear图标时才会触发change事件,我的想法是在面板关闭时获取该图标,手动调用click事件,可是又出现了无法获取的情况。有大佬知道该解决方案的话,求指教。

二、在a-form-model中验证

如果已经使用过普通的表单验证的道友应该已经知道无法对该年份控件进行验证,例如说非空校验等,在此我就不进行普通的校验失败演示,直接说我的方法,已经困扰了我几天,我一直困在如何触发change事件中出不来,今天得一高人提点,整个过程中在可以触发什么回调就在那里验证!简直醍醐灌顶,遂问题得以解决。
话不多说,先看效果:
在这里插入图片描述

1、在校验规则中添加对该字段的校验规则

formRules是放在a-form-model组件上的rules属性的值:

formRules:{
	all_plan_one:[{required: true, message: '开始年限不能为空', trigger: 'change'},
     	 {validator:this.validatorPlanOne},
  	]    

除了非空校验之外,我在methods中还添加了自定义校验规则如下:
validator指向的是methods中的校验函数,rule, value, callback是校验函数的回调值,具体值可去参阅文档。

// 开始年限校验规则
validatorPlanOne(rule, value, callback){
    // 当且仅当结束年限有值,并且已经选了开始年限,才进行校验
    if(value && this.addForm.all_plan_two){
        // 使用momentjs对结束时间进行转换
        let planOne = this.$moment(value).format('YYYY-MM-DD');
        // 开始时间
        let planTwo = this.$moment(this.addForm.all_plan_two).format('YYYY-MM-DD');
        // 当开始时间大于结束时间时,不通过校验
        if(planOne > planTwo){
            callback(new Error('开始年限不能大于结束年限'));//校验不通过结束当前校验
            return false;
        }else{
            callback();
        }
    }else{
        callback();//校验通过,cb必须被调用
    }
},

2、在得到值的时候调用该字段的校验方法

// 得到年份选择器的值
panelChangeOne(value){
       this.addForm.all_plan_one = value
       this.yearShowOne = false
       this.$refs.addFormRef.validateField('all_plan_one',(error)=>{
           console.log(error)
       })
   },

只要是值改变都会调用该方法,所以在这里对该字段进行校验,validateField是ant官方提供的对单给字段进行校验的方法,如果没有了解过的建议翻翻官方提供的文档:ant-a-form-modal-api
问题得以解决。

3、对年限的自定义校验规则

对年限的非空校验已经解决,但是又遇到了稍微复杂的业务需求,如果有两个年限,选择第一个年限之后,第二个年限不能小于第一个年限那又该怎么做呢?还是一样,先上效果图:
在这里插入图片描述
其实思想还是一样 的,先添加该校验规则,在值改变的回调中去触发该字段的校验,也是单个字段校验。
1、在rules中添加结束年限的规则

all_plan_two:[{required: true, message: '结束年限不能为空', trigger: 'change'},
 	{validator:this.validatorPlanTwo},
],

2、自定义校验规则

// 结束年限校验规则
validatorPlanTwo(rule, value, callback){
   // 当且仅当结束年限有值,并且已经选了开始年限,才进行校验
   if(value && this.addForm.all_plan_one){
       // 使用momentjs对结束时间进行转换
       let planTwo = this.$moment(value).format('YYYY-MM-DD');
       // 开始时间
       let planOne = this.$moment(this.addForm.all_plan_one).format('YYYY-MM-DD');
       // 当开始时间大于结束时间时,不通过校验
       if(planOne > planTwo){
           callback(new Error('开始年限不能大于结束年限'));//校验不通过结束当前校验
           return false;
       }else{
           callback();//cb必须被调用
       }
   }else{
       callback();//校验通过,cb必须被调用
   }
},

这里的函数名需要和校验规则制定函数名对应,如果不明白自定义校验规则的可以看我的另外一篇针对ant-vue的自定义规则文章:ant-design-vue表单自定义校验规则
那在这里为何又使用到了momentjs呢?大家还可以看我另外一篇文章,链接附上:ant-design-vue中a-date-piker日期选择器的使用/全局汉化(详细)
3、在获取值时调用单字段校验

panelChangeTwo(value){
  this.addForm.all_plan_two = value
       this.yearShowTwo = false
       this.$refs.addFormRef.validateField('all_plan_two',(error)=>{
           console.log(error)
       })
   },
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐