封装了一个echarts图全屏放大的功能

文章介绍了一个在Vue.js项目中使用Echarts的封装方法,包括如何初始化Echarts图表,如何实现全屏功能以及监听屏幕大小变化自动调整图表尺寸。在全屏时,通过ResizeObserver观察元素变化并重新调整图表大小。示例代码展示了如何在组件中调用这些功能。
摘要由CSDN通过智能技术生成

注意:1、没有监听屏幕的大小,我感觉没必要
2、如果是监听屏幕大小变化,直接echarts.resize()就行了。

封装的js文件

import * as echarts from 'echarts'
/**
 * el:目标渲染元素
 * option:echarts配置项
 * resize:是否需要全屏功能
 */

export const initEcharts = (el, option, resize = false) => {
    const chartDom = el;
    const myChart = echarts.init(chartDom);
    let num = 0
    //全屏放大功能,增加全屏按钮,点击全屏按钮(自己添加)传递resize参数=true就行
    if (resize) {
        myChart.resize()
        const resizeObserver = new ResizeObserver(entries => {
            num++
            if (num >= 2) {
                myChart.resize()
                if (!document.webkitIsFullScreen) {
                    num = 0
                    setTimeout(() => {
                        resizeObserver.disconnect()
                    }, 50)
                }
            }
        });
        resizeObserver.observe(el)
    }
    myChart.clear()
    myChart.setOption(option);
}

export const screenFull = e => {
    if (e.requestFullscreen) {
        e.requestFullscreen();
    } else if (e.mozRequestFullScreen) {
        e.mozRequestFullScreen();
    } else if (e.webkitRequestFullscreen) {
        e.webkitRequestFullscreen();
    } else if (e.msRequestFullscreen) {
        e.msRequestFullscreen();
    }
};

使用

1、initEcharts接收三个参数,参一为echarts渲染的目标元素
参二为echarts渲染的配置项
参三控制是否需要全屏放大的相关功能

2、screenFull 为控制某个元素放大的按钮,传递需要放大的元素即可

<template>
	<div class="main-pie">
		<button @click="fn">点击此按钮进入全屏(根据需求可以换成icon的形式,搭配hover)</button>
		<div class="main-echarts" ref="main-echarts"></div>
	</div>
</template>
<script>
	import { initEcharts, screenFull } from "@/utils/initEcharts.js";
	export default {
		data() {
			return {
				option2: {
					tooltip: {
						trigger: "item"
					},
					legend: {
						type: "scroll",
						orient: "vertical",
						right: "center",
						top: 20,
						bottom: 20
					},
					series: [
						{
							type: "pie",
							radius: "90%",
							left: "50%",
							itemStyle: {
								borderColor: "#fff",
								borderWidth: 2
							},
							data: [
								{
									value: 1548,
									name: "CityE"
								},
								{ value: 735, name: "基础治疗" },
								{ value: 510, name: "挂号" },
								{ value: 434, name: "正畸形" },
								{ value: 335, name: "修复类" },
								{ value: 335, name: "种植类" }
							]
						},
						{
							itemStyle: {
								borderColor: "#fff",
								borderWidth: 2
							},
							type: "pie",
							radius: "90%",
							right: "50%",

							data: [
								{
									value: 1548,
									name: "CityE"
								},
								{ value: 735, name: "基础治疗" },
								{ value: 510, name: "挂号" },
								{ value: 434, name: "正畸形" },
								{ value: 335, name: "修复类" },
								{ value: 335, name: "种植类" }
							]
						}
					]
				}
			};
		},
		props: {},
		watch: {},
		mounted() {
			this.initMainEcharts();
		},
		created() {},
		methods: {
			initMainEcharts(resize = false) {
				let el = this.$refs["main-echarts"];
				initEcharts(el, this.option2, resize);
			},
			fn() {
				screenFull(this.$refs["main-echarts"]);
				//全屏放大,需要等待容器缩放完成后,重绘echarts图像
				setTimeout(() => {
					this.initMainEcharts(true);
				}, 50);
			}
		}
	};
</script>
<style lang="scss" scoped>
	.main-pie {
		li {
			list-style: none;
			display: flex;
			align-items: center;
			padding: 6px;
			cursor: pointer;
			white-space: nowrap;
			> div {
				width: 10%;
				height: 10px;
				margin-right: 10px;
			}
		}
		.title-echarts {
			width: 100%;
			height: 80px;
			display: flex;
			align-items: center;
			justify-content: space-between;
			p {
				text-align: center;
				width: 42%;
				font-size: 18px;
			}
		}
		width: 100%;
		> .main-echarts {
			background-color: white;
			height: calc(100vh - 270px);
		}

		.main-echarts {
			width: 100%;
		}

		p {
			padding: 0;
			margin: 0;
			color: #000000;
		}
	}
</style>

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
作为一名AI语言模型,我无法进行编程操作,但我可以提供您一个完整的echarts表vue组件的基本结构和代码示例,您可以根据它进行修改和完善。 基本结构: ``` <template> <div class="echarts-chart"></div> </template> <script> import echarts from 'echarts' export default { name: 'EchartsChart', props: { // 接收外部传入的数据 chartData: { type: Object, required: true }, // 配置项 options: { type: Object, default() { return {} } } }, data() { return { // 定义一个echarts实例 chart: null } }, mounted() { // 在组件挂载后初始化echarts实例 this.chart = echarts.init( this.$el, null, this.options ) // 渲染表 this.renderChart(this.chartData) }, methods: { // 渲染表 renderChart(chartData) { this.chart.setOption(chartData) } }, watch: { // 监听chartData的变化,重新渲染表 chartData(newValue) { this.renderChart(newValue) } }, beforeDestroy() { // 销毁echarts实例 this.chart.dispose() this.chart = null } } </script> <style> .echarts-chart { width: 100%; height: 100%; } </style> ``` 代码示例: ``` <template> <div class="echarts-chart"></div> </template> <script> import echarts from 'echarts' export default { name: 'EchartsChart', props: { // 接收外部传入的数据 chartData: { type: Object, required: true }, // 配置项 options: { type: Object, default() { return {} } } }, data() { return { // 定义一个echarts实例 chart: null } }, mounted() { // 在组件挂载后初始化echarts实例 this.chart = echarts.init( this.$el, null, this.options ) // 渲染表 this.renderChart(this.chartData) }, methods: { // 渲染表 renderChart(chartData) { this.chart.setOption(chartData) } }, watch: { // 监听chartData的变化,重新渲染表 chartData(newValue) { this.renderChart(newValue) } }, beforeDestroy() { // 销毁echarts实例 this.chart.dispose() this.chart = null } } </script> <style> .echarts-chart { width: 100%; height: 100%; } </style> ``` 使用方法: ``` <template> <div class="app"> <EchartsChart :chartData="chartData" :options="options"></EchartsChart> </div> </template> <script> import EchartsChart from './components/EchartsChart.vue' export default { name: 'App', components: { EchartsChart }, data() { return { chartData: { // echarts表数据 }, options: { // echarts配置项 } } } } </script> <style> .app { width: 100%; height: 100%; } </style> ``` 以上是一个基本的echarts表vue组件的结构和代码示例,您可以根据自己的需求进行修改和完善。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值