vue封装倒计时组件

秒速五厘米 2023-07-11 12:50 108阅读 0赞

只暴露了button的样式和自定义事件handleClick,其他的如:倒计时秒数、倒计时前和倒计时中的文字可在源码中直接修改:

效果如下:

20200305210338514.png 20200305210314508.png

  1. <template>
  2. <div>
  3. <button :style="buttonStyle" @click="click" :disabled="init.status">
  4. {
  5. { init.time }}
  6. <span v-if="init.status">s</span> {
  7. {init.text}}
  8. </button>
  9. </div>
  10. </template>
  11. <script>
  12. const SENDTEXT = '已发送验证码'
  13. const GETTEXT = '获取验证码'
  14. const TIME = 60
  15. const initData = {
  16. text: GETTEXT,
  17. time: null, // 秒数
  18. count: TIME,
  19. status: false
  20. }
  21. export default {
  22. name:'countDown',
  23. props: {
  24. buttonStyle: {
  25. type: Object,
  26. default() {
  27. return {}
  28. }
  29. }
  30. },
  31. data(){
  32. return {
  33. init: Object.assign({}, initData), // 这样写为了初始化方便,因为下边到0秒之后也要次初始化
  34. timer: null, // 定时器标识
  35. }
  36. },
  37. methods: {
  38. click() {
  39. this.runTime()
  40. this.$emit('handleClick')
  41. },
  42. runTime() {
  43. this.init.status = true
  44. this.init.text = SENDTEXT
  45. // 下边操作的意思是:当点击按钮时,会立即出现倒计时的秒数,如果不加,
  46. // GETTEXT已经渲染出来了,但是倒计时的秒数需等到下边异步函数执
  47. // 行的时候才能出现, 这样用户体验很差
  48. this.init.time = this.init.count
  49. this.timer = setInterval(() => {
  50. this.init.time = -- this.init.count
  51. if(this.init.time === 0) { // 等于0时,再次初始化数据,清除定时器
  52. this.init = Object.assign({}, initData)
  53. clearInterval(this.timer)
  54. }
  55. }, 1000)
  56. }
  57. }
  58. }
  59. </script>

发表评论

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

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

相关阅读