已解决:iview & elementui 关于datepicker日期选择器的一些注意事项,比如v-model绑定值会比选定日期少一天(实际是8小时),日期默认值表单校验无法通过等

就以iview为例,iview的日期选择器是挺好用的,但是他的问题也确实明显也很致命,大致是以下几种:

直接用v-model可以绑定值,渲染页面结果日期是正确的,但是绑定的值的日期会少8小时,这个主要是他的时区处理的遗留问题,其实我认为这个问题他们很好解决,但是这么多年了,他们好像也没有想要解决的意思,iview给的建议是使用@on-change方法配合v-model使用,这样可以处理编辑时的默认值回显也可以处理新值的正确显示(不少8小时),如图iview官方文档,

 因为v-model绑定值是Date对象,而@on-change参数是字符串,所以这里很可能会导致一个更严重的问题,那就是同一个数据,会出现不同的类型,如果开发中对类型有明确要求比如表单校验规则时,这个问题就很明显了,比如编辑一组数据时,包含日期,但是日期不需要修改,直接点保存就会触发日期校验,校验发现不是字符串,自然就会报错,因为datepicker读取默认的字符串时会将字符串转换成标准Date对象,如果你的Form校验设定的数据类型是string的话,那么校验自然通不过,当然如果你把校验规则改成date,那编辑的时候不修改是能通过,但是选择了日期以后走了on-change方法,那么又变成字符串了,还是有问题。可见官方对于这个也没有提供太好的方案。

其实如果使用表单校验的话想要校验时间,还是要用date类型来校验是比较好的,这样也不用走on-change方法,还能少写一个method,但是标准的date会少一天怎么办呢?其实只需要处理这个少一天的问题就好了,我们最好是走一个三方库moment,用他来处理最好不过了,就在提交表单的时候处理就可以。

首先安装moment(如果你不用cnpm那就改成npm):

cnpm install moment --save

然后将用到的方法捆绑到vue示例中:

import moment from 'moment'

//moment.locale('zh-cn')
Vue.prototype.$moment = moment

然后再组件中调用:

obj.model.startTime = this.$moment(obj.model.startTime).format('YYYY-MM-DD')

注意调用的这行代码,moment传入的参数是一个Date对象,经过format之后返回一个字符串

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值