目录:
- 效果图
- 封装Echart组件
- 父组件传递值
- 根据不同的组件传值显示echarts图形
一、效果图
有坐标轴的图标
- 数据格式
//类目轴 xAxis: { data: {}, type: 'catagory', }, //数据部分 yAxis: { type: 'value' }, series: []
没坐标轴的图标
- 数据格式
{ series: [] }
二、 封装Echart组件
封装 Echarts.vue组件

<template> <div style="height: 100%" ref="echarts"> <!--ref添加属性元素,通过vm.$ref获取dom元素--> echarts </div> </template> <script> import echarts from 'echarts' export default { props: { chartData: { //定义从父组件传过来的值 type: Object, default(){ return { xData: [], series: [] } } }, isAxisChart: { //判断是否有坐标轴,判断是否是饼图 type: Boolean, default: true } }, computed: { options() { //通过计算属性来判断是不是有坐标 return this.isAxisChart ? this.axisOptions : this.normalOptions } }, data(){ return { //动态传入的参数定义出来 echarts: null, axisOptions: { xAxis: [ { type: 'category', data: [] } ], yAxis: [ { type: 'value' } ], series: [] }, normalOptions: { series: [] } } }, watch: { //监听数据,当我们数据发生变化时再去更新数据 chartData: { handler: function () { this.initChart(); }, deep: true } }, methods: { initChart(){ //初始化echarts this.initChartData(); if(this.echarts){ this.echarts.setOption(this.options) }else { this.echarts = echarts.init(this.$refs.echarts); this.echarts.setOption(this.options) } }, initChartData(){ //初始化数据 if(this.isAxisChart) { this.axisOptions.xAxis.data = this.chartData.xData; this.axisOptions.series = this.chartData.series; }else { console.log('normal'); } } } } </script>
三、父组件传递值
说明:父组件通过传chartData 传给 Echarts.vue组件,来渲染 成图表

<template> <div> <el-row class="home" :gutter="20"> <el-col :span="8"> ..... </el-col> <el-col :span="16"> <div class="num"> ..... </div> <el-card shadow="hover"> <echarts style="height: 280px" :chartData="echartsData.order"></echarts> <!--使用echarts组件,chartData通过props传给子组件渲染--> </el-card> <div class="graph"> <el-card shadow="hover"> <echarts style="height: 260px"></echarts> <!--使用echarts组件--> </el-card> <el-card shadow="hover"> <echarts style="height: 260px"></echarts> <!--使用echarts组件--> </el-card> </div> </el-col> </el-row> </div> </template> <script> .... import Echarts from '../../common/Echart' //导入echarts组件 export default { components:{ Echarts //注册Rcharts组件 }, data(){ return { ...., echartsData: { //保存我们echarts数据 order: { xData: [], series: [] }, user: { xData: [], series: [] }, video: { series: [] } } } }, methods: { getTableData(){ this.$http.get('/home/getData').then(res => { ..... //订单折线图 const order = res.data.orderData; this.echartsData.order.xData = order; //1.取出series中的name部分->键名 let keyArray = Object.keys(order[0]); //获取对象中所有key名,ES6的语法 //console.log(keyArray); keyArray.forEach(key => { //通过map获取value的值 this.echartsData.order.series.push({ name:key === 'wechat' ? '小程序' : key, data: order.map(item => item[key]), type: 'line' }) }); }); } }, created() { this.getTableData(); } } </script>
四、根据不同的组件传值显示echarts图形
说明:我们其实就是用一个 Echarts.vue,根据echarts的dom去判断,我们完善的代码,=> Home.vue
<template> <div> <el-row class="home" :gutter="20"> <el-col :span="8"> ..... </div> <el-card shadow="hover"><!--根据不同的传值,输出对应的图形--> <echarts style="height: 280px" :chartData="echartsData.order"></echarts> </el-card> <div class="graph"> <el-card shadow="hover"> <echarts style="height: 260px" :chartData="echartsData.user"></echarts> </el-card> <el-card shadow="hover"> <echarts style="height: 260px" :chartData="echartsData.video"></echarts> </el-card> </div> </el-col> </el-row> </div> </template> <script> import '../../assets/css/home.css' import Echarts from '../../common/Echart' export default { components:{ Echarts }, data(){ return { ...., methods: { getTableData(){ this.$http.get('/home/getData').then(res => { .... //用户柱状图 this.echartsData.user.xData = res.data.userData.date; this.echartsData.user.series.push({ name: '新增用户', data: res.data.userData.data.map(item => item.new), type: 'bar' }); this.echartsData.user.series.push({ name: '活动用户', data: res.data.userData.data.map(item => item.active), type: 'bar' }); //视频饼图 this.echartsData.video.series.push({ data: res.data.videoData, type: 'bar' }) }); } }, created() { this.getTableData(); } } </script>
如图: