85 lines
2.1 KiB
JavaScript
85 lines
2.1 KiB
JavaScript
// 防抖函数:避免频繁触发 resize
|
||
function debounce(fn, delay = 100) {
|
||
let timer = null;
|
||
return function (...args) {
|
||
if (timer) clearTimeout(timer);
|
||
timer = setTimeout(() => {
|
||
fn.apply(this, args);
|
||
timer = null;
|
||
}, delay);
|
||
};
|
||
}
|
||
|
||
export default {
|
||
data() {
|
||
return {
|
||
// 存储ResizeObserver实例
|
||
resizeObserver: null,
|
||
// 标记是否已初始化监听
|
||
isResizeListening: false
|
||
};
|
||
},
|
||
methods: {
|
||
/**
|
||
* 初始化尺寸监听
|
||
* @param {HTMLElement} container - 图表容器DOM(默认取this.$refs.chartContainer)
|
||
*/
|
||
initResizeListener(container) {
|
||
// 防止重复初始化
|
||
if (this.isResizeListening) return;
|
||
|
||
// 默认使用组件内的chartContainer作为监听目标
|
||
const target = container || this.$refs.chartContainer;
|
||
if (!target) {
|
||
console.warn('未找到图表容器,无法初始化尺寸监听');
|
||
return;
|
||
}
|
||
|
||
// 创建ResizeObserver实例
|
||
this.resizeObserver = new ResizeObserver(
|
||
debounce(entries => {
|
||
// 触发图表重绘
|
||
this.handleContainerResize(entries);
|
||
})
|
||
);
|
||
|
||
// 开始监听容器尺寸变化
|
||
this.resizeObserver.observe(target);
|
||
this.isResizeListening = true;
|
||
},
|
||
|
||
/**
|
||
* 处理容器尺寸变化
|
||
* @param {ResizeObserverEntry[]} entries - ResizeObserver回调参数
|
||
*/
|
||
handleContainerResize(entries) {
|
||
// 确保图表实例存在
|
||
if (this.chart && this.chart.resize) {
|
||
// 调用ECharts的resize方法重绘图表
|
||
this.chart.resize();
|
||
}
|
||
},
|
||
|
||
/**
|
||
* 销毁尺寸监听
|
||
*/
|
||
destroyResizeListener() {
|
||
if (this.resizeObserver) {
|
||
this.resizeObserver.disconnect();
|
||
this.resizeObserver = null;
|
||
}
|
||
this.isResizeListening = false;
|
||
}
|
||
},
|
||
// 组件挂载后初始化监听
|
||
mounted() {
|
||
// 延迟初始化,确保DOM已渲染完成
|
||
this.$nextTick(() => {
|
||
this.initResizeListener();
|
||
});
|
||
},
|
||
// 组件销毁前清理监听
|
||
beforeDestroy() {
|
||
this.destroyResizeListener();
|
||
}
|
||
}; |