经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
element-ui使用el-date-picker日期组件常见场景
来源:cnblogs  作者:南风晚来晚相识  时间:2024/5/11 8:56:21  对本文有异议

开始

  1. 最近一直在使用 element-ui中的日期组件。
  2. 所以想对日期组件常用的做一个简单的总结;
  3. 1.处理日期组件选择的时候面板联动问题
  4. 2.限制时间范围

解除两个日期面板之间的联动

  1. 我们发现2个日期面板之间其实是有联动关系的;
  2. 开始时间面板和结束时间面板始终只能相邻;
  3. 不能出现开始时间选择3月,结束时间是5月这样的情况;
  4. 但是我们有些时候要让他们之间解除联动关系;
  5. 我们需要将 unlink-panels 设置为true

  1. unlink-panels:在范围选择器里取消两个日期面板之间的联动;
  2. 它默认是false;我们设置为true就行

限制-选择今天以及今天之后的时间

  1. <template>
  2. <div>
  3. <el-date-picker
  4. v-model="value2"
  5. type="datetimerange"
  6. range-separator="至"
  7. :picker-options="pickerOptions"
  8. start-placeholder="开始日期"
  9. end-placeholder="结束日期"
  10. align="right">
  11. </el-date-picker>
  12. </div>
  13. </template>
  14. <script>
  15. export default {
  16. data() {
  17. return {
  18. pickerOptions: {
  19. disabledDate(time) {
  20. // time 表示的是面板中每一个日期值
  21. // 只能选择今天以及今天之后的时间
  22. return time.getTime() < Date.now() - 24*60*60*1000;
  23. }
  24. },
  25. value2: ''
  26. }
  27. }
  28. }
  29. </script>

8.64e7 约等于24小时

  1. 有的小伙伴说:我看见有些限制时间是这样写的
  2. return time.getTime() < Date.now() - 8.64e7
  3. 其实8.64e7 约等于24小时;所以并不会影响

限制-只能选择今天之后的时间

  1. pickerOptions: {
  2. disabledDate(time) {
  3. // 只能选择今天之后的时间
  4. // time 表示的是面板中每一个日期值
  5. return time.getTime() < Date.now()
  6. }
  7. },

限制-选择今天以及今天之前的时间

  1. pickerOptions: {
  2. disabledDate(time) {
  3. // 选择今天以及今天之前的时间
  4. // time 表示的是面板中每一个日期值
  5. return time.getTime() > Date.now();
  6. }
  7. },

限制-选择今天之前的时间

  1. pickerOptions: {
  2. disabledDate(time) {
  3. // 选择今天之前的时间
  4. // time 表示的是面板中每一个日期值
  5. return time.getTime() > Date.now() - 24*60*60*1000;
  6. }
  7. },

限制-选择当前时间以及当前之前的7天的时间

  1. <el-date-picker
  2. v-model="value2"
  3. type="datetimerange"
  4. range-separator="至"
  5. :picker-options="pickerOptions"
  6. start-placeholder="开始日期"
  7. end-placeholder="结束日期"
  8. align="right">
  9. </el-date-picker>
  10. data() {
  11. return {
  12. pickerOptions: {
  13. disabledDate(time) {
  14. // 获取当前的时间
  15. let currentTime = new Date()
  16. // 重新设置当前时间的 时,分,秒,毫秒
  17. currentTime.setHours(0,0,0,0)
  18. // 得到当前时间 0时0分0秒的时间戳
  19. let endTime = currentTime.getTime()
  20. // 获取7天前的时间戳
  21. let startTime = endTime - 6*24*60*60*1000
  22. // time表示需要需要禁用的时间
  23. return time.getTime() < startTime || time.getTime() > endTime
  24. },
  25. },
  26. value2: ''
  27. }
  28. }

限制-时间不能超过当前时间,时间跨度不能超过30天

  1. 经过前面我们的学习,我们可以通过
  2. time.getTime() > Date.now();
  3. 来限制时间不能超过当前时间;
  4. 时间跨度我们通过 change 事件来判断开始时间和结束时间是否相差30
  5. 于是我们很快完成了功能
  1. <template>
  2. <div>
  3. <el-date-picker
  4. v-model="value2"
  5. type="datetimerange"
  6. @change="changeTime"
  7. range-separator="至"
  8. :picker-options="pickerOptions"
  9. start-placeholder="开始日期"
  10. end-placeholder="结束日期"
  11. align="right">
  12. </el-date-picker>
  13. </div>
  14. </template>
  15. <script>
  16. export default {
  17. data() {
  18. return {
  19. pickerOptions: {
  20. disabledDate(time) {
  21. // 选择今天以及今天之前的时间
  22. return time.getTime() > Date.now();
  23. },
  24. },
  25. value2: ''
  26. }
  27. },
  28. methods:{
  29. changeTime(time){
  30. if(time && time.length){
  31. let endTime = time[1].getTime()
  32. let startTime = time[0].getTime()
  33. let limitTime= 30 *24 *60*60*1000
  34. if(endTime - startTime > limitTime){
  35. this.$message.error('选择的时间不能超过30天');
  36. this.value2 = ''
  37. }
  38. }else {
  39. this.$message.error('请选择时间');
  40. }
  41. }
  42. }
  43. }
  44. </script>

