首页 > 其他分享 >vue3.0 父组件显示子组件中的echarts,同时保证宽高自适应。

vue3.0 父组件显示子组件中的echarts,同时保证宽高自适应。

时间:2022-12-08 18:59:10浏览次数:40  
标签:宽高自 value item state vue3.0 组件 const data 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>

标签:宽高自,value,item,state,vue3.0,组件,const,data,echarts
From: https://www.cnblogs.com/AJun816/p/16966966.html

相关文章

  • 基于Qt的桌面客户端组件化框架DT 开源啦
    这个是本人在工作中基于QT开发的组件化桌面开发框架,目前打算开源出来提供给大家,节省大家的开发时间和效率,希望对大家的开发有所帮助,也欢迎提出意见和改进建议1.为什么开源D......
  • 组件注册
    全局注册: Vue.component("my-aa",{data:function(){return{aa:"123",......
  • SpringCloud组件入门使用
    SpringCloud1、远程调用1.1、微服务远程调用RestTemlpate1.2、微服务远程调用-Feign 2、Eureka注册中心2.1、Eureka注册中心搭建及入门使用2.2、Ribbon负载均......
  • Vue组件
    什么是组件组件是可复用的Vue实例,说白了就是一组可以重复使用的模板,跟JSTL的自定义标签,Thymeleaf的th:fragment等框架有着异曲同工之妙。通常一个应用会以一颗嵌套的......
  • JavaWeb三大组件(Servlet、Filter、Listener)
    vue.runtime.esm.js:587[Vuewarn]:Errorincallbackforwatcher"form.psiType":"TypeError:Cannotreadpropertiesofundefined(reading'form')"——————......
  • element-ui 表单组件的简单封装
    背景在管理系统中我们需要经常使用表单组件来收集用户的一些数据,如果按照官网的示例一个个表单项去填写不仅代码会变得很长而且麻烦,所以我们有必要去对组件进行再次的封装......
  • 浅谈“配置化”与 normalize 在复杂嵌套组件开发中的应用
    简介视图层相比脚本,具有不便于调试、无效信息过多(与当前逻辑不相关的属性)等特点,因此,同样的逻辑位于视图可能比位于脚本中的复杂程度更高。因此,在开发复杂组件,尤其是嵌套......
  • JavaWeb三大组件(Servlet、Filter、Listener)
    前言JavaWeb三大组件指的是:Servlet程序、Filter过滤器、Listener监听器,它们在JavaWeb开发中分别提供不同的功能,然而很多人有只用过Servlet、Filter,很少接触到Listener......
  • GIS组件应用笔记2
    赘述(可跳过)今天上课相对于昨天还是比较顺利,没有第一次使用Engine时候的慌张,但是多多少少也还遇到了一些问题,也找了一点资源来分享,或许不一定有用。今天上课的一个感受:不......
  • GIS组件应用笔记1
    关于新建项目在课程操作之前,需要新建一个windows窗体应用程序(.NetFramework)括号里的内容一定要注意,不要选没有(.NetFramework)的窗体应用。(非VS2019版本应该没有这个问......