1. 程式人生 > 其它 >vue3.0 父元件顯示子元件中的echarts,同時保證寬高自適應。

vue3.0 父元件顯示子元件中的echarts,同時保證寬高自適應。

目錄

vue3.0 父元件顯示子元件中的echarts,同時保證寬高自適應。

父元件顯示echarts子元件,實現原理如下:echarts的資料是在渲染時候載入的,所以最簡單的辦法就是所有圖示資料拿到以後,利用v-if進行渲染。

核心程式碼如下:v-if="isInit" state.isInit = true

<LearnAnalysis class="learn-analysis" ref="analysisRef" v-if="isInit" :pieChartDatas="pieChartDatas"
:barChartDatas="barChartDatas">
</LearnAnalysis>
const GetAllLearnBehaviors = () => {
    //根據token 內儲存的使用者id 查詢登入使用者的所有學習記錄
    axios.get('/learnbehavior/LearnBehavior/piechartdata?id=*******')
        .then((res) => {
        //餅圖資料				
        res.data.forEach(item => {
            let data = { value: '', name: '' }
            data.value = item.value
            data.name = item.key
            state.pieChartDatas.push(data)
        });

        //條形圖資料
        res.data.forEach(item => {
            state.barChartDatas.xData.push(item.key)
            state.barChartDatas.yData.push(item.value)
        })
        state.isInit = true
    })
        .catch()
}

el-card控制元件中的echarts進行填充佈局

通過修改el-card的body樣式來實現。核心程式碼如下:

.el-card ::v-deep .el-card__body {    
	height: 100%;
	width: 100%;
}

示例程式碼

子元件1

<template>
	<div class="echarts-header">
		<div ref="pieChartRef" style="width: 50%;height: 100%;"></div>
		<div ref="barChartRef" style="width: 50%;height: 100%;"></div>
	</div>
</template>
<script>
import { ref, reactive, toRefs, onMounted, watch } from 'vue'
import * as echarts from "echarts";

export default {
	name: 'LearnAnalysis',
	props: {
		pieChartDatas: Array,
		barChartDatas: Object,
	},
	setup (props) {
		const pieChartRef = ref(null)
		const barChartRef = ref(null)
		const state = reactive({
			pieChart: {},
			barChart: {},
			pieChartDatas: [],
			barChartDatas: {},
			chartDatas: [],
			isLearn: '',
			behaviorCategory: '',
			behaviorDescription: '',
			startTime: '',
			endTime: ''
		})

		//初始化扇形圖
		const initPieChart = () => {
			// 基於準備好的dom,初始化echarts例項
			state.pieChart = echarts.init(pieChartRef.value);
			// 指定圖表的配置項和資料
			let option = {
				title: {
					text: '學習情況統計分析',
					subtext: '學習情況分佈分析',
					left: 'center'
				},
				tooltip: {
					trigger: 'item'
				},
				legend: {
					orient: 'vertical',
					left: 'left'
				},
				series: [
					{
						name: '學習佔比',
						type: 'pie',
						radius: '50%',
						data: props.pieChartDatas,
						//重點
						label: {
							normal: {
								formatter: '{b}:{c}: ({d}%)',
								textStyle: {
									fontWeight: 'normal',
									fontSize: 15
								}
							}
						},
						emphasis: {
							itemStyle: {
								shadowBlur: 10,
								shadowOffsetX: 0,
								shadowColor: 'rgba(0, 0, 0, 0.5)'
							}
						}
					}
				]
			};

			// 使用剛指定的配置項和資料顯示圖表。
			state.pieChart.setOption(option);
		}
		//初始化條形圖
		const initbarChart = () => {
			state.barChart = echarts.init(barChartRef.value)
			let option = {
				title: {
					text: '學習情況統計分析',
					subtext: '學習情況資料統計',
					left: 'center'
				},
				xAxis: {
					type: 'category',
					data: props.barChartDatas.xData
				},
				yAxis: {
					type: 'value'
				},
				series: [
					{
						data: props.barChartDatas.yData,
						type: 'bar',
						showBackground: true,
						backgroundStyle: {
							color: 'rgba(180, 180, 180, 0.2)'
						}
					}
				]
			}
			// 使用剛指定的配置項和資料顯示圖表。
			state.barChart.setOption(option);
		}

		const reload = () => {
			initPieChart()
			initbarChart()
		}

		onMounted(() => {
			reload()
		})

		return {
			...toRefs(state),
			pieChartRef,
			barChartRef,
			initPieChart,
			initbarChart,
			reload
		}
	},
}
</script>
<style scoped>
.echarts-header {
	display: flex;
	flex-direction: row;
	align-items: stretch;
}
</style>

