mirror of
https://github.com/kuaifan/dootask.git
synced 2025-12-12 19:35:50 +00:00
55 lines
1.6 KiB
JavaScript
Vendored
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;
|
||
}
|
||
}
|
||
};
|