|
@@ -1,76 +1,94 @@
|
|
|
<template>
|
|
|
- <div class="hac-echarts-box">
|
|
|
- <div ref="echart" class="hac-echarts" :style="`width : ${chart?.clientWidth}px`"/>
|
|
|
- </div>
|
|
|
+ <echartsBase :option="setOption"/>
|
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
|
-import * as echarts from 'echarts'
|
|
|
-import { nextTick, onMounted, onUnmounted, ref, watch } from 'vue'
|
|
|
+import echartsBase from './index.vue'
|
|
|
+import { nextTick, onMounted, ref, watch } from 'vue'
|
|
|
+
|
|
|
const props = defineProps({
|
|
|
+ color: {
|
|
|
+ type: Array,
|
|
|
+ default: () => ([])
|
|
|
+ },
|
|
|
+ unit: {
|
|
|
+ type: String,
|
|
|
+ default: ''
|
|
|
+ },
|
|
|
datas: {
|
|
|
type: Array,
|
|
|
default: () => ([])
|
|
|
- }
|
|
|
+ },
|
|
|
+ lables: {
|
|
|
+ type: Array,
|
|
|
+ default: () => ([])
|
|
|
+ },
|
|
|
+ isMonth: {
|
|
|
+ type: Boolean,
|
|
|
+ default: false
|
|
|
+ },
|
|
|
})
|
|
|
|
|
|
//初始变量
|
|
|
-let chart = null;
|
|
|
-const echart = ref(null)
|
|
|
+const setOption = ref({})
|
|
|
+const colors = ref(props.color)
|
|
|
+const units = ref(props.unit)
|
|
|
const datas = ref(props.datas)
|
|
|
+const isMonths = ref(props.isMonth)
|
|
|
+const xAxis = ref(props.lables)
|
|
|
|
|
|
-//创建月份
|
|
|
-const monthData = ref([])
|
|
|
-for (let i = 1; i < 13; i++) {
|
|
|
- monthData.value = [...monthData.value, i + '月']
|
|
|
-}
|
|
|
+watch(() => [
|
|
|
+ props.color,
|
|
|
+ props.unit,
|
|
|
+ props.isMonth,
|
|
|
+ props.lables
|
|
|
+], ([color, unit, isMonth, lables]) => {
|
|
|
+ colors.value = color
|
|
|
+ units.value = unit
|
|
|
+ isMonths.value = isMonth
|
|
|
+ xAxis.value = lables
|
|
|
+ setOptions()
|
|
|
+})
|
|
|
|
|
|
-//监听
|
|
|
+//深度监听数据变化
|
|
|
watch(() => [
|
|
|
- props.datas
|
|
|
+ props.datas,
|
|
|
], ([data]) => {
|
|
|
datas.value = data
|
|
|
- setDatas(data)
|
|
|
-})
|
|
|
-
|
|
|
-//初始化图表
|
|
|
-const initChart = () => {
|
|
|
- chart = echarts.init(echart.value)
|
|
|
- setDatas(props.datas)
|
|
|
-}
|
|
|
-
|
|
|
-//监听浏览器窗口变化
|
|
|
-const windowResize = () => {
|
|
|
- window.addEventListener("resize", resizeEvent);
|
|
|
-}
|
|
|
-
|
|
|
-const resizeEvent = () => {
|
|
|
- window.requestAnimationFrame(() => {
|
|
|
- chart.resize();
|
|
|
- })
|
|
|
-}
|
|
|
-
|
|
|
-const onResize = () => {
|
|
|
- nextTick(() => {
|
|
|
- chart.resize();
|
|
|
- })
|
|
|
-}
|
|
|
+ setDataFormat()
|
|
|
+}, { deep: true })
|
|
|
|
|
|
-//设置数据
|
|
|
-const setDatas = (data) => {
|
|
|
- let AxisData = [], neiYeRatio = [], waiYeRatio = [];
|
|
|
+//处理数据
|
|
|
+const setDataFormat = () => {
|
|
|
+ let series = [], lables = [], data = datas.value;
|
|
|
+ if (isMonths.value) {
|
|
|
+ for (let i = 1; i < 13; i++) {
|
|
|
+ lables = [...lables, i + '月']
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ lables = xAxis.value
|
|
|
+ }
|
|
|
+ let isLables = lables.length > 0
|
|
|
+ //处理数据
|
|
|
for (let i = 0; i < data.length; i++) {
|
|
|
- AxisData.push(data[i].title)
|
|
|
- neiYeRatio.push(data[i]?.neiYeRatio)
|
|
|
- waiYeRatio.push(data[i]?.waiYeRatio)
|
|
|
+ if (data[i].name) {
|
|
|
+ if (!isLables) {
|
|
|
+ lables.push(data[i].name)
|
|
|
+ }
|
|
|
+ series.push({
|
|
|
+ name: data[i].name,
|
|
|
+ type: 'bar',
|
|
|
+ data: data[i].value
|
|
|
+ })
|
|
|
+ }
|
|
|
}
|
|
|
- setOptions(AxisData,neiYeRatio,waiYeRatio)
|
|
|
+ setOptions(lables, series)
|
|
|
}
|
|
|
|
|
|
//设置图表
|
|
|
-const setOptions = (AxisData,neiYeRatio,waiYeRatio) => {
|
|
|
- chart.setOption({
|
|
|
- color: ['#5087EC', '#68BBC4', '#58A55D'],
|
|
|
+const setOptions = (lables = [], series = []) => {
|
|
|
+ setOption.value = {
|
|
|
+ color: colors.value,
|
|
|
tooltip: {
|
|
|
trigger: 'axis',
|
|
|
axisPointer: {
|
|
@@ -80,71 +98,30 @@ const setOptions = (AxisData,neiYeRatio,waiYeRatio) => {
|
|
|
grid: {
|
|
|
top: '20px',
|
|
|
left: '0',
|
|
|
- right: '0',
|
|
|
+ right: '4px',
|
|
|
bottom: '0',
|
|
|
containLabel: true
|
|
|
},
|
|
|
xAxis: [
|
|
|
{
|
|
|
type: 'category',
|
|
|
- data: monthData.value,
|
|
|
+ data: lables,
|
|
|
}
|
|
|
],
|
|
|
- yAxis: [{type: 'value'}],
|
|
|
- series: [
|
|
|
- {
|
|
|
- name: '总计划',
|
|
|
- type: 'bar',
|
|
|
- data: [320, 332, 301, 334, 390]
|
|
|
+ yAxis: [{
|
|
|
+ type: 'value',
|
|
|
+ axisLabel: {
|
|
|
+ formatter: '{value}' + units.value
|
|
|
},
|
|
|
- {
|
|
|
- name: '已完成',
|
|
|
- type: 'bar',
|
|
|
- data: [220, 182, 191, 234, 290]
|
|
|
- },
|
|
|
- {
|
|
|
- name: '未完成',
|
|
|
- type: 'bar',
|
|
|
- data: [150, 232, 201, 154, 190]
|
|
|
- }
|
|
|
- ]
|
|
|
- })
|
|
|
+ }],
|
|
|
+ series: series
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
//渲染完成
|
|
|
onMounted(() => {
|
|
|
nextTick(() => {
|
|
|
- initChart()
|
|
|
- windowResize()
|
|
|
+ setDataFormat()
|
|
|
})
|
|
|
})
|
|
|
-
|
|
|
-//被卸载
|
|
|
-onUnmounted(() => {
|
|
|
- window.removeEventListener("resize",resizeEvent);
|
|
|
- chart.dispose()
|
|
|
- chart = null
|
|
|
-})
|
|
|
-
|
|
|
-// 暴露出去
|
|
|
-defineExpose({
|
|
|
- onResize
|
|
|
-})
|
|
|
</script>
|
|
|
-
|
|
|
-<style lang="scss" scoped>
|
|
|
-.hac-echarts-box {
|
|
|
- height: 100%;
|
|
|
- overflow: hidden;
|
|
|
- position: relative;
|
|
|
- .hac-echarts {
|
|
|
- position: absolute;
|
|
|
- bottom: 0;
|
|
|
- left: 0;
|
|
|
- right: 0;
|
|
|
- z-index: 2;
|
|
|
- width: 100%;
|
|
|
- height: 100%;
|
|
|
- }
|
|
|
-}
|
|
|
-</style>
|