echarts饼图组件

198 阅读1分钟

前提:存在多个饼图,为了避免代码冗余,开发一个饼图组件

因为项目中描述是另外写的,所以组件里面title等描述类型的都注释屏蔽掉了,主要还是要看自身项目需求,我这个的组件就只是一个单纯的饼图,没有title那些,如果有其他需要可以自己添加属性进行调整

vue项目需要安装echarts, npm install echarts --save

image.png

子组件 pieChart.vue

<template>
    <div class="">
        <div style="width: 120px; height: 120px;margin: 0 auto;" :id="id" class="echarts" ref="echarts"></div>
    </div>
</template>
<script>

import * as echarts from 'echarts';
export default {

    name: 'echartscom',

    // id --> 为了多图渲染

    // title --> 标题

    // chartData --> value数组

    // nameData --> name数组

    props: ['id', 'title', 'chartData', 'nameData','chartColor'],

    data() {

    return {

    arr: []

    };

    },

    methods: {

        drawCharts() {
            let chartColor = this.chartColor
            var myChart = echarts.init(document.getElementById(this.id));
            myChart.setOption({
            series: [
                {
                    name: '访问来源',
                    type: 'pie',
                    radius: '80%',
                    color: this.chartColor,
                    // center: ['50%', '60%'],
                    avoidLabelOverlap: false,
                    label: {
                        normal: {
                            // formatter: '{b}:{c}' + '\n\r' + '({d}%)',
                            formatter: function (param) {
                                console.log("text", param,chartColor)
                                let text = param.data.name;
                                if(!text.includes('其他')){
                                    return param.percent + '%'
                                }else{
                                    return ''
                                }
                            },
                        show: true,
                        // position: 'left'
                        position:'inside',
                        textStyle: {
                            // fontSize: 10,
                            fontSize: 12,
                            color: "#fff"
                        }
                    },
                    emphasis: {
                        show: true
                    }
                },
                    labelLine: {
                    show: true, //数据标签引导线
                    lineStyle: {
                        color: 'rgba(255, 255, 255, 0.3)'
                    },
                    normal: {
                        // 设置引导线
                        show: false
                        // length: 18
                    }
                },
                    data: this.arr
                }]
            });
            // window.addEventListener('resize', function () {
            // myChart.resize();
            // });

    },

        initData() {
            this.nameData.forEach((val, i) => {
                // 列数据
                this.chartData.forEach((item, index) => {
                    if (i == index) {
                        this.arr.push({
                            value: item,
                            name: val
                        });
                    }
                });
            });
        }
    },
    watch: {
        chartData: {
        // 在父组件数据发生改变后子组件要做到实时更新,就需要子组件用watch来监听数据的变化
        // 看情况是否需要newValue和oldValue之间值比较
            handler(newValue, oldValue) {
                    this.arr.length = 0;
                    this.initData();
                    this.drawCharts();
            },
            deep: true
        }
    },
    computed: {
        echarts() {
            return 'echarts' + Math.random() * 100000;
        }
    },
    mounted() {
        this.drawCharts();
    },
    beforeMount() {},
    beforeCreate() {},
    created() {
        this.initData();
    },
    components: {}

};

</script>

<style></style>

父组件引用子组件

<template>
    <Row :gutter="10" type="flex" justify="center" align="middle">
        <Col span="6">
            <p style="font-size:14px;font-weight:bold;text-align:center;"> 当日结案率:20/50</p>
            <pieChart id="today" :nameData="msg.rows" :chartData="msg.chartData" autoresize :chartColor="['#5976c4','#879ad7']" />
        </Col>
        <Col span="6">
            <p style="font-size:14px;font-weight:bold;text-align:center;"> 投诉结案率:15/45</p>
            <pieChart id="complaint" :nameData="msg.rows1" :chartData="msg.chartData1" autoresize :chartColor="['#ee6a6a','#f39393']" />
        </Col>
    </Row>
</template>


<script>
    import pieChart from './pieChart'
    
    export default {
        components: {
            pieChart
        },
        data(){
            return{
                msg: {
                    rows: ['投诉案件', '其他案件'],
                    chartData: [20, 30],
                    rows1: ['咨询案件', '其他案件'],
                    chartData1: [15, 30],
                },
            }
        }
    }
</script>