当前位置:   article > 正文

element-plus中el-date-picker相关问题_pickeroptions不生效

pickeroptions不生效

前提

        最近在做一个Vue3新项目,用的是element-plus,发现很多以前在element-ui中用的属性和方法都不管用了。

        正好要做时间选择器,记录一下elment-plus中时间选择器的属性和方法的使用。

1. 实现时间限制

1.1 属性pickerOptions不可用的问题

        以前在element-ui中都用pickerOptions来限制日期的可选时间范围,如下:

  1. <el-date-picker
  2. v-model="searchForm.orderTime"
  3. value-format="yyyy-MM-dd"
  4. type="daterange"
  5. range-separator="至"
  6. start-placeholder="开始日期"
  7. end-placeholder="结束日期"
  8. :pickerOptions="pickerOptions"
  9. ref="dateDom"
  10. >
  11. </el-date-picker>
  1. data() {
  2. return {
  3. pickerOptions: {
  4. disabledDate(time) {
  5. // 禁止选当天以后的日期
  6. return time.getTime() > Date.now()
  7. }
  8. }
  9. }
  10. },

        最近在做一个Vue3新项目,也要实现类似功能,但突然发现pickerOptions不好用了,控制台也没有报错,郁闷坏了。由于之前是在Vue2中使用的pickerOptions属性,本次Vue3使用的是element-plus代替element-ui,猜测使用上会有所区别。

1.2 使用disabled-date解决

element-plus地址:DateTimePicker 日期时间选择器 | Element Plus (element-plus.org)

        Vue3中想要实现pickerOptions的功能,可以用disabled-date来代替,如下:

  1. 子组件
  2. <el-col
  3. v-for="(item, index) in queryFormArr"
  4. :key="index"
  5. >
  6. <!-- 这里禁掉了用户的修改和清空功能-->
  7. <el-date-picker
  8. :editable="false"
  9. :clearable="false"
  10. v-model="item.val"
  11. type="daterange"
  12. range-separator="至"
  13. start-placeholder="开始日期"
  14. v-if="item.type == 'daterange'"
  15. :disabled="item.disabled"
  16. maxlength="10"
  17. end-placeholder="结束日期"
  18. format="YYYY-MM-DD"
  19. value-format="YYYY-MM-DD"
  20. class="font-xs item-form-doc"
  21. :disabled-date="item.options.disabledDate"
  22. @calendar-change="item.options.selectDate"
  23. @change="onChange"
  24. >
  25. </el-col>
  1. 子组件script (子组件是vue2的)
  2. data() {
  3. return {
  4. selectedValue:null // 设置鼠标点击日期选中的值,用于计算选中日期前后的不可选日期
  5. queryFormArr:props.queryArr
  6. }
  7. },
  8. methods:{
  9. // 选定两个日期后,清除原来的选中值,取消选中值的日期限制
  10. onChange(){
  11. this.selectedValue = null
  12. }
  13. }
  1. 父组件
  2. <query ref="queryRef" :queryArr="queryParams" class="query">
  1. 父组件<script>
  2. /**
  3. * 获取日活/月活时间选择器的默认展示时间
  4. * @param isDailyPanel 日活/月活标志
  5. */
  6. function getTime(isDailyPanel) {
  7. let currentDate = new Date(new Date().getTime() - 24 * 60 * 60 * 1000).toLocaleString() // 当前时间
  8. let sixDaysAgo = new Date(new Date().getTime() - 7 * 24 * 60 * 60 * 1000).toLocaleString() // 六天前的时间
  9. let lastMonthDate = new Date(new Date().getTime() - 24 * 60 * 60 * 1000 * new Date().getDate()).toLocaleString() // 一个月前的时间:当前日期-本月的天数
  10. let startDay = `${translateDay(sixDaysAgo, lastMonthDate, isDailyPanel)}` // 开始时间
  11. let endDay = `${translateDay(currentDate, lastMonthDate, isDailyPanel)}` // 结束时间
  12. return [startDay, endDay]
  13. }
  14. /**
  15. * 返回开始和结束时间
  16. * @param dayDate 年、月、日时间
  17. * @param monthDate 上个月时间
  18. * @param isDailyPanel 日活/月活标志
  19. */
  20. function translateDay(dayDate, monthDate, isDailyPanel) {
  21. let [year, month, day] = dayDate.split(' ')[0].split('/')
  22. let lastMonth = monthDate.split(' ')[0].split('/')[1]
  23. // 日活面板默认显示前一天,月活面板显示上个月
  24. return isDailyPanel ? `${year}-${translateTime(month)}-${translateTime(day)}` : `${year}-${translateTime(lastMonth)}`
  25. }
  26. /**
  27. * 限制选择当天以前的日期
  28. * @param date 日期组件自动传入的日期参数
  29. */
  30. function disabledDate(date) {
  31. let lastDay = new Date(new Date().getTime() - 24 * 60 * 60 * 1000)
  32. let lastMonth = new Date(new Date().getTime() - 24 * 60 * 60 * 1000 * new Date().getDate())
  33. // 日活面板限制日期可选前后1个月,月活面板限制日期可选前后12个月
  34. if (isDailyPanel) {
  35. // 用户已选中一个日期,根据该日期限制可选日期为前后1个月
  36. if (queryRef.value && queryRef.value.selectedValue) {
  37. return (
  38. date.getTime() > lastDay ||
  39. dayjs(date) < dayjs(queryRef.value.selectedValue).subtract(1, 'month').add(1, 'day') ||
  40. dayjs(date) > dayjs(queryRef.value.selectedValue).add(1, 'month').subtract(1, 'day')
  41. )
  42. }
  43. // 用户未选中,限制可选日期为昨天及以前
  44. return date.getTime() > lastDay
  45. } else {
  46. // 用户已选中一个日期,根据该日期限制可选日期为前后12个月
  47. if (queryRef.value && queryRef.value.selectedValue) {
  48. return (
  49. date.getTime() > lastMonth ||
  50. dayjs(date) < dayjs(queryRef.value.selectedValue).subtract(11, 'month') ||
  51. dayjs(date) > dayjs(queryRef.value.selectedValue).add(11, 'month')
  52. )
  53. }
  54. // 用户未选中,限制可选日期为上个月及以前
  55. return date.getTime() > lastMonth
  56. }
  57. }
  58. /**
  59. * 设置当前鼠标选中值
  60. * @param date 日期组件自动传入的日期参数
  61. */
  62. function selectDate(date) {
  63. queryRef.value.selectedValue = date[0]
  64. }

