Vue 中使用 @hook 和 hook:生命周期

本文探讨了在Vue组件中正确管理定时器的方法,强调了在`mounted`和`beforeDestroy`钩子中设置和清除定时器的重要性。同时,提出了一种通过监听`hook:beforeDestroy`事件来简化清理逻辑的方案,并展示了如何通过`@hook`监听子组件的生命周期。这种做法有助于确保定时器的正确关闭,防止内存泄漏,并保持代码的整洁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 如果我们在页面中使用定时器, 大概率的思路如下, 在 mounted 中开启定时器并且在 beforeDestroy 中销毁定时器.(具体写在哪个生命周期钩子不是这里讨论的重点😀)
    • <h1>{{count}}</h1>
      
    • export default {
        name: "Student",
        data() {
          return {
            count: 0
          };
        },
        mounted() {
          this.intervalId = setInterval(() => {
            this.count++;
          }, 1000);
        },
        beforeDestroy() {
          clearInterval(this.intervalId);
          this.intervalId = null;
        }
      };
      
    • 上面的代码导致了两个问题
      • 首先, 在 this 上保存定时器 id, 最好的情况是只有生命周期钩子可以访问到它.
      • 创建定时器的代码和清除定时器的代码互相独立, 很难程序化的清理要建立的所有东西.
  2. 可以通过程序化的侦听器解决这个问题
    • export default {
        name: "Student",
        data() {
          return {
            count: 0
          };
        },
        mounted() {
          let intervalId = setInterval(() => {
            this.count++;
          }, 1000);
      
          this.$once('hook:beforeDestroy', () => {
            console.log('---beforeDestroy---');
            clearInterval(intervalId);
            intervalId = null;
          })
        },
      };
      
    • 通过侦听 hook:beforeDestroy 事件, 省略了保存 intervalId 同时将注册和清理逻辑放在了一起.
  3. 除此之外呢, @hook 可以监听子组件的生命周期. 虽然我们都知道子组件和父组件的生命周期存在某种先后关系, 但是了解 @hook 也是实现另一种方式
    • 子组件
      • <h3>Son</h3>
        
      • export default {
          mounted() {
            console.log('Son---mounted');
          }
        }
        
    • 父组件
      • 使用 @hook:mounted 注册自定义事件.
      • <div>
          <h2>Father</h2>
          <Son @hook:mounted="childMountHandler"></Son>
        </div>
        
      • import Son from './Son.vue'
        
        export default {
          components: { Son },
          mounted() {
            console.log('Father---mounted');
          },
          methods: {
            childMountHandler() {
              console.log('Oops, son mounted');
            }
          }
        }
        
      • 来看执行顺序 子mounted -> 父hook:mounted -> 父mounted
      • 在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值