echarts自定义全屏弹窗

项目场景:

公司项目中,提出在echarts表格的工具栏上,添加一个全屏按钮,点击可以弹出对应图表的全屏放大显示。
对于这个功能,简单的可以直接对所在的div容器增加一个按钮,点击后调用浏览器自带的全屏即可。但是这种方式不太方便嵌入到echarts的toolbox工具组件中,而且全屏显示的效果不太好。下面介绍一下toolbox自定义全屏控件的方式。


一、自定义全屏工具

在lineChart.js文件中先定义绘制echarts图表的方法,并在setOption配置中自定义全屏工具:

// 折线图显示数据
linechartCur.setOption({
  // 由于公司项目需要绘制多个图表
  // 所以需要给每个图表配置项赋予一个id
  id: index,
  tooltip: {
    trigger: 'axis',
    position: function (pt) {
      return [pt[0], '10%'];
    }
  },
  toolbox: {
    feature: {
      dataZoom: {
        yAxisIndex: false
      },
      saveAsImage: {
        pixelRatio: 2
      },
      myFull: {
        show: true,
        title: "全屏",
        // icon后面跟着svg的图片地址,这个引用方式网上资料很多,不予赘述
        icon: 'path://...',
        onclick: (e) => {
          // 这里的openDialog是传入方法中的点击事件,具体实现放在调用这个方法的vue页面中
          if(openDialog !== undefined) {
            // 传入对应事件的id
            // 由于这个自定义工具是在图表加载后渲染上去的
            // 所以采用调用外部点击事件来实现
            openDialog(e.option.id)
          }
        },
      },
    }
  },
  dataZoom: [
    {
      type: 'inside',
      start: 3,
      end: 67
    },
    {
      start: 0,
      end: 10
    }
  ],
  xAxis: {
    type: 'category',
    boundaryGap: false,
    data: xAxisData
  },
  yAxis: {
    type: 'value',
    boundaryGap: [0, '100%']
  },
  visualMap: {
    // 可视化
    top: 0,
    left: 0,
    text:['Danger', 'Safe'],
    pieces: [
      {
        gt: 0,
        lte: 20,
        color: '#93CE07'
      },
      {
        gt: 20,
        lte: 40,
        color: '#0000FF'
      },
      {
        gt: 40,
        lte: 60,
        color: '#FFFF00'
      },
      {
        gt: 60,
        lte: 80,
        color: '#FC7D02'
      },
      {
        gt: 80,
        color: '#FD0100'
      }
    ],
    outOfRange: {
      color: '#999'
    }
  },
  series: [
    {
      data: yAxisData,
      type: 'line',
      showSymbol: false,
    }
  ],
  title: [
    {
      left: 'center',
      text: `${containerAttr[index].name}`
    }
  ]
})

二、vue页面调用绘制图表方法

首先,使用element-ui的el-dialog组件展示图表的全屏弹窗,并在methods中自定义全屏按钮点击事件,传入到方法中触发并执行。

<!-- 图表全屏弹窗 -->
<template>
	<div>
		...
		<el-dialog width="80%" v-if="dialogVisible" :visible.sync="dialogVisible" :destroy-on-close="true" style="overflow:hidden;">
		    <div class="dlg" style="width:100%;height:55vh;overflow:hidden;" />
		</el-dialog>
	</div>
</template>

<script>
import lineChart from '@/utils/chartList/lineChart'

