目錄:
- 效果圖
- 封裝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>
如圖: