dateTimePicker.vue 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. <template>
  2. <view class="pickebox">
  3. <view class="pickebox-typebox" v-if="showType">
  4. <view :class="activeTab == index ? 'type-active tab-'+tabColor:''" v-for="(item,index) in tabs" :key="index" @click="handleTab(item,index)">{{item.label}}</view>
  5. </view>
  6. <view class="pickebox-picker">
  7. <view class="pickebox-pickerbtn prev" @click="handlePrev">
  8. <image src="@/static/images/health/arrow_time_yes_icon.png"></image>
  9. <!-- <image src="@/static/images/pages_watch/icons/arrow_time_no_icon.png"></image> -->
  10. </view>
  11. <view v-if="activeTab == 1" @click="openWeek">{{weekValue}}</view>
  12. <template v-else>
  13. <picker mode="date" :fields="fields" :value="value" style="display:inline-block;" @change="bindPickerChange">
  14. <view>{{_date}}</view>
  15. </picker>
  16. </template>
  17. <view class="pickebox-pickerbtn next" @click="handleNext">
  18. <image src="@/static/images/health/arrow_time_yes_icon.png"></image>
  19. <!-- <image src="@/static/images/pages_watch/icons/arrow_time_no_icon.png"></image> -->
  20. </view>
  21. </view>
  22. <!-- 周 -->
  23. <u-popup :show="show" mode="bottom">
  24. <myWeekPicker :value="value" @change="getWeeks"></myWeekPicker>
  25. </u-popup>
  26. </view>
  27. </template>
  28. <script>
  29. import myWeekPicker from "@/pages_echarts/components/myWeekPicker/myWeekPicker.vue"
  30. import weekjs from '../myWeekPicker/week.js';
  31. export default {
  32. name:"dateTimePicker",
  33. components: {
  34. myWeekPicker
  35. },
  36. props: {
  37. showType: {
  38. type: Boolean,
  39. default: true
  40. },
  41. // 0: yyyy-mm-dd
  42. // 1: yyyy年mm月dd日
  43. formatType: {
  44. type: Number,
  45. default: 0
  46. },
  47. formTab:{
  48. type: Number,
  49. default: 0
  50. },
  51. from: {
  52. type: String,
  53. default: ""
  54. },
  55. tabColor:{
  56. type: String,
  57. default: ""
  58. }
  59. },
  60. data() {
  61. return {
  62. show:false,
  63. tabs: [{
  64. label: '每日',
  65. value: 'day'
  66. },{
  67. label: '每周',
  68. value: 'week'
  69. },{
  70. label: '每月',
  71. value: 'month'
  72. }],
  73. activeTab: 0,
  74. // year、month、day,表示选择器的粒度,默认为 day
  75. fields: 'day',
  76. value: this.utils.timeFormat(),
  77. weekValue: "",
  78. startTime: "",
  79. endTime: ""
  80. }
  81. },
  82. computed: {
  83. _date() {
  84. if(this.formatType == 1 && this.value) {
  85. console.log(this.fields)
  86. if(this.fields == 'month') {
  87. return this.utils.timeFormat(new Date(this.value),'yyyy年mm月')
  88. } else {
  89. return this.utils.timeFormat(new Date(this.value),'yyyy年mm月dd日')
  90. }
  91. } else {
  92. return this.value
  93. }
  94. }
  95. },
  96. created() {
  97. console.log(this.tabColor,'---')
  98. if(this.from == "report") {
  99. this.activeTab = 2
  100. this.fields = 'month'
  101. this.value = this.utils.timeFormat(new Date(), 'yyyy-mm')
  102. } else if(this.from == "sports") {
  103. this.tabs = [{
  104. label: '每日',
  105. value: 'day'
  106. },{
  107. label: '每周',
  108. value: 'week'
  109. }]
  110. }
  111. this.resetTime()
  112. },
  113. mounted(){
  114. if(this.formTab!==null){
  115. var item={
  116. label: '每日',
  117. value: 'day'
  118. }
  119. this.handleTab(item,this.formTab)
  120. }
  121. // this.activeTab=this.formTab
  122. },
  123. methods: {
  124. handleTab(item,index) {
  125. // console.log(index,'zhix')
  126. this.activeTab = index
  127. this.fields = item.value == 'week' ? 'day' : item.value
  128. if(this.activeTab == 0) { // 每日
  129. this.value = this.utils.timeFormat()
  130. } else if(this.activeTab == 1) { // 每周
  131. this.value = this.utils.timeFormat()
  132. } else if(this.activeTab == 2) { // 每月
  133. this.value = this.utils.timeFormat(new Date(), 'yyyy-mm')
  134. }
  135. this.resetTime()
  136. },
  137. bindPickerChange(e) {
  138. this.value = e.detail.value
  139. this.resetTime()
  140. },
  141. handlePrev() {
  142. // 前一天
  143. const yesterday = new Date(this.value).setDate(new Date(this.value).getDate() - 1);
  144. // 前一个月
  145. let day = this.value
  146. if(this.activeTab == 2) {
  147. day = day + '-01'
  148. }
  149. const prevMonths = new Date(day).setMonth(new Date(day).getMonth() - 1);
  150. // 7天前日期
  151. const weekday = new Date(this.value).setDate(new Date(this.value).getDate() - 7);
  152. if(this.activeTab == 0) { // 每日
  153. this.value = this.utils.timeFormat(yesterday)
  154. } else if(this.activeTab == 1) { // 每周
  155. this.value = this.utils.timeFormat(weekday)
  156. } else if(this.activeTab == 2) { // 每月
  157. this.value = this.utils.timeFormat(prevMonths, 'yyyy-mm')
  158. }
  159. this.resetTime()
  160. },
  161. handleNext() {
  162. // 下一天
  163. const yesterday = new Date(this.value).setDate(new Date(this.value).getDate() + 1);
  164. // 下一个月
  165. let day = this.value
  166. if(this.activeTab == 2) {
  167. day = day + '-01'
  168. }
  169. const prevMonths = new Date(day).setMonth(new Date(day).getMonth() + 1);
  170. // 7天后日期
  171. const weekday = new Date(this.value).setDate(new Date(this.value).getDate() + 7);
  172. if(this.activeTab == 0) { // 每日
  173. this.value = this.utils.timeFormat(yesterday)
  174. } else if(this.activeTab == 1) { // 每周
  175. this.value = this.utils.timeFormat(weekday)
  176. } else if(this.activeTab == 2) { // 每月
  177. this.value = this.utils.timeFormat(prevMonths, 'yyyy-mm')
  178. }
  179. this.resetTime()
  180. },
  181. resetTime() {
  182. if(this.activeTab == 0) { // 每日
  183. this.startTime = this.value
  184. this.endTime = this.value + " 23:59:59"
  185. this.$emit("onChange",this.startTime,this.activeTab)
  186. } else if(this.activeTab == 1) { // 每周
  187. let y = this.value.split('-')[0];
  188. let m = this.value.split('-')[1];
  189. let res = weekjs.getWeeksByMonth(y, m,this.value,0);
  190. this.weekValue = res.week.formatVal
  191. this.startTime = this.weekValue.split('至')[0]
  192. this.endTime = this.weekValue.split('至')[1]
  193. this.$emit("onChange",this.startTime+';'+this.endTime,this.activeTab)
  194. } else if(this.activeTab == 2) { // 每月
  195. this.startTime = this.utils.timeFormat(this.value, 'yyyy-mm-dd') + " 00:00:00"
  196. const currentYear = this.value.split('-')[0]
  197. const currentMonth = this.value.split('-')[1]
  198. const lastday = new Date(currentYear, currentMonth, 0)
  199. this.endTime = this.utils.timeFormat(lastday, 'yyyy-mm-dd') + " 23:59:59"
  200. this.$emit("onChange",this.value,this.activeTab)
  201. }
  202. },
  203. getWeeks(res) {
  204. if (res) {
  205. this.value = res.week.val
  206. this.weekValue = res.week.formatVal
  207. this.resetTime()
  208. }
  209. this.show=false
  210. },
  211. openWeek() {
  212. this.show=true
  213. }
  214. }
  215. }
  216. </script>
  217. <style lang="scss" scoped>
  218. @mixin u-flex($flexD, $alignI, $justifyC) {
  219. display: flex;
  220. flex-direction: $flexD;
  221. align-items: $alignI;
  222. justify-content: $justifyC;
  223. }
  224. .pickebox {
  225. font-family: PingFang SC, PingFang SC;
  226. font-weight: 400;
  227. font-size: 30rpx;
  228. color: #333333;
  229. .type-active {
  230. font-weight: 500;
  231. font-size: 30rpx;
  232. color: #FFFFFF;
  233. }
  234. &-typebox {
  235. height: 88rpx;
  236. @include u-flex(row, center, center);
  237. // gap: 16rpx;
  238. view {
  239. width: 124rpx;
  240. height: 64rpx;
  241. margin: 8rpx;
  242. border-radius: 32rpx 32rpx 32rpx 32rpx;
  243. color: #757575;
  244. line-height: 64rpx;
  245. text-align: center;
  246. }
  247. }
  248. &-picker {
  249. height: 88rpx;
  250. margin: 20rpx 0;
  251. @include u-flex(row, center, center);
  252. // gap: 32rpx;
  253. }
  254. &-pickerbtn {
  255. margin: 0 32rpx;
  256. image {
  257. width: 48rpx;
  258. height: 48rpx;
  259. background: #FFFFFF;
  260. border-radius: 50%;
  261. overflow: hidden;
  262. }
  263. }
  264. .next image{
  265. transform: rotateZ(180deg);
  266. }
  267. }
  268. </style>