2023-03-17 11:59:52 +08:00

28 lines
804 B
TypeScript

import { Directive, type DirectiveBinding, type VNode } from 'vue'
import elementResizeDetectorMaker from 'element-resize-detector'
import type { Erd } from 'element-resize-detector'
import { emitter } from '@/utils/mitt'
const erd: Erd = elementResizeDetectorMaker({
strategy: 'scroll'
})
export const resize: Directive = {
mounted(el: HTMLElement, binding?: DirectiveBinding, vnode?: VNode) {
erd.listenTo(el, elem => {
const width = elem.offsetWidth
const height = elem.offsetHeight
if (binding?.instance) {
emitter.emit('resize', { detail: { width, height } })
} else {
vnode.el.dispatchEvent(
new CustomEvent('resize', { detail: { width, height } })
)
}
})
},
unmounted(el: HTMLElement) {
erd.uninstall(el)
}
}