echarts饼图

发布于:2023-02-14 ⋅ 阅读:(587) ⋅ 点赞:(0)
<template>
    <div class="pie-wrap">
        <div class="pie" ref="pieEchart"></div>
    </div>
</template>
<script>
import * as $echarts from 'echarts'
export default {
    name: 'pieModule',
    props: {
        data: {
            type: String,
            required: true,
            default: '90%'
        },
        name: {
            type: String,
            required: true
        },
        radius: {
            type: Array,
            required: false,
            default: () => [
                ['50%', '60%']
            ]
        },
        fontSize: {
            type: Number,
            required: false,
            default: 14
        },
        outColorList: {
            type: Array,
            default: () => ['#000', '#fff']
        }
    },
    watch: {
        data: {
            deep: true,
            handler() {
                this.init();
            }
        }
    },
    data() {
        return {
            // 图表类型
            myEchart: null,
            // 图标配置项
            options: {
                tooltip: {show: false},
                title: {
                    textAlign: 'center',
                    x: '48%',
                    y: '30%',
                    textStyle: {
                        fontWeight: 'bold',
                        color: this.outColorList[0],
                        fontSize: '14'
                    }
                },
                legend: {
                    show: true,
                    data: [this.name],
                    icon: 'circle',
                    orient: 'horizontal',
                    itemWidth: 0,
                    itemHeight: 0,
                    right: 'center',
                    bottom: 'bottom',
                    align: 'right',
                    textStyle: {
                        color: "#081735"
                    }
                },
                series: [
                    {
                        name: this.name,
                        type: 'pie',
                        hoverAnimation: false,
                        center: ['50%', '40%'],
                        emphasis: {scale: false},
                        itemStyle: {},
                        label: {show: false},
                        labelLine: {show: false}
                    }
                ]
            }
        };
    },
    // 创建元素
    mounted() {
        this.init();
    },
    // 销毁
    destroyed() {
        // 销毁图表
        this.destroyedChart();
    },
    methods: {
        /**
         * @description 初始化的方法
         * @name init
         * @return {*} 无
         */
        init() {
            // 更新数据
            this.update(this.data);
        },
        /**
         * @description 刷新图表
         * @return {*} 无
         */
        refresh() {
            if (this.myEchart) {
                this.myEchart.resize();
            }
        },
        /**
         * @description 更新
         * @param {Object} data 图标数据
         * @name update
         * @return {*} 无
         */
        update(data) {
            // 如果不存在echarts
            if (!this.myEchart) {
                // 图表对象
                this.myEchart = $echarts.init(this.$refs.pieEchart);
                // 绑定resize 事件
                this.bindResizeEvent();
            }
            // 更新数据
            this.updateData(data);
            // 清空图表
            this.myEchart.clear();
            // 生成图表
            this.myEchart.setOption(this.options);
        },
        /**
         * @description 更新数据
         * @name updateData
         * @param {object} data 参数
         * @return {*} 无
         */
        updateData(data) {
            // 对数据进行赋值
            const colorName = ['outColorList'];
            let tempData = [];
            tempData.push(data.substring(0, data.length-1));
            tempData.push({value: 100 - this.data.substring(0, data.length-1)});
            this.options.series.forEach((item, index) => {
                item.data = tempData;
                item.itemStyle.color = (params) => this[colorName[index]][params.dataIndex];
                item.radius = this.radius[index];
            });
            this.options.title.text = `${this.data}`;
            this.options.title.textStyle.fontSize = this.fontSize;
        },
        /**
         * @description 事件处理函数
         * @name resizeHandler
         * @return {*} 无
         */
        resizeHandler() {
            if (this.myEchart) {
                this.myEchart.resize();
            }
        },
        /**
         * @description 绑定resize 事件
         * @name init
         * @return {*} 无
         */
        bindResizeEvent() {
            // 绑定resize事件
            window.addEventListener('resize', this.resizeHandler);
        },
        // 取消事件绑定
        unbindResizeEvent() {
            // 取消绑定resize事件
            window.removeEventListener('resize', this.resizeHandler);
        },
        /**
         * @description 销毁图表
         * @name destroyedChart
         * @return {*} 无
         */
        destroyedChart() {
            // 如果存在echarts
            if (this.myEchart) {
                // 销毁实例,销毁后实例无法再被使用。
                this.myEchart.dispose();
                this.myEchart = null;
                // 取消事件绑定
                this.unbindResizeEvent();
            }
        }
    }
};
</script>
<style lang="scss">
.pie-wrap {
    position: relative;
    width: 100%;
    height:100%;

    .pie {
        margin: 0 auto;
        width: 100px;
        height: 100px;
    }
}
</style>

<pie :name="'学习占比'" :data="'69%'" :out-color-list="['#0370ff', '#fff']"></pie>

在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看