myWeekPicker.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <template>
  2. <view class="my-week-picker">
  3. <view class="my-week-popup_header">
  4. <text class="my-week-popup-text cancel" @click="onCancel">取消</text>
  5. <text class="my-week-popup-text sure" @click="onSure">确定</text>
  6. </view>
  7. <picker-view :value="pickerValue" @change="bindChange" class="my-week-picker_view"
  8. :indicatorStyle="'height:'+height+'px'">
  9. <picker-view-column class="my-week-picker_item years">
  10. <view class="my-week-picker_item_view" :style="{'height':height+'px'}" v-for="(item,index) in years"
  11. :key="index">{{item}}</view>
  12. </picker-view-column>
  13. <picker-view-column class="my-week-picker_item months">
  14. <view class="my-week-picker_item_view" :style="{'height':height+'px'}" v-for="(item,index) in months"
  15. :key="index">{{index+1}}</view>
  16. </picker-view-column>
  17. <picker-view-column class="my-week-picker_item weeks">
  18. <view class="my-week-picker_item_view" :style="{'height':height+'px'}" v-for="(item,index) in weeks"
  19. :key="index">{{item.text}}</view>
  20. </picker-view-column>
  21. </picker-view>
  22. </view>
  23. </template>
  24. <script>
  25. import dayjs from 'dayjs';
  26. import weekjs from './week.js'
  27. export default {
  28. name: "myWeekPicker",
  29. props: {
  30. value: {
  31. type: String,
  32. default: ''
  33. },
  34. /**
  35. * 格式化
  36. * 0: 2021-06-01
  37. * 1: 2021年06月01日
  38. */
  39. formatType: {
  40. type: Number,
  41. default: 0
  42. },
  43. // 列的高度
  44. height: {
  45. type: [Number, String],
  46. default: 50
  47. },
  48. },
  49. data() {
  50. return {
  51. years: [],
  52. months: 12,
  53. weeks: [],
  54. pickerValue: [0, 0, 0],
  55. result: {
  56. week: ''
  57. }
  58. };
  59. },
  60. computed: {
  61. val() {
  62. return this.value || dayjs().format('YYYY-MM-DD')
  63. }
  64. },
  65. created() {
  66. this.dateInit();
  67. },
  68. methods: {
  69. async dateInit() {
  70. let v = this.val.split('-');
  71. let s = Number(v[0]) - 50;
  72. let e = Number(v[0]) + 50;
  73. let y = Number(v[0]),
  74. y_index;
  75. let m = Number(v[1]);
  76. // 年
  77. for (var i = s; i <= e; i++) {
  78. if (i == y) {
  79. //所选年的index
  80. y = i;
  81. y_index = e - s - (e - y)
  82. }
  83. this.years.push(i)
  84. }
  85. // 月
  86. for (var i = 1; i <= 12; i++) {
  87. if (i == Number(m)) { //所选月的index
  88. m = i;
  89. break;
  90. }
  91. }
  92. // 周
  93. let res = await weekjs.getWeeksByMonth(y, m,this.val,this.formatType);
  94. this.weeks = res.arr;
  95. this.$set(this.pickerValue, 2, await res.weekIndex - 1)
  96. this.$set(this.pickerValue, 0, y_index)
  97. this.$set(this.pickerValue, 1, m - 1)
  98. this.result = {
  99. week: res.week
  100. }
  101. },
  102. // picker change
  103. bindChange(e) {
  104. let v = e.detail.value;
  105. this.pickerValue = v;
  106. let y = this.years[v[0]];
  107. let m = v[1] + 1;
  108. let w = v[2];
  109. this.weeks = weekjs.getWeeksByMonth(y, m,this.val,this.formatType).arr;
  110. this.result = {
  111. week: this.weeks[w]
  112. }
  113. },
  114. onCancel() {
  115. this.$emit('change');
  116. },
  117. onSure() {
  118. this.$emit('change', this.result);
  119. }
  120. }
  121. }
  122. </script>
  123. <style lang="scss" scoped>
  124. .my-week-picker {
  125. background-color: #FFFFFF;
  126. border-top: 1px solid #e3e3e3;
  127. }
  128. .my-week-popup_header {
  129. box-sizing: border-box;
  130. width: 100%;
  131. height: 40px;
  132. padding: 0 30rpx;
  133. display: flex;
  134. flex-direction: row;
  135. justify-content: space-between;
  136. align-items: center;
  137. background-color: #FFFFFF;
  138. border-bottom: 1px solid #e3e3e3;
  139. }
  140. .my-week-popup-text {
  141. font-size: 16px;
  142. &.cancel {
  143. color: #999;
  144. }
  145. &.sure {
  146. color: #007AFF;
  147. }
  148. }
  149. .my-week-picker_view {
  150. width: 100%;
  151. height: 450rpx;
  152. }
  153. .my-week-picker_item {
  154. display: flex;
  155. align-items: center;
  156. justify-content: center;
  157. &.years {
  158. flex: 1;
  159. }
  160. &.months {
  161. flex: 1;
  162. }
  163. &.weeks {
  164. flex: 3;
  165. }
  166. }
  167. .my-week-picker_item_view {
  168. font-size: 14px;
  169. display: flex;
  170. align-items: center;
  171. justify-content: center;
  172. text-align: center;
  173. }
  174. </style>