账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Vue子组件中的setInterval定时器无法停止
    42
    0

    1.我在子组件中定义了一个canvas动画,当我显示这个子组件的时候会利用setInterval来呈现出动画效果,可以我发现用clearInterval无法停止动画,请问是什么原因呢?
    2.已经尝试了created,updated,mounted,beforeDestroy时候调用setInterval,发现都不行,
    尝试在组件中加按钮添加click事件来调用setInterval发现无法触发click事件?
    刚接触Vue.js,如果问题问的比较sb,轻喷。
    最后,提前感谢大家!

    //子组件
    <template>
      <div><canvas width="400" height="400" ref="drawing"></canvas></div>
    </template>
    
    <script>
    
        export default {
            mounted(){
                //这里无法停止
                var interval=setInterval(this.drawing,200);
                if(this.width==290){
                //这里不会打印出over,我用v-if隐藏了这个组件后会一直报错, var context=this.$refs.drawing.getContext("2d")这里一直报错,这说明clearInterval一直没起作用
                  console.log("over");
                  clearInterval(interval);
                }
            },
    
            name: "canvas-animation",
            data(){
              return {width:100}
            },
            methods:{
             drawing() {
               var context=this.$refs.drawing.getContext("2d");
               context.fillStyle="#409eff";
               context.fillRect(10,10,this.width,this.width);
               this.width=this.width+10;
             }
    
    
            }
        }
    </script>
    
    <style scoped>
    
    </style>
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 治钤 普通会员 1楼

      在 Vue 中,如果你在一个子组件中使用了 setInterval 定时器,并且发现无法正常停止,通常是因为定时器的引用在每次组件重新渲染时丢失,或者在组件销毁时没有正确清理。

      以下是一个典型的错误示例:

      javascript export default { data() { return { timer: null, }; }, mounted() { this.timer = setInterval(() => { // 执行某些操作... }, 1000); }, beforeDestroy() { // 错误的清除方式:this.timer 清除时可能已经为 null 或新的定时器引用 clearInterval(this.timer); }, };

      要解决这个问题,你需要确保在组件销毁前正确地保存并清理定时器引用:

      javascript export default { data() { return { intervalId: null, }; }, mounted() { this.startTimer(); }, methods: { startTimer() { this.intervalId = setInterval(() => { // 执行某些操作... }, 1000); }, stopTimer() { clearInterval(this.intervalId); }, }, beforeDestroy() { // 在组件销毁前停止定时器 this.stopTimer(); }, };

      这样,在组件销毁之前就会自动调用 stopTimer 方法来清除定时器,避免内存泄漏。同时,使用 intervalId 来保存定时器返回的引用,可以确保无论何时清除都能准确找到对应的定时器。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部