app-diy-timer.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <template>
  2. <view class="app-timer">
  3. <app-jump-button form :url="link.url" :open_type="link.openType" arrangement="column">
  4. <view v-if="picUrl">
  5. <app-image :img-src="picUrl" mode="widthFix" width="750rpx" height="auto"></app-image>
  6. </view>
  7. <view :style="{'background-image': `url(${bgPicUrl ? bgPicUrl : '../../../static/image/icon/icon-timer-bg.png'})`}"
  8. class="timer dir-top-nowrap main-center"
  9. v-if="timerStr">
  10. <view class="timer-txt" v-if="startTime">距离开始</view>
  11. <view class="timer-txt" v-if="startTime === null && endTime">距离结束</view>
  12. <view class="timer-txt" v-if="startTime === null && endTime === null">活动已结束</view>
  13. <view class="timer-item">
  14. <block v-for="(item,index) in timerStr" :key="index">
  15. {{index?':':''}}
  16. <view class="item" v-if="item">{{item}}</view>
  17. </block>
  18. </view>
  19. <view class="timer-more" v-if="link.url.length">
  20. 查看更多
  21. <image src="../../../static/image/icon/arrow-right-white.png"></image>
  22. </view>
  23. </view>
  24. </app-jump-button>
  25. </view>
  26. </template>
  27. <script>
  28. export default {
  29. name: "app-timer",
  30. props: {
  31. picUrl: String,
  32. link: Object,
  33. startDateTime: {
  34. type: String,
  35. default() {
  36. return '2019-8-30 10:00:00';
  37. }
  38. },
  39. endDateTime: {
  40. type: String,
  41. default() {
  42. return '2019-8-30 10:00:00';
  43. }
  44. },
  45. pageHide: Boolean,
  46. bgPicUrl: String,
  47. },
  48. data() {
  49. return {
  50. timeInterval: null,
  51. startTime: null,
  52. endTime: null,
  53. timerStr: []
  54. };
  55. },
  56. computed: {
  57. time() {
  58. return {
  59. startDateTime: this.startDateTime,
  60. endDateTime: this.endDateTime,
  61. pageHide: this.pageHide,
  62. };
  63. }
  64. },
  65. methods:{
  66. setStyle(val){
  67. return `<view class="item">${val}</view>`
  68. }
  69. },
  70. beforeDestroy() {
  71. clearInterval(this.timeInterval);
  72. },
  73. watch: {
  74. time: {
  75. handler() {
  76. if (this.pageHide) {
  77. clearInterval(this.timeInterval);
  78. return ;
  79. }
  80. let startDateTime = this.startDateTime;
  81. let endDateTime = this.endDateTime;
  82. this.timeInterval = setInterval(() => {
  83. let startTime = null, endTime = null, timerStr = [];
  84. if (startDateTime) {
  85. startDateTime = startDateTime.replace(/-/g, '/');
  86. startTime = this.$utils.timeDifference(new Date().getTime(), new Date(startDateTime).getTime());
  87. if (startTime) {
  88. let day = startTime['d'] > 0 ? startTime['d'] + '天' : '';
  89. if(day) timerStr.push(day)
  90. timerStr.push(startTime['h'])
  91. timerStr.push(startTime['m'])
  92. timerStr.push(startTime['s'])
  93. }
  94. }
  95. if (endDateTime && !timerStr.length) {
  96. endDateTime = endDateTime.replace(/-/g, '/');
  97. endTime = this.$utils.timeDifference(new Date().getTime(), new Date(endDateTime).getTime());
  98. if (endTime) {
  99. let day = endTime['d'] > 0 ? endTime['d'] + '天' : '';
  100. if(day) timerStr.push(day)
  101. timerStr.push(endTime['h'])
  102. timerStr.push(endTime['m'])
  103. timerStr.push(endTime['s'])
  104. }
  105. }
  106. this.startTime = startTime;
  107. this.endTime = endTime;
  108. this.timerStr = timerStr;
  109. }, 1000);
  110. },
  111. immediate: true
  112. }
  113. }
  114. }
  115. </script>
  116. <style scoped lang="scss">
  117. .timer {
  118. width: 745rpx;
  119. height: #{80rpx};
  120. padding: #{24rpx};
  121. font-size: $uni-font-size-general-one;
  122. color: #ffffff;
  123. background-repeat: no-repeat;
  124. background-size: 100% 100%;
  125. background-position: center;
  126. border-top-left-radius: 30rpx;
  127. border-top-right-radius: 30rpx;
  128. display: flex;
  129. justify-content: start;
  130. align-items: center;
  131. flex-direction: row;
  132. margin: 0 auto;
  133. &.new-timer-bg{
  134. background-image:none !important;
  135. }
  136. .timer-txt{
  137. margin-right: 10rpx;
  138. }
  139. .timer-item{
  140. display: flex;
  141. align-items: center;
  142. flex: 1;
  143. .item{
  144. background: #000;
  145. color: #ffffff;
  146. padding: 0 6rpx;
  147. border-radius: 10rpx;
  148. text-align: center;
  149. margin: 0 8rpx;
  150. }
  151. }
  152. .timer-more{
  153. width: 130rpx;
  154. image{
  155. width: 14rpx;
  156. height: 20rpx;
  157. margin-left: 5rpx;
  158. }
  159. }
  160. }
  161. </style>