export default {
	...
	data() {
		return {
			// 是否打开弹窗
			dialogVisible: false
		}
	}
	methods: {
		async openDialog(id) {
			// 打开/关闭图表全屏弹窗
      		this.dialogVisible = true
      		// 这里是多个图表的选择
      		var dialogContainer = JSON.parse(JSON.stringify(this.containerAttrCurrent))
      		// 根据id,确定点击全屏后显示的是哪个图表
      		for (var i = 0, len = dialogContainer.length; i < len; ++i) {
        		if (id === i) {
          			dialogContainer[i].isShow = true
        		} else {
          			dialogContainer[i].isShow = false
        		}
      		}
      		// 第一个参数为弹窗容器的id
      		// 第二个参数为图表的相关信息
			await lineChart.drawLineChart("dlg", dialogContainer)
	}
}
</script>

三、最终效果

未点击前网页效果:
在这里插入图片描述
点击后全屏弹窗:
在这里插入图片描述


四、注意

  1. toolbox自定义工具的名字开头必须以“my”开头;
  2. 单个图表的参数设计比较简单,对于多个图表的,需要根据class动态选择(公司项目的最终需求…);
  3. 如果需要的是充满整个屏幕的全屏效果,可以参考下面的代码:
myFull: {
  show: true,
  title: "全屏",
  icon: 'path://...',
  onclick: (e) => {
  	const element = document.getElementById('dlg')
    // 一些浏览器的兼容性
    if (element.requestFullScreen) {
      // HTML W3C 提议
      element.requestFullScreen()
    } else if (element.msRequestFullscreen) {
      // IE11
      element.msRequestFullScreen()
    } else if (element.webkitRequestFullScreen) {
      // Webkit (works in Safari5.1 and Chrome 15)
      element.webkitRequestFullScreen()
    } else if (element.mozRequestFullScreen) {
      // Firefox (works in nightly)
      element.mozRequestFullScreen()
    }

    // 退出全屏
    if (element.requestFullScreen) {
      document.exitFullscreen()
    } else if (element.msRequestFullScreen) {
      document.msExitFullscreen()
    } else if (element.webkitRequestFullScreen) {
      document.webkitCancelFullScreen()
    } else if (element.mozRequestFullScreen) {
      document.mozCancelFullScreen()
    }
  },
},
实现这个功能的一种方式是,在点击放大按钮时,将对应的图表数据传递给一个全局的状态管理器,然后在弹出的el-dialog中使用这些数据来渲染图表。 下面是一个简单的示例: 1. 在Vue应用中定义一个全局的状态管理器,用来存储图表数据: ``` // store.js import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({ state: { chartData: null }, mutations: { setChartData(state, data) { state.chartData = data } } }) ``` 2. 在图表组件中,定义一个放大按钮,并在点击按钮时将图表数据传递给状态管理器: ``` <template> <div> <div ref="chart"></div> <button @click="showDialog">放大</button> </div> </template> <script> import store from '@/store' import echarts from 'echarts' export default { mounted() { this.chart = echarts.init(this.$refs.chart) this.chart.setOption(this.chartOptions) }, methods: { showDialog() { store.commit('setChartData', this.chartOptions) this.$emit('show-dialog') } } } </script> ``` 在上面的代码中,我们在showDialog方法中将图表数据(即chartOptions)传递给状态管理器,并触发一个自定义事件(show-dialog),用来通知父组件打开el-dialog。 3. 在父组件中,监听自定义事件,并在事件处理函数中打开el-dialog: ``` <template> <div> <my-chart @show-dialog="showDialog"></my-chart> <el-dialog :visible.sync="dialogVisible"> <my-chart :chart-options="chartData"></my-chart> </el-dialog> </div> </template> <script> import store from '@/store' import MyChart from '@/components/MyChart' export default { components: { MyChart }, data() { return { dialogVisible: false } }, computed: { chartData() { return store.state.chartData } }, methods: { showDialog() { this.dialogVisible = true } } } </script> ``` 在上面的代码中,我们通过computed属性获取状态管理器中存储的图表数据,并将其传递给子组件(my-chart)。同时,我们定义了一个dialogVisible变量,用来控制el-dialog的显示状态。当监听到子组件的自定义事件时,我们将dialogVisible设置为true,从而打开el-dialog,并将my-chart组件插入到dialog中。由于chartData是响应式的,当状态管理器中的数据发生变化时,el-dialog中的图表也会相应地更新。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值