my-week-picker.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. <template>
  2. <view>
  3. <picker :value="indexArr" mode="multiSelector" :range="multiArray" @change="testChange"
  4. @columnchange="bindMultiPickerColumnChange">
  5. <view class="my-week-picker_input">
  6. {{result.year}}年{{result.month}}月第{{result.number}}周({{result.start}}至{{result.end}})
  7. </view>
  8. </picker>
  9. </view>
  10. </template>
  11. <script>
  12. import dayjs from 'dayjs';
  13. import weekday from 'dayjs/plugin/weekday';
  14. import isSameOrAfter from 'dayjs/plugin/isSameOrAfter'
  15. import isSameOrBefore from 'dayjs/plugin/isSameOrBefore'
  16. dayjs.extend(weekday)
  17. dayjs.extend(isSameOrAfter)
  18. dayjs.extend(isSameOrBefore)
  19. // 解决苹果电脑本地语言配置
  20. require('dayjs/locale/en')
  21. dayjs.locale('en')
  22. export default {
  23. name: "my-week-picker",
  24. data() {
  25. return {
  26. indexArr: [0, 0, 0],
  27. multiArray: [
  28. ['亚洲', '欧洲'],
  29. ['中国', '日本'],
  30. ['北京', '上海', '广州']
  31. ]
  32. };
  33. },
  34. computed: {
  35. result() {
  36. // 2021年
  37. // 9月
  38. // 第1周(09月06日 至 09月12日)
  39. let res = {
  40. year: 2021,
  41. month: 9,
  42. number: 2,
  43. start: "09月13日",
  44. end: "09月19日"
  45. }
  46. return res
  47. }
  48. },
  49. mounted() {
  50. this.dateInit()
  51. },
  52. methods: {
  53. dateInit() {
  54. let y = dayjs().year();
  55. let m = dayjs().month();
  56. let w;
  57. let y_arr = []; // 年
  58. let m_arr = [...Array(12)].map((c, i) => i + 1); // 月份
  59. let w_arr = [];
  60. for (let i = (y - 50); i <= (y + 50); i++) {
  61. y_arr.push(i)
  62. }
  63. let week_res = this.getWeek(y, m + 1);
  64. w_arr = week_res.arr.map(i => i.text);
  65. w = week_res.weekIndex;
  66. this.multiArray = [y_arr, m_arr, w_arr];
  67. this.indexArr = [50, m, w - 1]
  68. },
  69. /**
  70. * 根据年月查询周信息
  71. * @param {Object} y 年
  72. * @param {Object} m 月
  73. */
  74. getWeek(y, m) {
  75. let type = this.formatType;
  76. let len = dayjs(`${y}-${m}`).daysInMonth();
  77. let arr = [],
  78. weekIndex, week;
  79. let v = this.val;
  80. [...Array(len)].forEach((c, i) => {
  81. let date = dayjs(`${y}-${m}-${i+1}`);
  82. if (date.day() == 1) {
  83. let date_start = date.weekday(1);
  84. let date_end = date.weekday(7);
  85. console.log(
  86. `${y}年${m}月第${arr.length+1}周为\r\n${date_start.format('YYYY年MM月DD日')} 至 ${date_end.format('YYYY年MM月DD日')}`
  87. );
  88. let index = arr.length + 1;
  89. let start = type ? date_start.format('MM月DD日') : date_start.format('MM-DD');
  90. let end = type ? date_end.format('MM月DD日') : date_end.format('MM-DD');
  91. let obj = {
  92. text: `第${index}周(${start}至${end})`,
  93. year: y,
  94. month: m,
  95. val: `${dayjs(date_start).format('YYYY-MM-DD')}`,
  96. start: start + '(周一)',
  97. end: end + '(周日)',
  98. index: index //1:该月第一周 2:该月第二周
  99. }
  100. arr.push(obj)
  101. if (dayjs(v).isSameOrAfter(date_start, 'date') && dayjs(v).isSameOrBefore(
  102. date_end, 'date')) {
  103. weekIndex = index;
  104. week = obj
  105. }
  106. }
  107. })
  108. return {
  109. arr,
  110. weekIndex,
  111. week
  112. }
  113. },
  114. bindMultiPickerColumnChange(e) {
  115. let column = e.detail.column;
  116. let index = e.detail.value;
  117. let year, month, week;
  118. if (column == 0) {
  119. // 拖动年
  120. year = this.year[index];
  121. } else if (column == 1) {
  122. // 拖动月
  123. month = this.month[index];
  124. }
  125. // 得到年份,得到月份,根据年月。计算周信息
  126. },
  127. testChange(e) {
  128. console.log(e);
  129. },
  130. }
  131. }
  132. </script>
  133. <style>
  134. .my-week-picker_input {
  135. border: 1px solid #F1F1F1;
  136. border-radius: 8rpx;
  137. padding: 20rpx;
  138. }
  139. /* 修改样式 */
  140. uni-picker-view-column:nth-child(1) {
  141. flex: 1;
  142. }
  143. uni-picker-view-column:nth-child(2) {
  144. flex: 1;
  145. }
  146. .uni-picker-view-column{
  147. flex: 3 !important;
  148. }
  149. </style>