Vue中实现echarts柱状图下钻

效果图

基础下钻
还原为初始
返回上一步

应用场景

需要实现数据下钻的,比如年销售额到月销售额,应用场景很多。

html
<template>
    <div class="chart">
        <div ref="chartEle" id="chart" style="width: 100%; height: 600px; margin: 0 auto;"></div>
        <div class="btn-box">
            <el-button @click="getChartData('month')">click</el-button>
            <el-button @click="reset">reset</el-button>
            <el-button @click="prev">prev</el-button>
        </div>
    </div>
</template>
js
    export default {
        name: "Chart",
        data() {
            return {
                myChart: null,
                status: 2,
                month: '01',
                date: '2019-01-01'
            }
        },
        mounted() {
            this.myChart = this.$echart.init(this.$refs.chartEle);

            this.clickChart();
        },
        methods: {
            //渲染图表
            renderChart(xData, yData, name) {
                let option = {
                    color: ['#bfccff'],
                    title: {
                        text: ''
                    },
                    tooltip: {},
                    xAxis: {
                        data: xData,
                        name: name
                    },
                    yAxis: {
                        name: 'sunlight'
                    },
                    series: [{
                        name: name,     //可以当做一个唯一的属性,用来判断当前的图表
                        type: name == 'h' ? 'line' : 'bar',
                        smooth: true,
                        barCategoryGap: '50%',
                        data: yData,
                        itemStyle: {
                            color: new this.$echart.graphic.LinearGradient(
                                0, 0, 0, 2,
                                [
                                    {offset: 0, color: '#C346C2'},
                                    {offset: 0.5, color: '#F5CBFF'}
                                ])
                        },
                        areaStyle: {}
                    }]
                };

                this.myChart.setOption(option);

                window.addEventListener('resize', () => {
                    this.myChart.resize();
                });
            },
            //获取图表数据
            getChartData(name) {
                const url = '/power/projPower/getAll';

                let data = {
                    'pid': 990,
                    'status': this.status,
                    'month': this.month,
                    'date': this.date
                };

                this.$ajax.get(url, {
                    'params': data
                }).then(res => {
                    if (res.code == 200) {
                        this.renderChart(res.data.times, res.data.number, name);
                    }
                })
            },
            //图表点击下钻
            clickChart() {
                this.myChart.on('click', params => {
                    switch (params.seriesName) {
                        case 'month':
                            this.status = 1;
                            this.month = params.name.length < 2 ? '0'.concat(params.name) : params.name;
                            this.getChartData('day');
                            break;
                        case 'day':
                            this.status = 0;
                            this.date = params.name.length < 2 ? '0'.concat(params.name) : params.name;
                            this.date = '2019-' + this.month + '-' + this.date;
                            this.getChartData('h');
                            break;
                        default:
                            break;
                    }
                })
            },
            //还原为最开始的数据
            reset() {
                this.status = 2;
                this.getChartData('month');
            },
            //返回上一步图表数据
            prev() {
                switch (this.status) {
                    case 1:
                        this.status = 2;
                        this.getChartData('month');
                        break;
                    case 0:
                        this.status = 1;
                        this.getChartData('day');
                        break;
                    default:
                        break;
                }
            }
        }
    }
实现原理

一、echarts实例对象独立声明且只有一次。
二、图表click事件写在渲染函数外面。
在我实现的过程中,降低耦合度很重要,代码能拆分的越简单越好,可以避免很多问题。

  • 5
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Vue使用echarts柱状图,可以通过以下步骤实现: 1. 引入echarts库。在Vue项目的入口文件,通过import echarts from 'arts'`引入ech库。 2. 在Vue组件一个canvas标签,作为echarts图表的容器。可以给该标签设置一个唯一的id属性,方便后续使用。 3. 在Vue组件的`mounted`生命周期钩函数,使用`this.$nextTick`方法确保DOM已经渲染完毕后再进行echarts初始化。 4. 在`mounted`钩函数,使用`echarts.init`方法初始化echarts实例,并将其绑定到之前创建的canvas标签上。 5. 定义一个数据对象,用于存储echarts的配置项。可以参考引用的示例,其`series`数组定义了每一个柱状图的详细数据,`xAxis`数组定义了x轴的数据。 6. 调用echarts实例的`setOption`方法,传入上述定义的数据对象,来配置柱状图的样式和数据。 完整的代码示例如下: ```javascript <template> <div> <canvas id="chart"></canvas> </div> </template> <script> import echarts from 'echarts' export default { mounted() { this.$nextTick(() => { const chartDom = document.getElementById('chart') const chart = echarts.init(chartDom) const data = { series: [ { name: "US", type: "bar", data: [1, 0, 0], // 其他配置项... } ], xAxis: [ { type: 'category', data: ['颅内肿瘤', '选项3', '异常'], // 其他配置项... } ], // 其他配置项... } chart.setOption(data) }) } } </script> ``` 以上代码,我们在Vue组件的模板创建了一个canvas标签,并设置了一个id为"chart"。在mounted钩函数,使用echarts.init方法初始化echarts实例,并将该实例绑定到canvas标签上。然后,定义一个数据对象,通过setOption方法将数据对象传入echarts实例,完成柱状图的配置和渲染。 请注意,以上代码只是一个简单的示例,具体的配置和样式可以根据实际需求进行修改。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [vue echarts生成柱状图](https://blog.csdn.net/outlierQiqi/article/details/110521210)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帝尊菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值