子元件2

<template>
	<div >
		<!--學習分析 content區域 顯示所有型別的統計-->
		<div ref="barChartRef" id="barChart" style="width: 100%;height:100%;"></div>
	</div>

	

</template>
<script>
import { ref, toRefs, onMounted } from 'vue'
import * as echarts from "echarts";

export default {
	name: 'LearnBehaviorList',
	props: {
		barChartDatas: Object,
	},
	setup (props) {
		const barChartRef = ref(null)
		const state = {
			catHeader: ''
		}

		//初始化分析圖示資料
		const initbarChart = () => {
			// 基於準備好的dom,初始化echarts例項
			let myChart = echarts.init(barChartRef.value);
			// 指定圖表的配置項和資料
			let option = {
				title: [
					{
						text: '學習進度監控'
					}
				],
				polar: {
					radius: [30, '80%']
				},
				angleAxis: {
					max: 10,
					startAngle: 75
				},
				radiusAxis: {
					type: 'category',
					data: props.barChartDatas.xData
				},
				tooltip: {},
				series: {
					type: 'bar',
					data: props.barChartDatas.yData,
					coordinateSystem: 'polar',
					label: {
						show: true,
						position: 'middle',
						formatter: '{b}: {c}'
					}
				}
			};

			// 使用剛指定的配置項和資料顯示圖表。
			myChart.setOption(option);
		}

		onMounted(() => {
			initbarChart()
		})

		return {
			...toRefs(state),
			barChartRef,
			initbarChart,
		}
	}
}
</script>

父元件

<!--
 * @Author: AJun
 * @Date: 2022-12-06 14:57:59
 * @LastEditors: AJun
 * @LastEditTime: 2022-12-08 18:16:47
 * @Description: 學習行為 學習進度監控 學習情況統計分析
 * Copyright (c) 2022 by 正禾智通科技有限公司, All Rights Reserved. 
-->
<template >

	<el-card class="learn-topcard">
	
			<LearnAnalysis class="learn-analysis" ref="analysisRef" v-if="isInit" :pieChartDatas="pieChartDatas"
			:barChartDatas="barChartDatas">
		</LearnAnalysis>

		<!-- <h2>統計分析</h2> -->

	</el-card>

	<el-card class="learn-bottomcard">
		<!-- <h2>進度監控</h2> -->
		<LearnBehaviorList class="learn-behavior" ref="behaviorRef" v-if="isInit" :barChartDatas="barChartDatas">
		</LearnBehaviorList>
	</el-card>


</template>
<script>
import LearnBehaviorList from '../components/LearnBehaviorList.vue';
import LearnAnalysis from '../components/LearnAnalysis.vue';
import { ref, reactive, toRefs, onMounted } from 'vue'
import axios from 'axios';
export default {
	components: { LearnBehaviorList, LearnAnalysis },

	setup () {
		const analysisRef = ref(null)
		const barChartRef = ref(null)
		const state = reactive({
			pieChartDatas: [],
			barChartDatas: {
				xData: [],
				yData: []
			},
			isInit: false,
		})

		//獲取所有的學習行為資料
		const GetAllLearnBehaviors = () => {			
			axios.get('/learnbehavior/LearnBehavior/piechartdata?id=****')
				.then((res) => {
					//餅圖資料				
					res.data.forEach(item => {
						let data = { value: '', name: '' }
						data.value = item.value
						data.name = item.key
						state.pieChartDatas.push(data)
					});

					//條形圖資料
					res.data.forEach(item => {
						state.barChartDatas.xData.push(item.key)
						state.barChartDatas.yData.push(item.value)
					})
					state.isInit = true
				})
				.catch()
		}

		//載入所有資料
		const reload = () => {
			GetAllLearnBehaviors()
		}

		onMounted(() => {
			reload()
		})


		return {
			...toRefs(state),
			analysisRef,
			barChartRef,
		}
	}
}

</script>
<style scoped>
.learn-topcard {
	margin-top: 20px;
	height: 48%;
	width: 100%;
}
.el-card ::v-deep .el-card__body {    
	height: 100%;
	width: 100%;
}

.learn-analysis {		
	height: 100%;
}

.learn-bottomcard {
	margin-top: 20px;	
	height: 48%;
	width: 100%;
}

.learn-behavior {	
	height: 100%;	
}
</style>