vue3封装简易的vue-echarts
项目场景:数据可视化开发,采用的技术栈是vue3+echarts+router。问题描述:在vue2中,才开始开发数据可视化大屏,都是用echarts,之后改用为vue-echarts组件,但是到了vue3之后,组件会有一些小问题,所以准备自己封装一套简易的vue-echarts组件,其他的功能之后再迭代上去,足够项目使用即可。代码封装:<template><div class=
·
项目场景:
数据可视化开发,采用的技术栈是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>
更多推荐
已为社区贡献3条内容
所有评论(0)