6-7 上手封裝一個EChart組件並處理數據展示圖表


目錄:

  • 效果圖
  • 封裝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>
Echarts.vue

三、父組件傳遞值

說明:父組件通過傳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>
Home.vue

四、根據不同的組件傳值顯示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>

 如圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM