QS-picker-date.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <template>
  2. <QSPickerTemplate ref="QSPickerTem" :height="height" :lineHeight="lineHeight" :fontScale="fontScale"
  3. :buttonSet="buttonSet" :title="title" :mode="mode" :zIndex="zIndex" :bgColor_title="bgColor_title"
  4. :autoHide="autoHide" :titleColor="titleColor" @confirm="confirm">
  5. <!-- #ifndef MP-ALIPAY -->
  6. <picker-view @touchmove.prevent.stop="voidFc()" indicator-style="height: 60px;" :value="value" @change="bindChange($event)">
  7. <picker-view-column v-if="setObj.dateMode>=1">
  8. <view class="flex_row_c_c pickerDefault" :class="((value[0] || 0) === picker_index?'selectColor':'defaultColor')"
  9. v-for="(picker_item,picker_index) in years" :key="picker_index">{{picker_item}}年</view>
  10. </picker-view-column>
  11. <picker-view-column v-if="setObj.dateMode>=2">
  12. <view class="flex_row_c_c pickerDefault" :class="((value[1] || 0) === picker_index?'selectColor':'defaultColor')"
  13. v-for="(picker_item,picker_index) in months" :key="picker_index">{{picker_item}}月</view>
  14. </picker-view-column>
  15. <picker-view-column v-if="setObj.dateMode>=3">
  16. <view class="flex_row_c_c pickerDefault" :class="((value[2] || 0) === picker_index?'selectColor':'defaultColor')"
  17. v-for="(picker_item,picker_index) in days" :key="picker_index">{{picker_item}}日</view>
  18. </picker-view-column>
  19. <picker-view-column v-if="setObj.dateMode>=4">
  20. <view class="flex_row_c_c pickerDefault" :class="((value[3] || 0) === picker_index?'selectColor':'defaultColor')"
  21. v-for="(picker_item,picker_index) in hours" :key="picker_index">{{picker_item}}时</view>
  22. </picker-view-column>
  23. <picker-view-column v-if="setObj.dateMode>=5">
  24. <view class="flex_row_c_c pickerDefault" :class="((value[4] || 0) === picker_index?'selectColor':'defaultColor')"
  25. v-for="(picker_item,picker_index) in ms" :key="picker_index">{{picker_item}}分</view>
  26. </picker-view-column>
  27. <picker-view-column v-if="setObj.dateMode>=6">
  28. <view class="flex_row_c_c pickerDefault" :class="((value[5] || 0) === picker_index?'selectColor':'defaultColor')"
  29. v-for="(picker_item,picker_index) in ms" :key="picker_index">{{picker_item}}秒</view>
  30. </picker-view-column>
  31. </picker-view>
  32. <!-- #endif -->
  33. <!-- #ifdef MP-ALIPAY -->
  34. <!-- 支付宝奇葩一点的,别的平台都可以 但是他不行,, 郁闷 -->
  35. <block v-if="setObj.dateMode==1"><picker-view @touchmove.prevent.stop="voidFc()" indicator-style="height: 60px;" :value="value" @change="bindChange($event)"><picker-view-column><view class="flex_row_c_c pickerDefault" :class="((value[0] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in years" :key="picker_index">{{picker_item}}年</view></picker-view-column></picker-view></block>
  36. <block v-if="setObj.dateMode==2"><picker-view @touchmove.prevent.stop="voidFc()" indicator-style="height: 60px;" :value="value" @change="bindChange($event)"><picker-view-column><view class="flex_row_c_c pickerDefault" :class="((value[0] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in years" :key="picker_index">{{picker_item}}年</view></picker-view-column><picker-view-column><view class="flex_row_c_c pickerDefault" :class="((value[1] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in months" :key="picker_index">{{picker_item}}月</view></picker-view-column></picker-view></block>
  37. <block v-if="setObj.dateMode==3"><picker-view @touchmove.prevent.stop="voidFc()" indicator-style="height: 60px;" :value="value" @change="bindChange($event)"><picker-view-column><view class="flex_row_c_c pickerDefault" :class="((value[0] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in years" :key="picker_index">{{picker_item}}年</view></picker-view-column><picker-view-column><view class="flex_row_c_c pickerDefault" :class="((value[1] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in months" :key="picker_index">{{picker_item}}月</view></picker-view-column><picker-view-column><view class="flex_row_c_c pickerDefault" :class="((value[2] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in days" :key="picker_index">{{picker_item}}日</view></picker-view-column></picker-view></block>
  38. <block v-if="setObj.dateMode==4"><picker-view @touchmove.prevent.stop="voidFc()" indicator-style="height: 60px;" :value="value" @change="bindChange($event)"><picker-view-column><view class="flex_row_c_c pickerDefault" :class="((value[0] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in years" :key="picker_index">{{picker_item}}年</view></picker-view-column><picker-view-column><view class="flex_row_c_c pickerDefault" :class="((value[1] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in months" :key="picker_index">{{picker_item}}月</view></picker-view-column><picker-view-column><view class="flex_row_c_c pickerDefault" :class="((value[2] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in days" :key="picker_index">{{picker_item}}日</view></picker-view-column><picker-view-column><view class="flex_row_c_c pickerDefault" :class="((value[3] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in hours" :key="picker_index">{{picker_item}}时</view></picker-view-column></picker-view></block>
  39. <block v-if="setObj.dateMode==5"><picker-view @touchmove.prevent.stop="voidFc()" indicator-style="height: 60px;" :value="value" @change="bindChange($event)"><picker-view-column><view class="flex_row_c_c pickerDefault" :class="((value[0] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in years" :key="picker_index">{{picker_item}}年</view></picker-view-column><picker-view-column><view class="flex_row_c_c pickerDefault" :class="((value[1] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in months" :key="picker_index">{{picker_item}}月</view></picker-view-column><picker-view-column><view class="flex_row_c_c pickerDefault" :class="((value[2] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in days" :key="picker_index">{{picker_item}}日</view></picker-view-column><picker-view-column><view class="flex_row_c_c pickerDefault" :class="((value[3] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in hours" :key="picker_index">{{picker_item}}时</view></picker-view-column><picker-view-column><view class="flex_row_c_c pickerDefault" :class="((value[4] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in ms" :key="picker_index">{{picker_item}}分</view></picker-view-column></picker-view></block>
  40. <block v-if="setObj.dateMode==6"><picker-view @touchmove.prevent.stop="voidFc()" indicator-style="height: 60px;" :value="value" @change="bindChange($event)"><picker-view-column><view class="flex_row_c_c pickerDefault" :class="((value[0] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in years" :key="picker_index">{{picker_item}}年</view></picker-view-column><picker-view-column><view class="flex_row_c_c pickerDefault" :class="((value[1] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in months" :key="picker_index">{{picker_item}}月</view></picker-view-column><picker-view-column><view class="flex_row_c_c pickerDefault" :class="((value[2] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in days" :key="picker_index">{{picker_item}}日</view></picker-view-column><picker-view-column><view class="flex_row_c_c pickerDefault" :class="((value[3] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in hours" :key="picker_index">{{picker_item}}时</view></picker-view-column><picker-view-column><view class="flex_row_c_c pickerDefault" :class="((value[4] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in ms" :key="picker_index">{{picker_item}}分</view></picker-view-column><picker-view-column><view class="flex_row_c_c pickerDefault" :class="((value[5] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in ms" :key="picker_index">{{picker_item}}秒</view></picker-view-column></picker-view></block>
  41. <!-- #endif -->
  42. </QSPickerTemplate>
  43. </template>
  44. <script>
  45. import QSPickerTemplate from './QS-pickerTemplate.vue';
  46. import QSPicker from '../js/QS-picker.js';
  47. import QSPickerMixin from '../js/QS-picker-mixin.js';
  48. export default {
  49. name: 'QS-picker-date',
  50. mixins: [QSPickerMixin()],
  51. components: {
  52. QSPickerTemplate
  53. },
  54. data() {
  55. return {
  56. years: [],
  57. days: [],
  58. months: QSPicker.num2Array(12),
  59. hours: QSPicker.num2Array(24),
  60. ms: QSPicker.num2Array(60),
  61. };
  62. },
  63. methods: {
  64. init() {
  65. let value = [];
  66. let setObj = QSPicker.creatDateObj(this.dataSet);
  67. //date
  68. let years = [];
  69. let days = [];
  70. let defaultDate = setObj.defaultValue;
  71. years = QSPicker.countYears(setObj.startYear || (new Date().getFullYear() - 5), setObj.endYear || (new Date().getFullYear() +
  72. 5));
  73. let endYear = years[years.length - 1];
  74. let defaultYear = defaultDate.getFullYear(),
  75. defaultMonth = defaultDate.getMonth(),
  76. defaultDay = defaultDate.getDate(),
  77. defaultHour = defaultDate.getHours(),
  78. defaultMinute = defaultDate.getMinutes(),
  79. defaultSecond = defaultDate.getSeconds();
  80. let compareY = defaultYear > endYear;
  81. let year = compareY ? endYear : defaultYear;
  82. let month = compareY ? 11 : defaultMonth;
  83. defaultDate[1] = month;
  84. days = QSPicker.countDays(year, defaultDate).days;
  85. let dm = setObj.dateMode;
  86. if (dm >= 1) {
  87. if (compareY)
  88. value.push(years.length - 1);
  89. else
  90. for (let i = 0; i < years.length; i++) {
  91. if (year == years[i]) {
  92. value.push(i);
  93. }
  94. }
  95. }
  96. if (dm >= 2) value.push(compareY ? 11 : month);
  97. if (dm >= 3) value.push(compareY ? days : defaultDay - 1);
  98. if (dm >= 4) value.push(defaultHour);
  99. if (dm >= 5) value.push(defaultMinute);
  100. if (dm >= 6) value.push(defaultSecond);
  101. //date
  102. this.years = years;
  103. this.days = days;
  104. this.setObj = setObj;
  105. let defaultValue = [...value];
  106. this.value = value;
  107. this.defaultValue = defaultValue;
  108. },
  109. bindChange({
  110. detail: {
  111. value
  112. }
  113. }) {
  114. let data = QSPicker.countDays(this.years[value[0]], value);
  115. this.days = data.days;
  116. this.value = data.val;
  117. this.$emit('pickerChange', {value});
  118. },
  119. confirm() {
  120. const value = this.value;
  121. const obj = {
  122. value
  123. }
  124. let setObj = this.setObj;
  125. let data = '';
  126. let dateFormatArray = setObj.dateFormatArray;
  127. for (let i = 1; i <= this.setObj.dateMode; i++) {
  128. if (i <= 6) {
  129. let j = i - 1;
  130. let f = i - 2;
  131. switch (i) {
  132. case 1:
  133. data += this.years[value[j]];
  134. break;
  135. case 2:
  136. data += dateFormatArray[f] + (value[j] + 1);
  137. break;
  138. case 3:
  139. data += dateFormatArray[f] + (value[j] + 1);
  140. break;
  141. default:
  142. data += dateFormatArray[f] + value[j];
  143. break;
  144. }
  145. }
  146. }
  147. obj.data = data;
  148. this.$emit('confirm', obj);
  149. if (this.autoHide) this.hide();
  150. }
  151. }
  152. }
  153. </script>
  154. <style scoped>
  155. @import url("../css/QS-picker.css");
  156. @import url("../../../config/css/picker.css");
  157. </style>