vue 活动倒计时组件

一时失言乱红尘 2021-09-17 04:22 648阅读 0赞

1. 这是倒计时封装好的组件 这里我们命名 countdown.vue

  1. <template>
  2. <div>
  3. <p v-if="msTime.show">
  4. <span v-if="tipShow" class="no-bg">{
  5. {tipText}}:</span>
  6. <span v-if="!tipShow" class="no-bg">{
  7. {tipTextEnd}}:</span>
  8. <span v-if="msTime.day>0" class="no-bg">
  9. <span>{
  10. {msTime.day}}</span>
  11. <i>{
  12. {dayTxt}}</i>
  13. </span>
  14. <span>{
  15. {msTime.hour}}</span><i>{
  16. {hourTxt}}</i>
  17. <span>{
  18. {msTime.minutes}}</span><i>{
  19. {minutesTxt}}</i>
  20. <span>{
  21. {msTime.seconds}}</span><i>{
  22. {secondsTxt}}</i>
  23. </p>
  24. <p v-if="!msTime.show">{
  25. {endText}}</p>
  26. </div>
  27. </template>
  28. <script>
  29. export default {
  30. replace: true,
  31. data() {
  32. return {
  33. tipShow: true,
  34. msTime: {
  35. //倒计时数值
  36. show: false, //倒计时状态
  37. day: "", //天
  38. hour: "", //小时
  39. minutes: "", //分钟
  40. seconds: "" //秒
  41. },
  42. star: "", //活动开始时间
  43. end: "", //活动结束时间
  44. current: "" //当前时间
  45. };
  46. },
  47. watch: {
  48. currentTime: function(val, oldval) {
  49. this.gogogo();
  50. }
  51. },
  52. props: {
  53. //距离开始提示文字
  54. tipText: {
  55. type: String,
  56. default: "距离开始"
  57. },
  58. //距离结束提示文字
  59. tipTextEnd: {
  60. type: String,
  61. default: "距离结束"
  62. },
  63. //时间控件ID
  64. id: {
  65. type: String,
  66. default: "1"
  67. },
  68. //当前时间
  69. currentTime: {
  70. type: Number
  71. },
  72. // 活动开始时间
  73. startTime: {
  74. type: Number
  75. },
  76. // 活动结束时间
  77. endTime: {
  78. type: Number
  79. },
  80. // 倒计时结束显示文本
  81. endText: {
  82. type: String,
  83. default: "已结束"
  84. },
  85. //自定义显示文字:天
  86. dayTxt: {
  87. type: String,
  88. default: ":"
  89. },
  90. //自定义显示文字:时
  91. hourTxt: {
  92. type: String,
  93. default: ":"
  94. },
  95. //自定义显示文字:分
  96. minutesTxt: {
  97. type: String,
  98. default: ":"
  99. },
  100. secondsTxt: {
  101. type: String,
  102. default: ":"
  103. },
  104. //是否开启秒表倒计,未完成
  105. secondsFixed: {
  106. type: Boolean,
  107. default: false
  108. }
  109. },
  110. created() {
  111. // this.gogogo();
  112. },
  113. mounted() {
  114. // console.log(this);
  115. this.gogogo();
  116. },
  117. methods: {
  118. gogogo: function() {
  119. //判断是秒还是毫秒
  120. this.startTime.toString().length === 10 ? (this.star = this.startTime * 1000) : (this.star = this.startTime);
  121. this.endTime.toString().length === 10 ? (this.end = this.endTime * 1000) : (this.end = this.endTime);
  122. if (this.currentTime) {
  123. this.currentTime.toString().length === 10
  124. ? (this.current = this.currentTime * 1000)
  125. : (this.current = this.currentTime);
  126. console.log('this.currentTime',this.currentTime)
  127. } else {
  128. this.current = new Date().getTime();
  129. }
  130. if (this.end < this.current) {
  131. /**
  132. * 结束时间小于当前时间 活动已结束
  133. */
  134. this.msTime.show = false;
  135. this.end_message();
  136. } else if (this.current < this.star) {
  137. /**
  138. * 当前时间小于开始时间 活动尚未开始
  139. */
  140. this.$set(this, "tipShow", true);
  141. setTimeout(() => {
  142. this.runTime(this.star, this.current, this.start_message);
  143. }, 1);
  144. } else if (
  145. (this.end > this.current && this.star < this.current) ||
  146. this.star == this.current
  147. ) {
  148. /**
  149. * 结束时间大于当前并且开始时间小于当前时间,执行活动开始倒计时
  150. */
  151. this.$set(this, "tipShow", false);
  152. this.msTime.show = true;
  153. this.$emit("start_callback", this.msTime.show);
  154. setTimeout(() => {
  155. this.runTime(
  156. this.end,
  157. this.current,
  158. this.end_message,
  159. true
  160. );
  161. }, 1);
  162. }
  163. },
  164. runTime(startTime, endTime, callFun, type) {
  165. let msTime = this.msTime;
  166. let timeDistance = startTime - endTime;
  167. if (timeDistance > 0) {
  168. this.msTime.show = true;
  169. msTime.day = Math.floor(timeDistance / 86400000);
  170. timeDistance -= msTime.day * 86400000;
  171. msTime.hour = Math.floor(timeDistance / 3600000);
  172. timeDistance -= msTime.hour * 3600000;
  173. msTime.minutes = Math.floor(timeDistance / 60000);
  174. timeDistance -= msTime.minutes * 60000;
  175. //是否开启秒表倒计,未完成
  176. // this.secondsFixed ? msTime.seconds = new Number(timeDistance / 1000).toFixed(2) : msTime.seconds = Math.floor( timeDistance / 1000 ).toFixed(0);
  177. msTime.seconds = Math.floor(timeDistance / 1000).toFixed(0);
  178. timeDistance -= msTime.seconds * 1000;
  179. if (msTime.hour < 10) {
  180. msTime.hour = "0" + msTime.hour;
  181. }
  182. if (msTime.minutes < 10) {
  183. msTime.minutes = "0" + msTime.minutes;
  184. }
  185. if (msTime.seconds < 10) {
  186. msTime.seconds = "0" + msTime.seconds;
  187. }
  188. let _s = Date.now();
  189. let _e = Date.now();
  190. let diffPerFunc = _e - _s;
  191. setTimeout(() => {
  192. if (type) {
  193. this.runTime(
  194. this.end,
  195. (endTime += 1000),
  196. callFun,
  197. true
  198. );
  199. } else {
  200. this.runTime(this.star, (endTime += 1000), callFun);
  201. }
  202. }, 1000 - diffPerFunc);
  203. } else {
  204. callFun();
  205. }
  206. },
  207. start_message() {
  208. this.$set(this, "tipShow", false);
  209. this.$emit("start_callback", this.msTime.show);
  210. setTimeout(() => {
  211. this.runTime(this.end, this.star, this.end_message, true);
  212. }, 1);
  213. },
  214. end_message() {
  215. this.msTime.show = false;
  216. if (this.currentTime <= 0) {
  217. return;
  218. }
  219. this.$emit("end_callback", this.msTime.show);
  220. }
  221. }
  222. };
  223. </script>

2. 全局引入或者局部引入注册组件

  1. import countdown from '@/components/countdown'
  2. export default {
  3. countdown
  4. }

3. 使用

  1. <countdown
  2. v-if="this.info.length !== 0"
  3. v-on:start_callback="countDownS_cb(1)" // 活动开始时的回调函数
  4. v-on:end_callback="countDownE_cb(1)" // 活动结束时的回调
  5. :currentTime="Number(info.currentTime)" // 当前的时间戳
  6. :startTime="Number(info.startDate)" // 活动开始时间戳
  7. :endTime="Number(info.endDate)" // 活动结束时间戳
  8. :tipText="'活动开始倒计时'"
  9. :tipTextEnd="'活动结束倒计时'"
  10. :endText="'活动已结束'"
  11. :dayTxt="'天'"
  12. :hourTxt="'时'"
  13. :minutesTxt="'分'"
  14. :secondsTxt="'秒'"
  15. ></countdown>

发表评论

表情:
评论列表 (有 0 条评论,648人围观)

还没有评论,来说两句吧...

相关阅读