fs-week-bar.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <template>
  2. <view class="fs-week-bar">
  3. <view class="fs-week-arrow" @click="handleChange('left')">
  4. <fs-icon type="icon-d-down" rotate="90" size="28rpx" :color="textColor"></fs-icon>
  5. </view>
  6. <view class="fs-week-list">
  7. <view
  8. class="fs-week-item"
  9. :class="{'fs-week-item-active': state.activeDate === item.fullDate}"
  10. v-for="(item, index) in state.week"
  11. :key="index"
  12. @click="handleClick(item)"
  13. >
  14. <view class="fs-week-item-hd">周{{item.day}}</view>
  15. <view class="fs-week-item-bd">{{item.date}}</view>
  16. </view>
  17. </view>
  18. <view class="fs-week-arrow" @click="handleChange('right')">
  19. <fs-icon type="icon-d-down" rotate="-90" size="28rpx" :color="textColor"></fs-icon>
  20. </view>
  21. </view>
  22. </template>
  23. <script>
  24. export default {
  25. name: "fs-week-bar"
  26. }
  27. </script>
  28. <script setup>
  29. import { ref, reactive, watch } from 'vue'
  30. import dayjs from 'dayjs'
  31. const props = defineProps({
  32. bgColor: {
  33. type: String,
  34. default: '#fff'
  35. },
  36. textColor: {
  37. type: String,
  38. default: '#666666'
  39. },
  40. activeColor: {
  41. type: String,
  42. default: '#165DFF'
  43. }
  44. })
  45. const emits = defineEmits(['change', 'click'])
  46. const state = reactive({
  47. week: [],
  48. radix: 0,
  49. activeDate: dayjs().format('YYYY-MM-DD')
  50. })
  51. const curDay = dayjs().day()
  52. const dayMap = {
  53. 1: '一',
  54. 2: '二',
  55. 3: '三',
  56. 4: '四',
  57. 5: '五',
  58. 6: '六',
  59. 7: '日',
  60. }
  61. const initWeek = () => {
  62. state.week = []
  63. for (let i = 1; i < curDay; i++) {
  64. const diffDay = curDay - i
  65. const date = dayjs().subtract(diffDay, 'day').add(7 * state.radix, 'day')
  66. state.week.push({
  67. day: dayMap[i],
  68. date: date.format('MM-DD'),
  69. fullDate: date.format('YYYY-MM-DD'),
  70. })
  71. }
  72. for (let i = curDay; i <= 7; i++) {
  73. const diffDay = i - curDay
  74. const date = dayjs().add(diffDay, 'day').add(7 * state.radix, 'day')
  75. state.week.push({
  76. day: dayMap[i],
  77. date: date.format('MM-DD'),
  78. fullDate: date.format('YYYY-MM-DD'),
  79. })
  80. }
  81. }
  82. const handleChange = type => {
  83. type === 'left' ? state.radix-- : state.radix++
  84. }
  85. watch(() => state.radix, (val) => {
  86. initWeek()
  87. emits('change', state.week)
  88. }, { immediate: true })
  89. const handleClick= item => {
  90. state.activeDate = item.fullDate
  91. emits('click', state.activeDate)
  92. }
  93. </script>
  94. <style lang="scss" scoped>
  95. .fs-week{
  96. &-bar{
  97. display: flex;
  98. align-items: center;
  99. background-color: v-bind(bgColor);
  100. padding: 20rpx 0;
  101. }
  102. &-arrow{
  103. padding: 0 10rpx;
  104. }
  105. &-list{
  106. display: flex;
  107. flex: 1;
  108. }
  109. &-item{
  110. text-align: center;
  111. flex: 1;
  112. color: v-bind(textColor);
  113. &-active{
  114. color: v-bind(activeColor);
  115. }
  116. &-hd{
  117. font-size: 15px;
  118. font-weight: bold;
  119. }
  120. &-bd{
  121. font-size: 13px;
  122. }
  123. }
  124. }
  125. </style>