大屏组件—多柱状图echart

一、 组件介绍

1.1 组件技术栈

vue2+webpack+echart

1.2 组件源码

<template>
    <!-- 多柱状图模型 -->
    <div class="chart-container" ref="chartsContainer" :id="chartId"></div>
</template>

<script>
const echarts = require('echarts/lib/echarts')
const seriesTemplate = { // series相同配置
    type: 'bar',
    color: '#247FFF',
    showBackground: true,
    backgroundStyle: {
        color: 'rgba(255,255,255,0.1)'
    },
}
export default {
    name: 'MultipleBarChart',
    props: {
        viewData: {
            type: Array,
            default: () => [],
        },
        chartId: { // chart id
            type: String,
            default: ''
        },
    },
    data: function () {
        return {
            series:[],
            xData:[]
        }
    },
    mounted() { },
    methods: {
        queryData(){ // 对传过来的数据进行解析
            let sumArr = []
            let chartData = this.viewData[0] // 柱状图数据
            let chartColor = this.viewData[1] // 柱状图颜色
            let keysArray = Object.keys(chartData);
            for (var i = 0; i < keysArray.length; i++) {
                let currentArr = [] // 实际值
                let preidctArr = [] // 预估值
                chartData[keysArray[i]].forEach(item => {
                    currentArr.push({ name: item.tagName, value: item.tagNum ,...item })
                    preidctArr.push({ name: item.tagName, value: item.predictNum, ...item })
                    // preidctArr.push(item.predictNum)
                    // debugger
                    if(i==0){ // x轴赋值,用第一个就行
                        this.xData.push(item.timeRange)
                    }

                })
                sumArr.push({
                    name: keysArray[i],
                    currentArr: currentArr,
                    preidctArr: preidctArr
                })
            }
            let sumArrLength = sumArr.length
            sumArr.forEach(item => {
                this.series.push({
                    name: item.name,
                    ...seriesTemplate,
                    data: item.currentArr,
                    barWidth:sumArrLength>2?10:12,
                    itemStyle: {
                        borderRadius: 2,
                        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                            { offset: 0, color: chartColor[item.name][0] },
                            { offset: 1, color: chartColor[item.name][1] },
                        ])
                    },
                }, {
                    name: item.name,
                    ...seriesTemplate,
                    barWidth: sumArrLength > 2 ? 10 : 12,
                    xAxisIndex: 1,
                    data: item.preidctArr,
                    tooltip:{
                        show:false
                    },
                    itemStyle: {
                        borderRadius: 2,
                        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                            { offset: 0, color: chartColor[item.name][0] },
                            { offset: 1, color: chartColor[item.name][1] },
                        ]),
                        opacity: 0.4
                    },
                },)
            })
            this.initEcharts()
        },
        initEcharts() {
            const option = {
                //你的代码
                tooltip: {
                    trigger: 'axis',//触发类型 柱状图
                    axisPointer: { type: 'shadow' }, //触发效果 移动上去 背景效果
                    formatter: (params) => {    // 自定义图例
                        return this.getTipFormatter(params);
                    },
                },
                legend: {
                    top: '3%',
                    textStyle: {
                        color: 'white'
                    },
                    type: 'plain',
                    icon: 'rect',
                    itemWidth: 12,
                    itemHeight: 12,
                    left: '10%',
                },
                xAxis: [
                    {
                        splitLine: {
                            show: false,
                        },
                        axisTick: {
                            show: false
                        },
                        axisLine: {
                            show: true,
                            lineStyle: {
                                color: '#55778E',
                            }
                        },
                        axisLabel: {
                            textStyle: {
                                fontFamily: 'Microsoft YaHei',
                                color: '#A2B0B8'
                            },
                            fontStyle: 'italic',
                            interval: 0,//使x轴文字显示全
                        },
                        type: 'category',
                        data: this.xData,

                    },
                    //背景柱体,不显示数据在图表中,只显示背景色
                    {
                        type: 'category',
                        show: false,
                        data: this.xData
                    }
                ],
                yAxis: {
                    name: '',
                    nameTextStyle: {
                        color: '#666',
                        fontSize: 12,
                        lineHeight: 40,
                    },
                    type: 'value',
                    min: 0,
                    axisLine: {
                        show: false,
                    },
                    axisLabel: {
                        color: '#A2B0B8',
                        fontSize: 12
                    },
                    splitLine: {
                        show: true,
                        lineStyle: {
                            color: '#556175',
                            type: 'dashed',
                        }
                    },
                    axisTick: {
                        show: false
                    },
                },
                grid: {
                    left: '10%',
                    right: '10%',
                    bottom: '4%',
                    top: '10%',
                    containLabel: true
                },
                series: this.series
            };
            const myCharts = echarts.init(document.getElementById(this.chartId));

            myCharts.showLoading({
                text: '',
                color: '#17A7F9',
                textColor: '#17A7F9 ',
                maskColor: '#0D1123',
                zlevel: 0,
            })
            setTimeout(() => {
                myCharts.hideLoading();
                myCharts.setOption(option)
            }, 1000);
            const chartObserver = new ResizeObserver(() => {
                myCharts.resize();
            });
            chartObserver.observe(document.getElementById(this.chartId));
        },
        getTipFormatter(params) { // 自定义tooltip
            // debugger
            let arr = []
            let chartColor = this.viewData[1] // 柱状图颜色
           
            if (params && params instanceof Array){
            // tooltip自定义
                params.forEach(item=>{
                    const obj = item.data
                    let marker = `<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background:linear-gradient(180deg,${chartColor[item.seriesName][0]} 0%, ${chartColor[item.seriesName][1]} 100%)" > </span>` 
                    if (this.tooltip == 'jcjy_business') { // 检查检验业务类型
                        arr.push(`${marker}${item.seriesName}<br/>服务人次 ${obj.tagNum}<br/>服务占比 ${obj.tagNumPercent}<br/>`)
                    }
                    if (this.tooltip == 'dzcf_pay'){ // 电子处方支付类型
                        arr.push(`${marker}${item.seriesName}<br/>处方量 ${obj.tagNum}<br/>处方占比 ${obj.tagNumPercent}<br/>处方金额 ${obj.tagPrice}<br/>处方占比 ${obj.tagPricePercent}<br/>`)
                    }
                    if (this.tooltip == ''){ // 默认
                        arr.push(`${marker}${item.seriesName}<br/>服务人次 ${obj.tagNum}<br/>服务占比 ${obj.tagNumPercent}<br/>服务金额 ${obj.tagPrice}<br/>`)
                    }
                   
                })
                return arr.join("");
            }
        },
    },
    watch: {
        viewData: {
            handler: function (val, valOld) {
                if (val && val.length > 0) {
                  this.xData = []
                  this.series = []
                    this.queryData()
                }
            },
            deep: true,
            immediate: true,
        }
    }
}
</script>

1.3 组件内容

多柱状图echart, 支持含有预估值、每条柱动态配色

1.4 prop参数

二、 使用方法

2.1 组件的引用

 <MultipleBarChart  chartId="dzcfSendChart" :viewData="viewData"></MultipleBarChart>

2.2 组件初始化

let Array1 = [{tagName:'自提',tagNum:13,predictNum:12,timeRange:'2011'}]
let Array2 = [{tagName:'配送',tagNum:13,predictNum:12,timeRange:'2011'}]
this.viewData = [{ '自提':Array1, '配送': Array2}, { '自提': ['#58DFD1', '#3179D6'], '配送': ['#F3AB3C', '#EC7100'] }] 
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容