1.3 属性disabled-date做时间限制

disabled-date方法:用来做日期的时间限制

需求:

(1)选择了日期时,其他可选日期做限制(选该日期的前后一个月)

(2)没选日期时,应当有一个默认限制(不能选昨天以前的日期)

2. calendar-change选中日期时回调

calendar-change方法用来设置选中日历日期后的回调。此处用来将鼠标点击选中的日期赋值给selectedValue。

虽然官网声称该方法只对datetimerange生效,但实际该问题已被修复,在2.3.13版本后,该方法对其他类型也生效,建议从2.3.14版本开始使用:

fix(components): [date-picker] not trigger emits when type is monthrange by listennn08 · Pull Request #13880 · element-plus/element-plus · GitHub

selectedValue:为鼠标点击日期选中的值,我用它来计算选中日期前后的不可选日期。

 入参:     

        这个入参会自动对点击日期排序

(1)如果时间面板选择一个日期,则date只有选中的一个日期;

(2)如果选择了两个日期,date会对两个日期呈从小到大排序。

这样就保证了date[0]取到的就是点击的日期中的较小值

(因为我们对选择日期作前后一个月可选限制时,也是针对点击日期的较小值来做限制的)

3. visible-change面板下拉收起回调

 

 入参:

        它的入参也有两种情况,true/false。

        true:表明此时是点击出现下拉列表

        false:表明此时是点击收起下拉列表

这个方法这里没使用,作为了解

4. 引入中文显示

         时间选择器的官网组件默认英文,这里需要用中文显示

  1. main.ts
  2. import ElementPlus from 'element-plus'
  3. import locale from 'element-plus/dist/locale/zh-cn'
  4. const app = createApp(App)
  5. app.use(ElementPlus,{locale}) //中文

5. 时间选择器样式问题

5.1 取消当前日期的加粗+蓝色高亮显示

原效果:当前日期(5月27日)有默认的加粗及蓝色高亮展示,需要恢复成和5月28日同样的样式

找一个公共组件,写入下列样式:

  1. // 时间选择器-日单位-取消【当前日期】默认的加粗+蓝色高亮显示
  2. .el-date-table td.today .el-date-table-cell__text{
  3. color: #A8ABB2 !important;
  4. font-weight: normal !important;
  5. }

效果:

5.2 取消当前月份默认的加粗显示

原效果:当前月份(五月)有默认的加粗显示效果

找一个公共组件,写入下列样式:

  1. // 时间选择器-月单位-取消【当前月份】默认的加粗显示
  2. .el-month-table td.today .cell{
  3. font-weight: normal !important;
  4. }

效果:

6. 安装完element-plus样式不生效问题

el-date-picker长这样,能忍?

别忘记在main.ts引入element的css文件

  1. import ElementPlus from 'element-plus'
  2. import locale from 'element-plus/dist/locale/zh-cn' // 引入中文
  3. import * as ElementPlusIconsVue from '@element-plus/icons-vue'
  4. import 'element-plus/dist/index.css' // 引入样式
  5. ......
  6. const app = createApp(App)
  7. app.use(ElementPlus, { locale })
  8. // 注册图标
  9. for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
  10. app.component(key, component)
  11. }
  12. ....

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/890743
推荐阅读
相关标签
  

闽ICP备14008679号