CustomCalendar.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <template>
  2. <view class="custom-calendar">
  3. <view class="date-select-segment">
  4. <view class="date-item" :class="{'current-item':current===index, 'not-allow':isAfter(item)}" v-for="(item,index) in dateList"
  5. :key="index" @tap="!isAfter(item) && handleClick(item, index)">
  6. <view class="date-item-week">
  7. {{getWeek(item)}}
  8. </view>
  9. <view class="date-item-date">
  10. {{moment(item).format('MM/DD')}}
  11. </view>
  12. </view>
  13. <view class="date-item">
  14. <uni-datetime-picker type="date" v-model="currentDate" @change="handleDateChange" :end="moment().format(fmt)">
  15. <view class="date-picker-inner">
  16. <uni-icons size="26" type="calendar"></uni-icons>
  17. <view>
  18. 日历
  19. </view>
  20. </view>
  21. </uni-datetime-picker>
  22. </view>
  23. </view>
  24. </view>
  25. </template>
  26. <script setup>
  27. import {
  28. computed,
  29. ref,
  30. defineEmits,
  31. watch
  32. } from 'vue';
  33. import moment from 'moment';
  34. const dateList = ref([])
  35. const current = ref(2)
  36. const currentDate = ref(moment().format('YYYY-MM-DD'))
  37. const emit = defineEmits(['onDateChangeEvent'])
  38. const fmt = "YYYY-MM-DD"
  39. const setDateList = (date) => {
  40. let list = []
  41. list.push(date.clone().subtract(2, 'days').format(fmt))
  42. list.push(date.clone().subtract(1, 'days').format(fmt))
  43. list.push(date.clone().format(fmt))
  44. list.push(date.clone().add(1, 'days').format(fmt))
  45. list.push(date.clone().add(2, 'days').format(fmt))
  46. dateList.value = list
  47. current.value = 2
  48. }
  49. setDateList(moment())
  50. const handleDateChange = (e) => {
  51. currentDate.value = e
  52. setDateList(moment(e))
  53. emit('onDateChangeEvent', e)
  54. }
  55. const weeks = ["周天", "周一", "周二", "周三", "周四", "周五", "周六"]
  56. const getWeek = (date) => {
  57. return weeks[moment(date).day()]
  58. }
  59. const handleClick = (date, index)=>{
  60. currentDate.value = moment(date).format(fmt)
  61. current.value = index
  62. emit('onDateChangeEvent', currentDate.value)
  63. }
  64. const isAfter = (date)=>{
  65. return moment(date).isAfter(moment())
  66. }
  67. </script>
  68. <style lang="scss" scoped>
  69. .custom-calendar {
  70. .date-select-segment {
  71. display: flex;
  72. justify-content: space-between;
  73. align-items: center;
  74. .date-item {
  75. // flex-shrink: 0;
  76. display: flex;
  77. flex-direction: column;
  78. align-items: center;
  79. justify-content: center;
  80. background-color: #fff;
  81. border-radius: 12rpx;
  82. // padding: 0 10rpx;
  83. flex: 0 0 15%;
  84. min-height: 110rpx;
  85. font-family: Source Han Sans;
  86. font-size: 32rpx;
  87. font-feature-settings: "kern" on;
  88. color: $uni-text-color;
  89. ::v-deep .date-picker-inner {
  90. flex-shrink: 0;
  91. display: flex;
  92. flex-direction: column;
  93. align-items: center;
  94. justify-content: center;
  95. min-height: 110rpx;
  96. }
  97. }
  98. .current-item{
  99. background: linear-gradient(180deg, #41B1F7 0%, #0671DD 100%);
  100. color: #fff;
  101. }
  102. .not-allow{
  103. cursor: not-allowed;
  104. color: $uni-text-color-disable;
  105. }
  106. }
  107. }
  108. </style>