Skip to content

Commit 659ad74

Browse files
committed
feat: 添加echarts图表自适应
1 parent a1f0385 commit 659ad74

File tree

11 files changed

+202
-533
lines changed

11 files changed

+202
-533
lines changed

index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<meta charset="UTF-8" />
55
<link rel="icon" href="/favicon.ico" />
66
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
7-
<title>Vite App</title>
7+
<title>Vue3-Vite-ElementPlus-Admin</title>
88
</head>
99
<body>
1010
<div id="app"></div>
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
<!--
2+
* @Description: echarts图表初始化
3+
* @Author: hutu
4+
* @Date: 2021-12-30 10:32:19
5+
* @LastEditors: hutu
6+
* @LastEditTime: 2022-01-10 16:48:23
7+
-->
8+
<template>
9+
<div :id="prop.id" :style="{ width: prop.width, height: prop.height }"></div>
10+
</template>
11+
<script lang="ts" setup>
12+
import * as echarts from 'echarts/core'
13+
import { BarChart, LineChart, PieChart } from 'echarts/charts'
14+
import { TitleComponent, TooltipComponent, GridComponent, LegendComponent, ToolboxComponent } from 'echarts/components'
15+
import { LabelLayout, UniversalTransition } from 'echarts/features'
16+
import { CanvasRenderer } from 'echarts/renderers'
17+
import { IEchartsOption } from '@/interface'
18+
echarts.use([BarChart, LineChart, PieChart, TitleComponent, TooltipComponent, ToolboxComponent, GridComponent, LegendComponent, LabelLayout, UniversalTransition, CanvasRenderer])
19+
20+
import { ref, onMounted, onBeforeUnmount, onActivated, onDeactivated } from 'vue'
21+
import { debounce } from 'throttle-debounce'
22+
import elementResizeDetectorMaker from 'element-resize-detector'
23+
24+
const prop = defineProps<{
25+
id: string
26+
width: string
27+
height: string
28+
option: IEchartsOption
29+
}>()
30+
31+
const chart = ref()
32+
/**
33+
* @desc: 初始化图表
34+
*/
35+
const initChart = () => {
36+
const charts = echarts.init(document.getElementById(prop.id) as HTMLElement)
37+
charts.setOption(prop.option)
38+
chart.value = charts
39+
}
40+
/**
41+
* @desc: 监听窗口变化重置图表
42+
*/
43+
const chartResizeHandler = debounce(200, false, () => {
44+
if (chart.value) {
45+
chart.value.resize({
46+
animation: {
47+
duration: 300
48+
}
49+
})
50+
}
51+
})
52+
/**
53+
* @desc: 添加监听窗口变化事件
54+
*/
55+
const initResizeEvent = () => {
56+
window.addEventListener('resize', chartResizeHandler)
57+
}
58+
/**
59+
* @desc: 移除监听窗口变化事件
60+
*/
61+
const destroyResizeEvent = () => {
62+
window.addEventListener('resize', chartResizeHandler)
63+
}
64+
/**
65+
* @desc: 添加监听侧边栏变化事件
66+
*/
67+
let sidebarElm: HTMLElement
68+
const erd = elementResizeDetectorMaker()
69+
const initSidebarResizeEvent = () => {
70+
sidebarElm = document.getElementsByClassName('sidebar-container')[0] as HTMLElement
71+
if (sidebarElm) {
72+
erd.listenTo(sidebarElm, chartResizeHandler)
73+
}
74+
}
75+
/**
76+
* @desc: 移除监听侧边栏变化事件
77+
*/
78+
const destroySidebarResizeEvent = () => {
79+
if (sidebarElm) {
80+
erd.removeListener(sidebarElm, chartResizeHandler)
81+
}
82+
}
83+
const mounted = () => {
84+
initChart()
85+
initResizeEvent()
86+
initSidebarResizeEvent()
87+
}
88+
const beforeDestroy = () => {
89+
destroyResizeEvent()
90+
destroySidebarResizeEvent()
91+
if (chart.value) {
92+
chart.value.dispose()
93+
}
94+
}
95+
96+
let firstFlag = false //首次渲染
97+
onMounted(() => {
98+
firstFlag = true
99+
mounted()
100+
})
101+
onBeforeUnmount(() => {
102+
beforeDestroy()
103+
})
104+
onActivated(() => {
105+
//如果首次渲染不重复执行
106+
if (firstFlag) {
107+
firstFlag = false
108+
return false
109+
}
110+
mounted()
111+
})
112+
onDeactivated(() => {
113+
beforeDestroy()
114+
})
115+
</script>

src/components/InitEcharts/Index.vue

Lines changed: 0 additions & 53 deletions
This file was deleted.

src/layout/Index.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
<div class="layout" :class="menuCollapse ? 'hideSidebar' : 'openSidebar'">
1010
<Sidebar class="sidebar-container app-sidebar-bg" :list="accessRoutes" :route="route.path" :collapse="menuCollapse" />
1111
<div class="main-container">
12-
<div class="layout-header app-header-bg">
12+
<div class="main-container-header app-header-bg">
1313
<Navbar />
1414
</div>
15-
<div class="layout-content app-main-bg">
15+
<div class="main-container-content app-main-bg">
1616
<AppMain />
1717
</div>
1818
</div>

src/utils/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/*
2+
* @Description:公共方法
3+
* @Author: hutu
4+
* @Date: 2022-01-10 11:02:04
5+
* @LastEditors: hutu
6+
* @LastEditTime: 2022-01-10 15:24:44
7+
*/

0 commit comments

Comments
 (0)