dootask/resources/assets/js/directives/resize-observer.js
2025-04-14 08:00:02 +08:00

55 lines
1.6 KiB
JavaScript
Vendored
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 尺寸变化监听指令
*
* 用法示例:
* 1. 简单监听: v-resize-observer="handleResize"
* 2. 配置选项: v-resize-observer="{ handler: handleResize, throttle: 200 }"
*
* @param {Function|Object} binding.value - 处理函数或配置选项
* @param {Function} binding.value.handler - 处理回调函数
* @param {Number} binding.value.throttle - 节流时间(毫秒)默认200
*/
import {throttle} from 'lodash';
export default {
inserted(el, binding) {
const handler = typeof binding.value === 'function'
? binding.value
: binding.value?.handler;
if (typeof handler !== 'function') {
// console.warn('[v-resize-observer] 需要提供一个函数作为处理回调');
return;
}
const throttleTime = typeof binding.value === 'object'
? binding.value.throttle || 200
: 200;
el._resizeHandler = throttle(entries => {
const entry = entries[0];
// 传递尺寸信息给回调函数
handler({
width: entry.contentRect.width,
height: entry.contentRect.height,
entry: entry
});
}, throttleTime);
el._resizeObserver = new ResizeObserver(el._resizeHandler);
el._resizeObserver.observe(el);
},
unbind(el) {
if (el._resizeObserver) {
el._resizeObserver.disconnect();
el._resizeObserver = null;
}
if (el._resizeHandler) {
el._resizeHandler.cancel && el._resizeHandler.cancel();
el._resizeHandler = null;
}
}
};