vue3 如何监听生命周期钩子?

vue2 可中轻松监听生命钩子:

  mounted() {
    const onResize = () => {
      console.log('onResize')
    }
    window.addEventListener('resize', onResize)
    // hook:liefHook
    this.$once('hook:beforeDestroy', () => {
      window.removeEventListener('resize', onResize)
    })
  }

vue3 我也希望使用这种语法,vue3 不再支持 this.$once,根据 vue3 中event bus

import { event } from '@utils'
onMounted(() => {
  console.log('vue3 mounted')
  function onResize() {
    console.log('onResize')
  }
  window.addEventListener('resize', onResize)
  event.once('vnode-before-unmount', () => {
    console.log('vnode-before-unmount')
    removeEventListener('resize', onResize)
  })
})

event 的定义:

import emitter from 'tiny-emitter/instance'

export const event = {
  emit: (...args) => emitter.emit(...args),
  on: (...args) => emitter.on(...args),
  off: (...args) => emitter.off(...args),
  once: (...args) => emitter.once(...args),
}

组件销毁时,不会执行event.once的回调。

在组件上监听生命周期:

<DemoV2 @vnode-mounted="mounted" @vnode-before-unmount="beforeUnmount" />

正常的。

请问为何event.once不生效?

阅读 6.7k
3 个回答

你可能没明白组合式api / hooks的真正用法

这种情况也不需要once

// 封装
function useResize(onResize) {
  onMounted(() => {
    window.addEventListener('resize', onResize)
  })
  onBeforeUnmount(() => {
    window.removeEventListener('resize', onResize)
  })
}

// 使用
useResize(() => {
    console.log('onResize')
})

vue3 已经移除了这个了,文档上详细有介绍

因为vue3可以直接这么写了

window.addEventListener("resize", onResize);
            onBeforeUnmount(() => {
                window.removeEventListener("resize", onResize);
            });
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