Vue中使用Echarts封装为公用组件(简单复制粘贴)

Vue中封装Echarts组件

本文以Vue3代码演示 Vue2同理

前提

中文官网: https://echarts.apache.org/zh/index.html

npm安装Echarts

js 复制代码
npm install echarts
or
pnpm install echarts
or
yarn add echarts

直奔主题

  1. 创建Echarts.vue文件,代码如下👇

    js 复制代码
    <template>
      <div :id="id" :style="{ height, width }" />
    </template>
    <script setup>
    import * as echarts from "echarts";
    
    let myChart = ref(null);
    
    const props = defineProps({
      // 区分chart
      id: {
        type: String,
        default: 'e-chart',
        required: true
      },
      // echarts 画布宽高
      width: {
        type: String,
        default: '100%',
      },
      height: {
        type: String,
        default: '300px',
      },
      // echarts loading
      loading: {
        type: Boolean,
        default: true,
      },
      // echarts需要得 options以及其他配置
      fullOptions: {
        type: Object,
        default: () => ({}),
        required: true
      },
    
    })
    
    
    //重绘图表函数
    const resizeHandler = () => {
      myChart.value.resize();
    }
    //设置防抖,保证无论拖动窗口大小,只执行一次获取浏览器宽高的方法
    const debounce = (fun, delay) => {
      let timer;
      return function () {
        if (timer) {
          clearTimeout(timer);
        }
        timer = setTimeout(() => {
          fun();
        }, delay);
      }
    };
    const cancalDebounce = debounce(resizeHandler, 50);
    
    
    //监听图表数据时候变化,重新渲染图表
    watch(() => [props.fullOptions.options, props.loading], () => {
      if (!props.loading) {
        myChart.value.hideLoading();
        myChart.value.setOption(props.fullOptions.options, true);
        nextTick(() => {
          cancalDebounce()
        })
      }
    }, { deep: true })
    
    
    //页面成功渲染,开始绘制图表
    onMounted(() => {
      //配置为 svg 形式,预防页面缩放而出现模糊问题;图表过于复杂时建议使用 Canvas
      myChart.value = echarts.init(document.getElementById(props.id), { renderer: 'svg' })
      //加载图标
      myChart.value.showLoading({
        text: '',
        color: '#409eff',
        textColor: '#000',
        maskColor: 'rgba(255, 255, 255, .95)',
        zlevel: 0,
        lineWidth: 2,
      });
      if (!props.loading) {
        myChart.value.hideLoading();
        myChart.value.setOption(props.fullOptions.options, true);
      }
      //自适应不同屏幕时改变图表尺寸
      window.addEventListener('resize', cancalDebounce);
    })
    //页面销毁前,销毁事件和实例
    onBeforeUnmount(() => {
      window.removeEventListener('resize', cancalDebounce)
      myChart.value.dispose()
    })
    
    </script>
  2. 添加echarts得options配置文件optionsConfig.js,代码如下👇

    js 复制代码
    export const chartOptions = {
    	// 推荐以setXXXOption方式命名
    	setDemoOption(data) {
            let color = ['#0E7CE2', '#FF8352', '#E271DE', '#F8456B', '#00FFFF', '#4AEAB0']
    	    let echartData = [
    	      {
    	        name: '安全帽佩戴报警',
    	        value: '13'
    	      },
    	      {
    	        name: '非法闯入报警',
    	        value: '33'
    	      },
    	      {
    	        name: 'C类',
    	        value: '13'
    	      },
    	      {
    	        name: 'D类',
    	        value: '13'
    	      }
    	    ]
    	
    	    let formatNumber = function (num) {
    	      let reg = /(?=(\B)(\d{3})+$)/g
    	      return num.toString().replace(reg, ',')
    	    }
    	
    	    const option = {
    	      color: color,
    	      // tooltip: {
    	      //     trigger: 'item'
    	      // },
    	      legend: {
    	        orient: 'vertical',
    	        icon: 'rect',
    	        x: '5%',
    	        y: 'center',
    	        itemWidth: 12,
    	        itemHeight: 12,
    	        align: 'left',
    	        textStyle: {
    	          rich: {
    	            name: {
    	              fontSize: 12,
    	              color: 'rgba(255, 255, 255, 0.7)'
    	            },
    	            value: {
    	              fontSize: 16,
    	              padding: [0, 5, 0, 5],
    	              color: 'rgba(255, 255, 255, 0.7)'
    	            },
    	            unit: {
    	              fontSize: 12
    	            }
    	          }
    	        },
    	        formatter: function (name) {
    	          let res = echartData.filter((v) => v.name === name)
    	          res = res[0] || {}
    	          let unit = res.unit || ''
    	          // return '{name|' + name + '}  {value|' + res.value + '}{unit|' + unit + '}'
    	          return '{name|' + name + '} '
    	        },
    	        data: echartData
    	      },
    	      series: [
    	        {
    	          type: 'pie',
    	          radius: ['20%', '40%'],
    	          center: ['65%', '60%'],
    	          color,
    	          data: echartData.map((item, index) => {
    	            return {
    	              label: {
    	                color: color[index]
    	              },
    	              ...item
    	            }
    	          }),
    	          hoverAnimation: false,
    	          itemStyle: {
    	            borderWidth: 2
    	          },
    	          labelLine: {
    	            show: true,
    	            length: 30,
    	            length2: 60,
    	            lineStyle: {
    	              color: '#0080ff'
    	            }
    	          },
    	          label: {
    	            show: true,
    	            formatter: (params) => {
    	              return '{icon|●}{name|' + params.name + '}{value|' + formatNumber(params.value) + '}'
    	            },
    	            padding: [0, -80, 25, -100],
    	            rich: {
    	              icon: {
    	                fontSize: 16
    	              },
    	              name: {
    	                fontSize: 12,
    	                padding: [0, 10, 0, 4]
    	              },
    	              value: {
    	                fontSize: 12,
    	                fontWeight: 'bold'
    	              }
    	            }
    	          }
    	        }
    	      ]
    	    }
    		return option
    	},
    
    }
  3. 在Vue视图中引入Echarts组件使用,代码示例如下👇

    html 复制代码
    <ECharts id="demoEcharts" width="500px" height="500px" :full-options="echartsOptions" :loading="loading"></ECharts>
    js 复制代码
    //引入echarts的options配置文件optionsConfig.js
    import { chartOptions } from '@/components/ECharts/optionsConfig.js'
    
    //定义loading、echarts配置项
    const loading = ref(true)
    const echartsOptions = reactive({
      options:{}
    })
    
    // 模拟异步
    setTimeout(() => {
      loading.value = false
      echartsOptions.options = chartOptions.setDemoOption();
    },500)

