2019-03-20 vue2.0 自定义 饼状图 (Echarts)组件

子组件

<!-- 自定义 echart 组件 -->
<template>
  <div>
    <!-- echart表格 -->
    <div :id="myChartId" :style="echartStyle"></div>
  </div>
</template>
 
<script>
import echarts from 'echarts';
  export default {
    props: {
      // ID
      myChartId: {
        type: String,
        default:'myChartId',
      },
      // 样式
      echartStyle: {
        type: String,
        default:''
      },
      // 标题文本
      titleText: {
        type: String,
        default: ''
      },
      // 提示框键名
      tooltipFormatter: {
        type: String,
        default: ''
      },
      // 扇形区域名称
      opinion: {
        type: Array,
        default(){
          return []
        }
      },
      // 提示框标题
      seriesName: {
        type: String,
        default: ''
      },
      // 扇形区域数据
      opinionData: {
        type: Array,
        default(){
          return []
        }
      },
    },
    data(){
      return {
        //
      }
    },
    watch: {
        opinionData(val,oldval){
          this.$nextTick(function() {
            this.drawPie(this.myChartId)
          })
        }
    },
    methods: {
      // 监听扇形图点击
      eConsole(param) {
        // 向父组件传值
        this.$emit("echarEvent",param);
      },
      // 绘制饼状图
      drawPie(id){
        this.charts = echarts.init(document.getElementById(id));
        this.charts.on("click", this.eConsole);
        console.log(this.opinion,this.opinionData)
        this.charts.setOption({
          title: {
            text: this.titleText, // 标题文本
            left: 'center'
          },
          tooltip : {},
          legend: {
            bottom: 20,
            left: 'center',
            data: this.opinion // 底部标签名称
          },
          series : [
            {
              name:this.seriesName,  // 提示框标题
              type: 'pie',
              radius : '65%',
              center: ['50%', '30%'],
              data:this.opinionData, // 扇形区域数据
              itemStyle: {
                emphasis: {
                  shadowBlur: 10,
                  shadowOffsetX: 0,
                  shadowColor: 'rgba(0, 0, 0, 0.5)'
                },
              }
            }
          ],
          color:[  '#aa5b71','#fd7d36','#f1ccb8','#f1b8e4','#ff9b6a','#b7d28d','#d9b8f1', ' #b8f1cc', '#b8f1ed', '#f1f1b8']
        })
      }
    }
  }
</script>

父组件引用示例

<style lang="less">
@import "./home.less";
@import "../../styles/common.less";
</style>
<template>
    <Row>
        <Col span="8">
            <draw-pie
              :myChartId="'mychart1'"
              :echartStyle="'width:300px;height:500px;'"
              :titleText="drawPieInfo.titleText"
              :opinionData="drawPieInfo.opinionData"
              @echarEvent="echarEvent"
            ></draw-pie>
        </Col>
        <Col span="4">
        </Col>
    </Row>
</template>

<script>
import drawPie from '@/components/zhEchart/drawPie.vue'
import {
   countLawCase
} from '@/api/homeDate';

export default {
    name: 'home',
    components: {
        drawPie
    },
    data () {
        return {
            drawPieInfo: {
              titleText: "案件状态",
              subText: "总计",
              opinionData: {} //扇形数据
            },
            lawCaseCount:[],//案件状态
        };
    },
    mounted () {
      this.initChart();
    },
    methods: {
        initChart(){//初始化chart数据
            countLawCase().then(res=>{
               if(res.data.state==100){
                    let data=res.data.data;
                    this.lawCaseCount=data.lawCaseCount;
                    var that=this;
                    var ary=Object.keys(this.lawCaseCount).map(function (key) {
                        return {
                            name: key,
                            value: that.lawCaseCount[key]//获取扇形数据
                        }
                    });
                    this.drawPieInfo.opinionData=ary;//设置扇形数据
                    this.drawPieInfo.subText = "总计:" + this.getTotol(this.lawCaseCount); //设置总数
               }else{
                   this.$Message.error(res.data.message);
               }
            });
       },
       echarEvent(){

       },
       getTotol(ary) {
         //统计总数
         var totol = Object.keys(ary).reduce(function(all, key) {
           return all + ary[key];
         }, 0);
         return totol;
       },
    },
};
</script>

值得注意的是:由于echart数据依赖DOM更新,再次赋值时需要重新初始化echart,在父组件异步获取数据传入子组件时,要用watch监听传入的值并重新进行DOM渲染,数据更新了但视图并没有及时更新因此就需要$nextTick进行DOM监听来重新初始化echart

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一:什么是闭包?闭包的用处? (1)闭包就是能够读取其他函数内部变量的函数。在本质上,闭包就 是将函数内部和函数外...
    xuguibin阅读 10,025评论 1 52
  • 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的: 实例生命周期钩子 每个 Vue 实例...
    Timmy小石匠阅读 1,437评论 0 11
  • VUE介绍 Vue的特点构建用户界面,只关注View层简单易学,简洁、轻量、快速渐进式框架 框架VS库库,是一封装...
    多多酱_DuoDuo_阅读 2,853评论 1 17
  • 项目构建 java源代码 jdk提供的一系列基础jar包 第三方开发的jar包 构建要做的内容 准备jar包、编译...
    果芽软件阅读 312评论 0 4
  • 耳熟能详的影视剧,我想很多女孩都有很好的男朋友,像姐妹像哥们,从一开始就排除了爱情这个选项。总是自以为是的认为我们...
    mann阅读 195评论 0 1

友情链接更多精彩内容