发现问题

  1. 虽然我们上面的代码实现了功能;但是用户体验不是特别不好;
  2. 有没有这样的方式:当用户选择了52号;
  3. 只能选择它的前30天和后30天范围的时间(42号---6.20号)
  4. 如果要实现上面这样的功能:
  5. 1.我们要解决面板联动,可以使用 unlink-panels 来解决;
  6. 2.我们要知道用户点击选择的时间,这样我们才能知道开始和结束;
  7. 这样问题我们可以使用 onPick: date => { }事件知道点击选中的时间
  8. 3.计算出30天前和30天后的时间

选择的时间范围不超过7天(为了好演示)

  1. <template>
  2. <div>
  3. <el-date-picker v-model="myTime" unlink-panels type="datetimerange" range-separator="至"
  4. :picker-options="pickerOptions" start-placeholder="开始日期" end-placeholder="结束日期" align="right">
  5. </el-date-picker>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. data() {
  11. return {
  12. pickerOptions: {
  13. disabledDate: time => {
  14. // this.userSelectDate 可能是 '',不是一个日期对象;
  15. // 这个必须要使用括号哈
  16. // 如果使用 !this.userSelectDate instanceof Date 仍然是false
  17. if (!(this.userSelectDate instanceof Date)) {
  18. return false
  19. } else {
  20. let currentTime = time.getTime()
  21. let userSelectDateTime = this.userSelectDate.getTime()
  22. // 获取7天前的时间戳
  23. let day7beforeTime = userSelectDateTime - 6*24*60*60*1000
  24. // 获取7天后的时间戳
  25. let day7AfterTime = userSelectDateTime + 6*24*60*60*1000
  26. // 只能选择 7天前和7天后
  27. return currentTime > day7AfterTime || currentTime < day7beforeTime
  28. }
  29. },
  30. onPick: date => {
  31. // minDates就是用户选择的初始时间,记录它是为了得到7天前和7天后的时间
  32. console.log('用户选择时间就是触发', date)
  33. if (date.minDate) {
  34. // 记录用户选择的时间
  35. this.userSelectDate = date.minDate
  36. } else {
  37. this.userSelectDate = null
  38. }
  39. }
  40. },
  41. userSelectDate: '',
  42. myTime:''
  43. }
  44. }
  45. }
  46. </script>


又又发现了问题

  1. 上面虽然友好的实现了限制选择的时间前后不超过7天;
  2. 但是没有限制选择的时间【不能】选择今天之后的时间;
  3. 我们需要限制一下;
  4. 除了 pickerOptions 中的代码,其他的与上面的一样保持不变

选择的时间范围不超过7天,同时选择的时间不能选择今天之后的时间

  1. pickerOptions: {
  2. disabledDate: time => {
  3. console.log(11111111111)
  4. // 限制不能选择今天之后的时间
  5. if( Date.now() < time.getTime()){
  6. return true;
  7. }else {
  8. // this.userSelectDate 可能是 '',不是一个日期对象;
  9. // 这个必须要使用括号哈
  10. // 如果使用 !this.userSelectDate instanceof Date 仍然是false
  11. if (!(this.userSelectDate instanceof Date)) {
  12. return false
  13. } else {
  14. let currentTime = time.getTime()
  15. let userSelectDateTime = this.userSelectDate.getTime()
  16. // 获取7天前的时间戳
  17. let day7beforeTime = userSelectDateTime - 6*24*60*60*1000
  18. // 获取7天后的时间戳
  19. let day7AfterTime = userSelectDateTime + 6*24*60*60*1000
  20. // 只能选择 7天前和7天后
  21. return currentTime > day7AfterTime || currentTime < day7beforeTime
  22. }
  23. }
  24. }
  25. },


尾声

  1. 没有想到五一这么快就结束了;
  2. 用了2天时间看完了遮天;
  3. 主角是古今第一圣体,荒古圣体;
  4. 我是牛马圣体;不说了,开始干活

原文链接:https://www.cnblogs.com/IwishIcould/p/18174256

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号