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
|
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: { initResizeEvent() { window.addEventListener('resize', this.resizeHandler); }, 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(); } } } };
|