关于vue一个页面中复用同一个echarts组件的问题

发布于:2022-10-26 ⋅ 阅读:(566) ⋅ 点赞:(0)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、为什么需要封装同一个echarts组件,以及为什么会出现复用同一个echarts会只显示一个?

二、解决

1.引入封装的echarts组件,主要传递的是需要展示的不同的数据

​编辑

2.主要封装的eacharts组件

总结


前言

例如:本文介绍了复用同一个eacharts组件,只会显示一个图表的问题。

一、为什么需要封装同一个echarts组件,以及为什么会出现复用同一个echarts会只显示一个?

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

1.在一个vue页面中,用到同一个样式的echarts图,只是数据不同,就可以将这个echarts封装成一个组件,往里面传数据就可以.

例如:

 

2.当组件封装好后,使用如下,会出现只显示一个组件的问题(我感觉出现这个原因,是因为只有一个元素节点(比如id),导致复用都覆盖了;如果通过动态传id的名字,则会导致,在mounted执行报错)

 

serviceMonitoring为封装的echarts组件

二、解决

1.引入封装的echarts组件,主要传递的是需要展示的不同的数据

代码如下(示例):

  <serviceMonitoring :xArr="aa" :yArr="cc"></serviceMonitoring>
  <serviceMonitoring :xArr="bb" :yArr="ee"></serviceMonitoring>

 

2.主要封装的eacharts组件

1.首先,将id设置为动态的,这个aa(请忽略粗略的命名)是需要唯一的,我是通过uuid,指定的aa的唯一值.props主要是接收传来的x轴,y轴需要展示的数据


 2.在methods里面定义一个,获取uuid的方法.将值赋值给id,作为唯一的id值,在mounted里面调用初始化echarts的方法,并且将id传到初始化方法里面

 

3.这是用唯一id的代码,以及用掺入的

 

 

4.主要代码

(4.1)父组件复用

<div class="middle">
       <serviceMonitoring :xArr="aa" :yArr="cc"></serviceMonitoring>
       <serviceMonitoring :xArr="bb" :yArr="ee"></serviceMonitoring>
 </div>

(4.2)子组件的代码

<template>
    <div>
        <div :id="aa" style="width:660px;height:500px"></div>
    </div>
</template>

<script>
    import echarts from 'echarts'

    export default {

        data() {

            return {
                chartJkfb: null,
                aa: ''
            }

        },
        props: {
            xArr: {
                type: Array
            },
            yArr: {
                type: Array
            }
        },
        computed: {},
        created() {
            this.aa = this.guid()
        },
        mounted() {
            this.initJkChart(this.aa)
        },
        methods: {
            guid() {
                return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
                    var r = Math.random() * 16 | 0,
                        v = c == 'x' ? r : (r & 0x3 | 0x8);
                    return v.toString(16);
                });
            },
            // 调度监控第一个图
            initJkChart(aa) {
                debugger
                //   this.chartSize(document.getElementById('echartsBc'), document.getElementById('chart'))
                this.chartJkfb = echarts.init(document.getElementById(aa), 'chalk')
                // 对图标初始化配置的控制
                //柱条的颜色,每个柱条颜色不同
                var lineColor = [
                    "#5894E5",
                    "#61C3D2",
                    "#EF8B6A",
                    "#CFAC5A ",
                ]
                const initOption = {
                    grid: { // 边距
                        left: '8%',
                        right: '5%',
                        bottom: '3%',
                        top: '12%',
                        containLabel: true
                    },

                    xAxis: {
                        type: 'category',

                        data: this.xArr,

                        axisLabel: {// 轴文字的配置
                            show: true,
                            textStyle: {
                                color: '#767676',
                                fontSize: '18'
                            },
                            interval: 0,
                            formatter: function (value) {
                                var ret = "";//拼接加\n返回的类目项  
                                var maxLength = 5;//每项显示文字个数  
                                var valLength = value.length;//X轴类目项的文字个数  
                                var rowN = Math.ceil(valLength / maxLength); //类目项需要换行的行数  
                                if (rowN > 1)//如果类目项的文字大于5,  
                                {
                                    for (var i = 0; i < rowN; i++) {
                                        var temp = "";//每次截取的字符串  
                                        var start = i * maxLength;//开始截取的位置  
                                        var end = start + maxLength;//结束截取的位置  
                                        //这里也可以加一个是否是最后一行的判断,但是不加也没有影响,那就不加吧  
                                        temp = value.substring(start, end) + "\n";
                                        ret += temp; //凭借最终的字符串  
                                    }
                                    return ret;
                                }
                                else {
                                    return value;
                                }
                            }

                        },

                        axisTick: {
                            alignWithLabel: false,
                            show: false
                        },
                        axisLine: {
                            show: true,//不显示y轴的线
                            lineStyle: {
                                color: "rgba(171,171,171,0.66)"
                            }
                        },
                    },
                    yAxis: {
                        type: 'value',
                        // type: 'category',
                        // inverse: true, //数组翻转显示
                        // data: ['战略发展', '业务运营', '管理支持', '数据业务'],
                        // offset: 20,
                        axisLabel: {// 轴文字的配置
                            show: true,
                            textStyle: {
                                color: '#767676',
                                fontSize: '18',
                                // fontFamily: "SourceHanSansCN-Normal;"
                            }
                        },
                        // splitLine: { show: false },
                        axisTick: {
                            alignWithLabel: true,
                            show: false
                        },
                        axisLine: {
                            lineStyle: {
                                color: "rgba(171,171,171,0.66)"
                            },
                            show: true //不显示y轴的线
                        },



                    },
                    series: [
                        {

                            data: this.yArr,
                            type: 'bar',
                            showBackground: true,
                            barWidth: 20, // 柱图宽度
                            backgroundStyle: {
                                color: 'rgba(180, 180, 180, 0.2)',
                                barBorderRadius: [10, 10, 10, 10] // 背景圆角
                            },
                            itemStyle: {
                                barBorderRadius: [10, 10, 10, 10], // 背景圆角
                                color: function (params) {
                                    return lineColor[params.dataIndex]
                                }
                            }

                        }
                    ]
                }
                this.chartJkfb.setOption(initOption)
                window.addEventListener('resize', () => {
                    if (this.chartJkfb) {
                        this.chartJkfb.resize()
                    }
                })
            },
        }

    }

</script>

<style lang="scss" scoped></style>

总结

以上就是今天要讲的内容,本文仅仅简单介绍了同一个echarts复用的问题,如果有什么更好的想法,欢迎指教.

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

微信公众号

今日签到

点亮在社区的每一天
去签到