到这里就结束了,后续还会更新 前端 系列相关,还请持续关注!
感谢阅读,若有错误可以在下方评论区留言哦!!!

相关文章 👇
图表集
在Vue2项目中使用echarts

相关推荐
昙鱼3 分钟前
springboot创建web项目
java·前端·spring boot·后端·spring·maven
天天进步20159 分钟前
Vue项目重构实践:如何构建可维护的企业级应用
前端·vue.js·重构
2402_857583499 分钟前
“协同过滤技术实战”:网上书城系统的设计与实现
java·开发语言·vue.js·科技·mfc
小华同学ai12 分钟前
vue-office:Star 4.2k,款支持多种Office文件预览的Vue组件库,一站式Office文件预览方案,真心不错
前端·javascript·vue.js·开源·github·office
APP 肖提莫13 分钟前
MyBatis-Plus分页拦截器,源码的重构(重构total总数的计算逻辑)
java·前端·算法
问道飞鱼24 分钟前
【前端知识】强大的js动画组件anime.js
开发语言·前端·javascript·anime.js
k093326 分钟前
vue中proxy代理配置(测试一)
前端·javascript·vue.js
傻小胖27 分钟前
React 脚手架使用指南
前端·react.js·前端框架
程序员海军40 分钟前
2024 Nuxt3 年度生态总结
前端·nuxt.js
m0_748256781 小时前
SpringBoot 依赖之Spring Web
前端·spring boot·spring