• el-date-picker 封装一个简单的日期组件, 主要是禁用日期


    子组件

    1. <script>
    2. // 定义一天的毫秒数
    3. const ONE_DAY_MS = 24 * 60 * 60 * 1000;
    4. export default {
    5. props: {
    6. // 日期范围值
    7. value: {
    8. type: Array,
    9. default: () => []
    10. },
    11. // 选择的日期范围限制
    12. limit: {
    13. type: Number,
    14. default: Infinity
    15. },
    16. // 是否禁止选择当前日期之后的日期
    17. disableCurrentDateLater:{
    18. type:Boolean,
    19. default: false
    20. },
    21. // 只能选择当前日期之前的天数限制
    22. daysLimit: {
    23. type: Number,
    24. default: Infinity
    25. },
    26. // 是否显示快捷选项
    27. showShortcuts:{
    28. type:Boolean,
    29. default: true
    30. },
    31. // 默认开始和结束时间的时分秒
    32. defaultTime:{
    33. type: Array,
    34. default: () => (['00:00:00', '23:59:59'])
    35. }
    36. },
    37. data() {
    38. return {
    39. // 日期选择器的选项
    40. pickerOptions: {
    41. onPick: this.handlePick,
    42. disabledDate: this.isDisabledDate,
    43. shortcuts: this.showShortcuts ? this.getShortcuts() : [],
    44. },
    45. };
    46. },
    47. methods: {
    48. // 处理日期选择
    49. // 当选择的最小日期存在时,如果已经存在pickerMinDate,则将其置空;如果不存在pickerMinDate,则将选择的最小日期赋值给pickerMinDate
    50. handlePick({ minDate }) {
    51. const now = new Date();
    52. now.setSeconds(0, 0); // 清除秒和毫秒
    53. if (minDate && this.pickerMinDate) {
    54. this.pickerMinDate = null;
    55. } else if (minDate) {
    56. this.pickerMinDate = minDate.getTime();
    57. }
    58. },
    59. // 判断日期是否被禁用
    60. // 如果pickerMinDate存在,则判断日期是否超出范围或者在当前日期之后;如果pickerMinDate不存在,则判断日期是否在30天前或者在当前日期之后
    61. isDisabledDate(time) {
    62. const now = new Date();
    63. const thirtyDaysAgo = now.getTime() - this.daysLimit * ONE_DAY_MS;
    64. if (this.pickerMinDate) {
    65. return this.isDateOutOfRange(time, thirtyDaysAgo, this.pickerMinDate) || this.isDateAfterNow(time, now);
    66. }
    67. return time.getTime() < thirtyDaysAgo || this.isDateAfterNow(time, now);
    68. },
    69. // 判断日期是否超出范围
    70. // 如果日期在pickerMinDate的limit天之后,或者在pickerMinDate的limit天之前,或者在30天前,则返回true,表示日期超出范围
    71. isDateOutOfRange(time, thirtyDaysAgo, pickerMinDate) {
    72. const limitTime = this.limit * ONE_DAY_MS;
    73. return (time.getTime() > (pickerMinDate + limitTime)) || (time.getTime() < (pickerMinDate - limitTime)) || time.getTime() < thirtyDaysAgo;
    74. },
    75. // 判断日期是否在当前日期之后
    76. isDateAfterNow(time, now) {
    77. return this.disableCurrentDateLater && time.getTime() > now.getTime();
    78. },
    79. // 获取快捷选项
    80. getShortcuts() {
    81. return [{
    82. text: '最近一周',
    83. onClick: this.getShortcutPicker(7)
    84. }, {
    85. text: '最近一个月',
    86. onClick: this.getShortcutPicker(30)
    87. }, {
    88. text: '最近三个月',
    89. onClick: this.getShortcutPicker(90)
    90. }];
    91. },
    92. // 获取快捷选项的日期范围
    93. getShortcutPicker(days) {
    94. return (picker) => {
    95. const end = new Date();
    96. const start = new Date();
    97. start.setTime(start.getTime() - days * ONE_DAY_MS);
    98. picker.$emit('pick', [start, end]);
    99. };
    100. },
    101. },
    102. computed: {
    103. // 日期模型,用于v-model双向绑定
    104. dateModel: {
    105. get() {
    106. return this.value ? this.value.map(date => new Date(date)) : [];
    107. },
    108. set(val) {
    109. if (val) {
    110. this.$emit('input', val.map(date => date.getTime()));
    111. } else {
    112. this.$emit('input', null);
    113. }
    114. }
    115. }
    116. },
    117. };
    118. script>

    父组件

    1. <script>
    2. import myDatePicker from './components/myDatePicker'
    3. export default {
    4. name: 'App',
    5. components: {
    6. myDatePicker,
    7. },
    8. data() {
    9. return {
    10. date: [],
    11. }
    12. },
    13. }
    14. script>

  • 相关阅读:
    海外媒体发稿:新闻媒体发稿7种方法-华媒舍
    【12】Head First Java 学习笔记
    python 3.11中安装sympy(符号工具包)
    HTTP协议和Tomcat服务器
    Taichi 加速 Python 中图像处理
    Zabbix“专家坐诊”第204期问答汇总
    利用SpringBoot和vue+elementui做一个简单的书本信息管理系统
    vulnhub靶机Vegeta
    CSP-J 2023 第二轮认证入门级(含答案)
    CSP-J第二轮试题-2022年-1.2题
  • 原文地址:https://blog.csdn.net/weixin_49035434/article/details/132865073