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