uni-app鸿蒙下页面内计时器无法清除

发布于 1周前 作者 nodeper 来自 uni-app

uni-app鸿蒙下页面内计时器无法清除

页面内的setInterval无法被clearInterval清除

问题描述

页面内的setInterval无法被clearInterval清除

10 回复

使用哪个版本的 hbuilderx ?这个问题应该修复过一次,你可以更新到最新版看看

更多关于uni-app鸿蒙下页面内计时器无法清除的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


4.43的alpha版本

我刚刚升级到4.45了也还是有这个问题

回复 1***@qq.com: 提供一下一个可以复现的代码看看

回复 DCloud_UNI_yuhe:

let i = 1; that.timesst=setInterval(()=>{ console.log(i) i++ if(i>10){ clearInterval(that.timesst) } },1000)

就这段放到onLoad里面试就行,i会一直打印停不下来

回复 1***@qq.com: 你 harmony-configs 下有什么文件吗,可能会存在使用旧版的情况?建议新建一个项目测试,如果能够复现请把项目发一下

经排查,用户在 oh-package 中,使用 uni-app-runtime 版本为 2.3.7,更新之后问题解决

在uni-app鸿蒙平台下,如果页面内的计时器无法清除,通常是由于计时器的引用丢失或清除计时器的调用时机不正确导致的。下面提供一个完整的代码示例,展示如何在uni-app中正确创建和清除计时器。

示例代码

1. 创建页面 index.vue

<template>
  <view>
    <button @click="startTimer">Start Timer</button>
    <button @click="stopTimer">Stop Timer</button>
    <text>{{ count }}</text>
  </view>
</template>

<script>
export default {
  data() {
    return {
      count: 0,
      timer: null, // 用于存储计时器引用
    };
  },
  methods: {
    startTimer() {
      if (this.timer) {
        console.warn('Timer is already running');
        return;
      }
      // 创建计时器,每秒更新一次count
      this.timer = setInterval(() => {
        this.count++;
      }, 1000);
    },
    stopTimer() {
      if (this.timer) {
        clearInterval(this.timer); // 清除计时器
        this.timer = null; // 重置计时器引用
      } else {
        console.warn('No timer is running');
      }
    },
  },
  onUnload() {
    // 页面卸载时自动清除计时器,防止内存泄漏
    this.stopTimer();
  },
};
</script>

<style scoped>
button {
  margin: 10px;
}
text {
  display: block;
  margin-top: 20px;
  font-size: 20px;
}
</style>

2. 关键点解释

  • data 中定义了 count 用于显示计时器的计数,以及 timer 用于存储计时器的引用。
  • startTimer 方法检查是否已经存在一个计时器,如果不存在则创建一个新的计时器,每秒更新一次 count
  • stopTimer 方法检查 timer 是否存在,如果存在则使用 clearInterval 清除计时器,并将 timer 设置为 null 以避免潜在的内存泄漏。
  • onUnload 生命周期钩子在页面卸载时自动调用 stopTimer 方法,确保页面销毁时计时器也被清除。

确保在鸿蒙平台上运行uni-app时,页面的生命周期管理正确,且计时器的引用在组件的生命周期内始终有效。如果问题依旧存在,建议检查是否有其他异步操作或页面跳转逻辑干扰了计时器的清除过程。

回到顶部