Vue项目中使用ECharts可视化图表时,图表自适应大小。根据窗口大小自动改变ECharts图表的宽度。

一、防抖函数

页面频繁使用window.resize函数会使得页面非常卡顿,需要使用debounce防抖函数(无论触发了多少次回调,都只执行最后一次)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* 函数防抖
* @param {Function} func
* @param {number} delay
* @param {boolean} immediate
* @return {*}
*/

export function debounce(func, delay, immediate = false) {
let timer,context = this;
return (...args) => {
if (immediate) {
func.apply(context, args);
immediate = false;
return;
}
clearTimeout(timer);
timer = setTimeout(() => {
func.apply(context, args);
}, delay);
};
}

二、resize函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// 工具函数的引入
import { debounce } from '@/utils/index.js';
export default {
data() {
return {
myChart: null,
resizeHandler: null
};
},
computed: {
// 侧边栏的收缩
open() {
return this.$store.state.setting.open;
}
},
mounted() {
this.resizeHandler = debounce(() => {
if (this.myChart) {
this.myChart.resize();
}
}, 100);
this.initResizeEvent();
},

methods: {
//监听resize
initResizeEvent() {
window.addEventListener('resize', this.resizeHandler);
},
//移除resize
destroyResizeEvent() {
window.removeEventListener('resize', this.resizeHandler);
}
},

beforeDestroy() {
this.destroyResizeEvent();
if (!this.myChart) {
return;
}
this.myChart.dispose();
this.myChart.off('click');
this.myChart = null;
},

activated() {
this.initResizeEvent();
if (this.myChart) {
this.myChart.resize();
}
},

deactivated() {
this.destroyResizeEvent();
},
watch: {
open() {
if (this.myChart) {
this.myChart.resize();
}
}
}
};