uniapp 子组件内使用定时器无法清除

涉及到的知识点:1.ref绑定在组建上获取组件实例。2.emit逆向传值,不需要点击触发,watch监听即可。

需求:在父页面的子组件定时发送请求,离开父页面就停止,再次进入就开启。

问题:在父页面的子组件内使用定时器进行发送请求,但是无法删除定时器。

试过以下方式:

我走过的弯路介绍,可直接忽略。
1.在子组件使用onShow、onLoad进行开启,使用onHide、onunLoad进行关闭,但是后来发现根本就没进入,失败。查阅资料说是组件内不支持这些。
2.跳转到其他页面就进行关闭定时器,但是这样的结果是离开当前页面后定时器永久性的关闭。
3.后来发现用vue生命周期可以进入,created,mounted,这两个可以进入定时器,但是又有问题了,只能在父组件里面才能关掉定时器,所以只有子传父将定时器计数:timer 传值给父组件,但是又有问题了,定时器关闭之后就永久关闭了,因为组件内使用的是mounted或者created 它们本身就只触发一次,没办法,只能将组件内的方法往外边带。
4.最后想到用ref,最后才成功了。
其实,最简单的办法就是不在组件里用定时器,都在一个页面里写。但是,因为业务需求 组件内容太多,所以没办法。

解决方法: 

1.在子组件内使用vue生命周期mounted或created进行定时发送请求

2.将定时器的计数timer经过逆向传值,传递给父组件,在父组件onHide周期中进行停掉

3.通过ref,在父组件进行获取到子组件身上的方法,在自身的onshow生命周期进行再次开启定时器,并在父组件onHide周期中进行停掉

父组件

<template>
  <ZiCom @child-event="handleChildEvent" ref="ZiCom"></ZiCom>
</template>

<script>
import ZiCom from "./compoment/ZiCom.vue";
export default {
  components: {
    ZiCom,
  },
  data() {
    return {
      timer: "",
      childMessage: "",
    };
  },
  onUnload() {
    uni.$off("onSuccess");
  },
  onShow() {
    // 首次执行
    this.$refs.ZiCom.getServerData();
    // 设置延迟定时器,从第二次开始正常延迟执行
    this.timer = setInterval(() => {
      this.$refs.ZiCom.getServerData();
    }, 60000);
    this.$emit("child-event", this.timer);
  },
  onHide() {
    clearInterval(this.childMessage);//清除子组件的
    clearInterval(this.timer);//清除本页面的
  },
  methods: {
    handleChildEvent(message) {
      this.childMessage = message;
    },
  },
};
</script>

子组件

<script>
export default {
  data() {
    return {
      timer: null,
    };
  },
  watch: {
    timer(newValue) {
      this.$emit("child-event", newValue);
    },
  },
  mounted() {
    // 首次执行
    this.getServerData();
    // 设置延迟定时器,从第二次开始正常延迟执行(此页面所有timer都是这个timer,为了清除定时器而使用的)
    this.timer = setInterval(() => {
      this.getServerData();
    }, 3000);
    this.$emit("child-event", this.timer);
  },
  methods: {
    getServerData() {
      //发送请求...
    },
  },
};
</script>
方案二:在父组件里写一个倒计时定时器

父组件

<template>
  <ZiCom  ref="ZiCom"></ZiCom>
</template>

<script>
import ZiCom from "./compoment/ZiCom.vue";
export default {
  components: {
    ZiCom,
  },
  data() {
    return {
      timer: "",
      childMessage: "",
    };
  },
  onUnload() {
    uni.$off("onSuccess");
  },
  onShow() {
setTimeout(()=>{
    // 首次执行
    this.$refs.ZiCom.getServerData();
    // 设置延迟定时器,从第二次开始正常延迟执行
    this.timer = setInterval(() => {
      this.$refs.ZiCom.getServerData();
    }, 60000);
},3000)
  },
  onHide() {
    clearInterval(this.timer);//清除本页面的
  },
};
</script>

 子组件

<script>
export default {
  data() {
    return {
      timer: null,
    };
  },
  methods: {
    getServerData() {
      //发送请求...
    },
  },
};
</script>

