在公司做数据可视化需求的时候用到了echarts框架,下面是自己使用Vue结合echarts的封装成一个可复用的组件的一些方法。
首先在自己的项目中安装echarts、安装命令为:
1
|
npm install echarts --save |
之后在Vue项目中使用,比如现在这个组件的名字叫:EchartsComponent.vue,代码如下
<template>
<div>
<div style="width:100%;height:100%;" :id="echarts" class="echarts" ref="echarts"></div>
</div>
</template>
<script>
// 引入echarts
//import echarts from 'echarts'
import * as echarts from 'echarts'
export default {
name: 'EchartsComponents',
props: {
// 接收父组件传递过来的信息
chartData: {
type: Array,
default: () => []
}
},
data() {
return {}
},
methods: {
drawChart() {
const vm = this
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById(this.echarts))
// 绘制图表
myChart.setOption({
title: {
text: 'ECharts 入门示例'
},
tooltip: {},
xAxis: {
data: this.chartData
},
yAxis: {},
series: [
{
name: '销量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}
]
})
}
},
computed: {
echarts() {
return 'echarts' + Math.random() * 100000
}
},
mounted: function() {
const vm = this
vm.$nextTick(() => {
vm.drawChart()
})
},
created: () => {
}
}
</script>
<style scoped>
</style>
这个组件在写的时候需要有几个注意的地方:
- 使用echarts.init这个方法来创建一个 ECharts 实例,返回 echartinstance,不能在单个容器上初始化多个 ECharts 实例,因此需要用到Vue的computed属性来解决这个问题
- 因为把它封装成了一个Vue组件,因此要注意父子组件之间的通信、需要用到props这个属性
- 在Vue的生命周期mounted执行,并且在this.$nextTick里面执行这个方法,保证承若所有的子组件被挂载、能保证通过获取到组件
然后在父组件中调用、这里比如父组件为Test.vue,代码如下所示
<template> <div> <Row> <i-col span="12"><EchartsCoponent :chartData="chartData1"/></i-col> <i-col span="12"><EchartsCoponent :chartData="chartData2"/></i-col> </Row> </div> </template> <script> import EchartsCoponent from './EchartsComponent' export default { name: 'Test', data () { return { chartData1: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子'], chartData2: ['苹果', '香蕉', '橘子', '梨子', '樱桃', '哈密瓜'] } }, components: { EchartsCoponent }, mounted: function() { const vm = this vm.$nextTick(()=> {}) } } </script> <style scoped> </style>
里面使用到一些iview的样式
这里需要注意的是需要把EchartsCoponent这个组件在Vue的components属性里面注册一下:
在页面中的效果如下:
还有第二种方法写组件,EchartsComponent.vue,代码如下:
<template> <div> <div style="width:50%;height:200px;" ref="echarts"></div> </div> </template> <script>
import * as echarts from 'echarts'
export default { name: 'EchartsComponents', props: { chartData: { type: Array, default: ()=>[] } }, data () { return { count:1 } }, methods: { drawChart () { const vm = this // 基于准备好的dom,初始化echarts实例 var myChart = echarts.init(this.$refs.echarts) // 绘制图表 myChart.setOption({ title: { text: 'ECharts 入门示例' }, tooltip: {}, xAxis: { data: this.chartData }, yAxis: {}, series: [ { name: '销量', type: 'bar', data: [5, 20, 36, 10, 10, 20] } ] }) } }, computed: {}, mounted: function () { const vm = this vm.$nextTick(()=> { vm.drawChart() }) }, created: () => {} } </script> <style scoped> </style>
主要使用到vue的ref属性,不需要使用到计算属性:
test.vue中代码一样、最中实现的效果是一样的;
转自:https://www.cnblogs.com/fanzhanxiang/p/10085821.html