小伙伴投稿:ElementUI日期时间范围组件动态设置默认时间

这个小伙伴的投稿我觉得挺有用

我们大家很可能以后会用到

就是这个日期和时间范围的选择

我们比如我们选一个日期

然后再指定两个时间

然后现在什么问题呢

就是他这个组件

默认支持设置一个默认时间

就是默认开始时间和默认结束时间

但是我们现在有个需求

就是说这个结束时间哈

他希望根据当前选择的日期

来动态指定

什么意思

就是比如今天是26号哈

比如结束日期是(选)25号

(不是今天)

那么我希望

这个结束时间就是默认的

23:59:59这样

但是呢如果我选择的是今天

那么我希望(比如说2号到26号)

我希望他的结束时间就是当前时间

比如当前是晚上8点

哎那就是这样

所以呢

他现在这个属性不支持动态的

所以呢这位小伙伴就没办法嘛

他就翻了源码

找了一个变通的实现方法

怎么实现的呢

就是给这个组件通过这个pickerOptions

注入了一个onPick

这个类似于事件吧

就是只要用户选择了这个时间(口误:日期)

就会走这里边

然后呢他在这里判断是不是今天啊

这些都不重要

主要是在这里

如果是今天

他就放一个他制定好的一个endTime(当前时间)

如果不是今天呢

那还是用这个23点

算出一个这个时间

调这个方法

我们来看什么什么效果哈

大家看啊

2号 比如到今天26号大家看

那他现在就是把当前时间放上来了

但是呢这个框就自动关闭了

我们再点一下

不是今天的

比如 25号

大家看:23:59:

这个没有问题

现在这个效果是对的

只是呢他希望这个弹窗先不要关闭

允许用户再去调整它

那怎么解决呢

我们先看一下啊

他现在用的是这个方法

这个最后一个参数

看起来

就像是来控制这个弹窗是否关闭的

但是呢我们看一下

它有点小问题

比如说我们现在还选25号结束

这个没有问题

但如果我们选到今天26号结束

大家看上面是对了

但是这个弹窗里的时间是不对的

所以导致什么问题呢

大家看我们一点确定

弹窗里时间就上去了

导致这个效果就不对了(应该是当前时间)

所以呢我们这个参数

还不能用这个参数来实现

怎么办呢

我们先去找到源码读一读

那怎么找源码呢

教大家怎么找哈

其实就在这个node_moduls里面找到它

这个element的UI的目录在这里

然后呢注意它打开之后

它有lib、package

src types

其实一般的组件都在这个package里边

大家看什么alert、aside什么的啊

我们找到datepicker

然后通常每一个目录里边哈

它都有一个最

就这个组件来说

它最外层的组件

它里边可能还嵌套一些其他组件

像这个就是哈

然后呢

刚才这个小伙伴调用了picker

这picker

就这个datePicker

这个组件里边还有个pick组件

所以我们搜一下

大家看在这里它有这个组件

咱先不管它

那因为我们今天用的是范围的

日期范围的

所以呢它用的是panel

里的这个panel date range

找到这个组件呢

我们往下看啊

这里边有一个input

它这个国际化的名叫start date

再往下还有一个start time

大家看

然后再往下

它还有end date和end time

所以

就相当于我们刚才看到的这个组件

里的上面这四个框

具体读代码的过程我就略过了哈

我直接说结论

我们就模拟它这个框的change事件

大家看啊

我们先找到就用结束时间吧

endTime吧

它是在调这个handle time input

和handle time change

其实我们就用这个handle time input

就可以了

我们找到它

这个方法

大家看它传了一个value

一个type

type一个是min

一个是Max

就是一个最小一个最大

那是不是我们可以调这个方法

我们在自己这个页面上先输出一下

看能不能找到它这个

handleTimeIput方法

pick点我们加一个输出

刷新一下,控制台打开

然后我们刚才加的是在今天

这种情况下

所以我们要结束时间选今天

注意大家看,有这个方法

相当于我们在这是可以调的

那就简单了

我们先随便传一个时间哈

我们传

三点吧

然后呢type等于Max

把这个注意掉

我们再看

效果

大家看啊

从2号到26号这块

虽然是三点

但是大家注意

大家看控制台报错了

我们看一下

就是它这个地方date是空了

我们看一下

报错哈:找不到空的getFullYear

就是这一行

这个date是空传

进来的我们再往上找看

这其实就是这个maxDate是空的

这个就有意思了

为什么它是空的呢

结果找了半天哈

其实原因就是

我们在调这个方法的时候

它这个maxDate还没赋值呢

我们看maxDate在哪赋的值

大家看他在这里取到max

然后复到这个this.maxDate

比如说当用户在选择这个范围的时候

他先调onPick方法

然后再去给maxDate复值

包括它下边还有个setTimeout

就10毫秒又复了一次

它可能是为了解决某一个bug哈

主要的问题是它先走了我们的onPick

就是我们这个方法是在onPick里

他先走了我们的onpick后

去给maxDate复制

所以我们在这执行这个方法

它容易报错

那为了保险起见

我们要在这个10毫秒以后

去执行我们这个代码

所以我们要在这 setTimeout 11毫秒

我们再来试一下哈

我把这个控台关掉

2号 比如到26号

大家看!现在是3点

这就没有问题了

我们在控制台

控台也没有什么报错

我们再选一下

大家看这是可以的了

所以呢如果不是今天

那就简单了

我们把这个再复制一下

不用他这个了

我们直接在下边这个就不用了

如果不是今天

那就永远都是23:59:

我们再来看一下

3号 ~ 25号

26号

大家看就是3点了

只不过呢

这个时间我们在这不写死

动态计算一个就可以了

这个我就不在视频里演示了啊

总结一下

其实就是如果想实现这个

时间的动态化

那我们就通过pickoption的onpick方法里

在这里边通过setTimeout

里面调picker的这个handleTimeInput

方法来实现

保险起见呢

我们可以把它调大一点

比如20毫秒

这个20毫

这样画就OK了

最后更新于

这有帮助吗?