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

55 lines
1.6 KiB
JavaScript
Vendored

/**
* 尺寸变化监听指令
*
* 用法示例:
* 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;
}
}
};