解决日期组件周模式无法设置valueFormat的问题
Demo预览:
https://sunzsh.github.io/vue-demos/#/eldatepicker-ww
代码 / 文件:
https://github.com/sunzsh/vue-el-demo/blob/master/src/components/el-date-picker-ww.js
https://github.com/sunzsh/vue-el-demo/blob/master/src/views/eldatepicker-ww.vue
大家看这个date picker有这么多模式
比如说选择周啊
选择多个日期多个年都可以
然后呢
前两天有小伙伴发现他这个选择
周的模式有点bug
没法设置value-format
什么意思呢
我们来看这个demo
我这个现在没有设置value-format
我选择一个周
(我只设置了一个format)
(就是设置里边展示的这个格式)
所以它绑定的这个值啊
是一个date(日期)类型
然后呢我现在给它加上value-format
刷新一下
然后 选择一个
大家看 现在的下边的value是对了
我再切换一下都没问题
但是呢控制台报错
然后组件没有回显
那其实啊
官方的文档里也说(简单提到)了这个问题了
大家看我用的是"WW"这个值
他说这个仅适用于周选择器 (口误,少说了:的format)
言外之意就是value-format不能用
包括这一个w的都不能用
那我们就来尝试看看能不能写个补丁
把它补上
我们先来看看报错这样代码哈
我们在这打个断点刷新
然后呢我们选一个
大家看它这个data现在是一个字符串
字符串当然就没有这个getFullYear()这个方法
所以啊也就印证了饿了么u i
没有对周模式进行兼容
他始终认为这是一个date类型
然后啊就在原码里翻到了对应的
这样代码就在这里
因为他经过编译所以长得不太一样
这次翻原码的过程特别长
因为篇幅原因我就不展示了啊
之前也分享过类似的
那主要的代码就是这一行
就是this.value这个变量
他现在就是字符串类型的了
那我们再往上翻
就会翻到这个方法parsedValue
这是一个计算属性
它的返回值最终会传递给这个value
所以呢我们要想办法解决
这个方法现在不支持week模式
然后啊我就自己写了一个组件
先去继承datepicker
然后重写里边的parsedValue这个方法
那
到这呢还有小插曲
我也是新学到的啊
现学现卖给大家我先把这个代码放行
什么意思呢
就是我们已经通过value-format
把它格式成一个字符串了
那我们如果想把它回退成date类型
我们需要确切的知道
它是第50周的周几
这样才能有一个确切的日期
但是呢现在没有怎么办呢
那我就需要随便定一个规则
每次选择第多少周的周几
然后再写后边代码的时候我就发现
其实这每年的第一周是有学问的
不是1月1号所在的就是第一周哈
我们比如说我举个例子
比如说这2021年1月1号他就不是
21年的第一周
他是20年的最后一周
那怎么来界定呢
我们来看这个8601的国标啊
在这里他是说啊
本年度的第一个星期四所在的
这个星期
是第一个日历星期
所以我们来看21年的这个
他并不是第一个星期四所在的日期
所以呢第一周应该是从3号开始
(他从周日开始算啊)
从3号开始这个算第一周
我们来验证一下啊
我们在这用官方的这个demo
我们选21年的1月1号
大家看 你一选
他就跑到了2020年的第53周了
回到代码里
如果大家读代码会发现我选择了
第1个星期四 (详细的逻辑感兴趣的小伙伴自行看代码吧,很简单)
然后去往后推
然后呢写好这个组件之后
我们在main里边把我们写的导进来
然后呢
还用他这个名字去覆盖一下他
原来这个组件
我们保存一下
好我们再试一下
打开
这样就没问题了
控制台也没有报错了
然后这个代码呢还是在这个demo里
demo在这个Github上
最后更新于
这有帮助吗?