可能解决方案不是最简洁的,欢迎大家留言补充! 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: UniApp 组件的生命周期是指在组件创建、运行、销毁的过程中会触发的事件。 主要有以下几个阶段: - 初始化阶段: - created: 组件实例刚刚被创建出来, 但是组件的模板并没有被编译, 此时还没有 dom, 也不能访问组件实例的 $el 属性。 - beforeMount: 组件的模板已经被编译并挂载到了 dom 上, 但是数据还未初始化。 - mounted: 组件已经被挂载到了 dom 上, 可以访问组件实例的 $el 属性, 此时组件的数据也已经初始化完成。 - 运行阶段: - beforeUpdate: 组件的数据更新前调用, 可以在此时做一些数据的比较, 只要数据有变化就会调用此钩函数。 - updated: 组件的数据更新后调用, 也可以在此时做一些数据的比较, 只要数据有变化就会调用此钩函数。 - 销毁阶段: - beforeDestroy: 组件实例销毁前调用, 可以在此时做一些清理工作。 - destroyed: 组件实例已经销毁, 此时组件实例的所有绑定和监听都已经解除, 模板内部的指令也已经解除。 ### 回答2: uniapp组件生命周期包括:创建、挂载、更新和销毁四个阶段。 1. 创建阶段:在组件被创建时,会触发created生命周期钩函数。在这个阶段,组件的实例被创建,但还没有挂载到页面上,因此无法访问页面的DOM元素。 2. 挂载阶段:在组件被挂载到页面上时,会触发mounted生命周期钩函数。在这个阶段,组件的实例已经被挂载到页面上,可以访问页面的DOM元素,并且可以进行网络请求和数据初始化等操作。 3. 更新阶段:在组件的数据发生变化时,会触发updated生命周期钩函数。在这个阶段,组件会重新渲染,并且可以重新获取数据并更新页面。 4. 销毁阶段:在组件被销毁时,会触发destroyed生命周期钩函数。在这个阶段,组件会被彻底销毁,所有的事件监听和定时器都会被清除,释放内存。 在这四个阶段中,我们可以利用生命周期钩函数来执行一些必要的操作。例如,在created钩函数中可以进行数据初始化,在mounted钩函数中可以进行网络请求,在updated钩函数中可以检测数据变化并进行相应的处理,在destroyed钩函数中可以清除事件监听和定时器,以提高应用的性能和稳定性。同时,uniapp还提供了其他的生命周期钩函数,如beforeCreate、beforeMount、beforeUpdate等,可以根据实际需求选择合适的钩函数来处理相关逻辑。 ### 回答3: uniapp组件生命周期包含了创建、更新和销毁三个阶段。 1. 创建阶段: 在组件被创建时,首先会执行created生命周期钩函数。在此阶段,可以进行组件的一些初始化操作,例如加载数据、注册事件等。 接着执行beforeMount生命周期钩函数,此时组件已经被挂载,但尚未渲染到页面上。在这个阶段,可以进行一些与DOM相关的操作。 最后执行mounted生命周期钩函数,此时组件已经被渲染到页面上。在这个阶段,可以进行一些与DOM相关的操作,例如获取DOM节点、绑定事件等。 2. 更新阶段: 当组件的数据发生变化时,会执行beforeUpdate生命周期钩函数。在这个阶段,可以对组件进行一些更新操作,例如重新获取数据、更新DOM等。 接着执行updated生命周期钩函数,此时组件已经完成更新。在这个阶段,可以进行一些与DOM相关的操作,例如获取DOM节点、绑定事件等。 3. 销毁阶段: 当组件被销毁时,会执行beforeDestroy生命周期钩函数。在这个阶段,可以进行一些清理工作,例如取消事件监听、清除定时器等。 最后执行destroyed生命周期钩函数,此时组件已经被完全销毁,不再可用。 总结:uniapp组件生命周期包括了创建、更新和销毁三个阶段,通过钩函数可以在不同阶段进行相关操作。合理地利用组件生命周期函数,可以更好地控制组件的行为和状态,提升页面性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值