项目场景:

数据可视化开发,采用的技术栈是vue3+echarts+router。


问题描述:

在vue2中,才开始开发数据可视化大屏,都是用echarts,之后改用为vue-echarts组件,但是到了vue3之后,组件会有一些小问题,所以准备自己封装一套简易的vue-echarts组件,其他的功能之后再迭代上去,足够项目使用即可。


代码封装:

<template>
    <div class="echarts" :id="id"></div>
</template>

这里的echarts组件的id应该每个组件不同,因此id值为动态设置的。

<script>
import { onMounted } from 'vue'
import { uuid } from '../../utils/index'
import Echarts from 'echarts'

export default {
  name: 'TwokeVueEcharts',
  props: {
    options: {
        type: Object,
        default: () => ({})
    }
  },
  setup (ctx) {      
    const id = `vue-echarts-${uuid()}`
    let chart = null
    
    const initEcharts = () => {
        if (!chart) {
            const dom = document.getElementById(id)
            chart = Echarts.init(dom)       
        }else {
            return 
        }
        if(!ctx.options) return 
        chart.setOption(ctx.options)     
    }
    onMounted( () => {
        initEcharts()
    })
    return {
        id
    }
  }
}
</script>

这里可以看到我引入了uuid的工具类,是为了生成唯一的id值,这里也可用时间戳搭配前缀来实现。返回id值以供视图渲染。引入的echarts为echarts官方组件

<style lang="scss" scoped>
.echarts {
    width: 100%;
    height: 100%;
}
</style>

这里是让echarts组件可以根据外面的容器大小,铺满展示。


组件使用

两种方式:

全局安装

main.js中

import TwokeVueEcharts from './TwokeVueEcharts.vue'
import { createApp } from 'vue'
import App from './App.vue'

createApp(App).component("vue-echarts",TwokeVueEcharts).mount("#app")

组件中引入

<script>
import TwokeVueEcharts from './TwokeVueEcharts.vue'

export default {
	components: {
		TwokeVueEcharts 
	}
}
</script>
<template>
    <div style="width:300px;height:300px">
		<twoke-vue-echarts :options="options"></twoke-vue-echarts>
	</div>
</template>
<script>
import TwokeVueEcharts from './TwokeVueEcharts.vue'
export default {
  components: { TwokeVueEcharts },
  setup () {
    return {
      options: {
        tooltip: {
          trigger: 'item',
          formatter: '{a} <br/>{b}: {c} ({d}%)'
        },
        legend: {
          orient: 'vertical',
          left: 10,
          data: ['事件一 名称', '事件二 名称', '事件三 名称', '事件四 名称'],
          padding: [250, 6, 7, 8]
        },
        grid: {
          top: 0,
          left: 0,
          right: 0,
          bottom: 0
        },
        series: [
          {
            name: '访问来源',
            type: 'pie',
            radius: ['50%', '70%'],
            avoidLabelOverlap: false,
            label: {
              show: false,
              position: 'center'
            },
            emphasis: {
              label: {
                show: true,
                fontSize: '30',
                fontWeight: 'bold'
              }
            },
            labelLine: {
              show: false
            },
            data: [
              { value: 335, name: '事件一 名称' },
              { value: 310, name: '事件二 名称' },
              { value: 234, name: '事件三 名称' },
              { value: 135, name: '事件四 名称' }
            ]
          }
        ]
      }
    }
  }
}
</script>

在这里插入图片描述

Logo

前往低代码交流专区

更多推荐