vue定时计时

这篇博客详细介绍了如何使用JavaScript编写一个倒计时功能。通过计算结束时间与当前时间的差值,动态更新天数、小时数、分钟数和秒数。在每一秒过去后,函数递归调用自身以实现连续的倒计时显示。
    countdown() {
      // 做判断当倒计时结束时都为0
      if (new Date().getTime() >= this.endTime) {
        this.d = '00'
        this.h = '00'
        this.m = '00'
        this.s = '00'
        return
      }
      // 用结束时间减去当前时间获得倒计时时间戳
      const msec = this.endTime - new Date().getTime()
      const d = parseInt(msec / 1000 / 60 / 60 / 24) // 算出天数
      const h = parseInt(msec / 1000 / 60 / 60 % 24)// 算出小时数
      const m = parseInt(msec / 1000 / 60 % 60)// 算出分钟数
      const s = parseInt(msec / 1000 % 60)// 算出秒数
      // 给数据赋值
      this.d = d
      this.h = h > 9 ? h : '0' + h
      this.m = m > 9 ? m : '0' + m
      this.s = s > 9 ? s : '0' + s
      // 定义this指向
      const that = this
      // 使用定时器 然后使用递归 让每一次函数能调用自己达到倒计时效果
      setTimeout(function() {
        that.countdown()
        console.log('aaaa')
      }, 1000)
    },
<think> 我们参考了多个关于Vue定时任务的引用,总结出以下几种常见的实现方法: 1. 使用setInterval/setTimeout并在组件销毁前手动清除定时器 2. 使用Vue生命周期钩子配合$once事件监听器自动清除定时器 3. 封装工具类(如IntervalUtil)来管理定时任务 4. 在特定场景下(如短信验证码倒计时)的定时任务实现 根据引用[1]和[2],在Vue组件中实现定时任务的基本步骤: - 在mounted(或created)生命周期钩子中设置定时器 - 在定时器回调中执行需要的任务 - 在组件销毁前(beforeDestroy或beforeUnmount)清除定时器,避免内存泄漏 下面分别介绍两种主要方法: 方法一:手动清除定时器(引用[2]示例) ```javascript export default { data() { return { timer: null } }, methods: { intervalMethod() { // 需要定时执行的方法 } }, mounted() { // 每5秒执行一次 this.timer = setInterval(() => { this.intervalMethod(); }, 5000); }, beforeDestroy() { // 组件销毁前清除定时器 clearInterval(this.timer); } } ``` 方法二:使用$once监听生命周期事件(引用[1]示例) ```javascript mounted() { const timer = setInterval(() => { this.qryGridData("1"); // 执行任务,可传参 }, 2000); // 每2秒执行一次 // 通过$once监听beforeDestroy钩子,自动清除定时器 this.$once('hook:beforeDestroy', () => { clearInterval(timer); }); } ``` 另外,引用[4]展示了一个短信验证码倒计时的具体场景: ```javascript sms() { this.axios.post("/user/sendcode", { Mobile: this.mobile }).then((resp) => { if (resp.data.code == 200) { let t = setInterval(() => { if (this.time == 0) { this.msg = "发送验证码"; this.status = false; this.time = 20; // 重置时间 clearInterval(t); } else { this.msg = this.time + '秒'; this.time--; this.status = true; } }, 1000); } }); } ``` 对于更复杂的动态定时任务(如预约提醒),引用[5]提到需要结合后端(SpringBoot)实现,前端主要负责展示和触发。 因此,在Vue中实现定时任务的关键点: - 使用setInterval或setTimeout - 在合适的生命周期中设置和清除定时器 - 注意内存泄漏问题,务必清除不再需要的定时器 建议:对于简单的定时任务,使用方法一或二即可;对于需要动态管理多个定时任务的场景,可以考虑封装工具类(引用[2]中提到的IntervalUtil)来统一管理。 注意:Vue3中使用Composition API时,可以使用onMounted和onUnmounted生命周期钩子,逻辑类似。 示例(Vue3 Composition API): ```javascript import { onMounted, onUnmounted } from 'vue'; export default { setup() { let timer = null; const intervalMethod = () => { // 需要执行的函数 }; onMounted(() => { timer = setInterval(intervalMethod, 5000); }); onUnmounted(() => { clearInterval(timer); }); } } ``` 或者使用Vue3的setup语法糖: ```javascript <script setup> import { onMounted, onUnmounted } from 'vue'; let timer = null; const intervalMethod = () => { ... }; onMounted(() => { timer = setInterval(intervalMethod, 5000); }); onUnmounted(() => { clearInterval(timer); }); </script> ``` 以上是在Vue中实现定时任务的主要方法,根据具体场景选择合适的方式[^1][^2][^4]。 </think> 在 Vue 中实现定时任务主要使用 JavaScript 原生的 `setInterval()` 或 `setTimeout()` 方法,结合 Vue 的生命周期钩子管理定时器的创建和销毁,避免内存泄漏。以下是具体实现方法和注意事项: ### 一、基础实现方式 ```javascript export default { data() { return { timer: null, // 存储定时器实例 time: 60, // 倒计时场景使用 } }, mounted() { // 创建定时任务:每2秒执行一次 this.timer = setInterval(() => { this.executeTask() // 自定义任务方法 }, 2000) }, beforeDestroy() { // 必须销毁定时器! clearInterval(this.timer) }, methods: { executeTask() { // 业务逻辑(如数据刷新、状态更新) console.log("定时任务执行中...") } } } ``` ### 二、优化方案(推荐) 通过 `$once` 自动绑定销毁逻辑,避免忘记清理: ```javascript mounted() { const timer = setInterval(() => { this.qryGridData() // 执行任务方法 }, 2000) // 组件销毁时自动清除定时器 this.$once('hook:beforeDestroy', () => { clearInterval(timer) }) } ``` ### 三、常见场景实现 1. **短信验证码倒计时**(参考引用[4]) ```javascript methods: { sendSMS() { this.timer = setInterval(() => { if (this.time <= 0) { clearInterval(this.timer) this.msg = "重新发送" this.time = 60 // 重置时间 this.status = false } else { this.time-- this.msg = `${this.time}秒后重试` this.status = true } }, 1000) } } ``` 2. **轮询数据更新**(参考引用[1][3]) ```javascript mounted() { this.timer = setInterval(() => { this.fetchData() // API请求方法 }, 5000) // 每5秒请求数据 } ``` ### 四、关键注意事项 1. **定时器销毁** - 必须通过 `clearInterval()` / `clearTimeout()` 在 `beforeDestroy`(Vue2)或 `onUnmounted`(Vue3)中销毁 - 未销毁的定时器会导致内存泄漏和重复执行 2. **执行间隔** - `setInterval(func, delay)` 中 `delay` 单位是毫秒(1000ms = 1秒) - 实时性要求高的场景建议配合 WebSocket 3. **动态定时任务** - 复杂场景(如预约提醒)需结合后端实现(参考引用[5]) - 前端仅负责倒计时触发,核心逻辑应在后端完成 ### 五、Vue3 组合式API写法 ```javascript import { onMounted, onUnmounted } from 'vue' setup() { let timer = null onMounted(() => { timer = setInterval(executeTask, 1000) }) onUnmounted(() => { clearInterval(timer) }) const executeTask = () => { /* 任务逻辑 */ } } ``` > **最佳实践**:对于需要持久化的定时任务(如后台数据同步),推荐通过 WebSocket 或 SSE(Server-Sent Events)实现,而非前端轮询,以减少不必要的网络请求[^1][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值