vue项目中在同一页面多次引入同一个echarts图表子组件的自适应问题

摘要:
在父组件页面上,我们介绍了两次显示图表子组件的效果:因为它是宽度和高度的百分比,所以当窗口发生变化时,图表需要自适应,因此出现了本讨论中的问题。)//监视窗口更改-仅刷新上一个图表窗口。refresh=()=˃{this.pieEcharts.onzize();}正如你所看到的,只有第二个改变了,它将自动居中并适应大小。2.同时刷新多个图表时time://The侦听器窗口更改-当同时刷新多个图表时,窗口将更改。addEventListener同时更改!

 在父组件页面引入两次该图表子组件显示的效果:

vue项目中在同一页面多次引入同一个echarts图表子组件的自适应问题第1张    

 由于是百分比宽高,所以在窗口发生变化时,需要让图表也跟着自适应,所以才出现了本次讨论的问题啦。

 先看下完整的图表子组件代码(在父组件就是直接引入,不需要传参哦):

<template>
    <div ref="pieDom" style=" 100%;height: 100%;"></div>
</template>

<script>
    export default {
        data () {
            return {
                pieEcharts: "",
                pieOption: {},
                datas: [],
                hideColor: '#6f76ac'
            }
        },
        mounted() {
            this.datas = [
                {
                    value: 20,
                    name: "25%"
                },
                {
                    value: 80,
                    name: "75%"
                }
            ];

            this.pieEcharts = this.$echarts.init( this.$refs.pieDom );
            this.setPieOption();
            this.setPieEvents();
        },
        methods: {
            setPieOption(){
                this.pieOption = {
                    color: ['#ff106e', this.hideColor],   //环形的分段色值设置
                    tooltip: {
                        trigger: 'item',
                        position: (point, params, dom, rect, size)=> {
                            return [point[0], point[1]];
                        },
                    },
                    series: [{
                        type: 'pie',
                        radius: ['60%', '80%'], //内存 、外层
                        avoidLabelOverlap: false,
                        hoverAnimation: true,
                        hoverOffset: 2,
                        label: {
                            normal: {
                                show: false, //中间的标签
                                position: 'center',
                                textStyle: {
                                    fontSize: '18',
                                    fontWeight: 'bold'
                                }
                            },
                            emphasis: {
                                show: true,
                                textStyle: {
                                    fontSize: '20',
                                    fontWeight: 'bold'
                                }
                            }
                        },
                        labelLine: {
                            normal: {
                                show: false
                            }
                        },
                        selectedOffset: 0,
                        itemStyle: {
                            emphasis: {
                                
                            },
                        },
                        data: this.datas
                    }]
                };
                // 渲染图表
                this.pieEcharts.setOption( this.pieOption );
            },
            /**
             * 设置图表的事件
             */
            setPieEvents(){
                /**
                 * 刷新时默认显示第一条
                 */
                this.pieEcharts.dispatchAction(
                    {
                        type: 'highlight',
                        seriesIndex: 0,
                        dataIndex: 0
                    }
                );
                /**
                 * 鼠标移入图表时,不为第一条时就取消第一条的高亮效果
                 */
                this.pieEcharts.on('mouseover',(v) => {
                    if(v.dataIndex != 0){
                        this.pieEcharts.dispatchAction({
                            type: 'downplay',
                            seriesIndex: 0,
                            dataIndex: 0
                        });
                    }
                });
                /**
                 * 鼠标图表时默认显示第一条
                 */
                this.pieEcharts.on('mouseout',(v) => {
                    this.pieEcharts.dispatchAction(
                        {
                            type: 'highlight',
                            seriesIndex: 0,
                            dataIndex: 0
                        }
                    );
                });
                // 监听窗口变化 - 只刷新最后一个图表
                window.onresize = ()=> {
                    this.pieEcharts.resize();
                }

                // 监听窗口变化 - 多个图表同时刷新
                window.addEventListener('resize', ()=> {
                    this.pieEcharts.resize();
                })
            },
        }
    }
</script>

<style scoped>
    
</style>

窗口改变时图表自适应代码在最后,这里分别提出来做说明:

1. 只刷新最后一个图表的情况:(第二种情况的代码记得注释!)

                // 监听窗口变化 - 只刷新最后一个图表
                window.onresize = ()=> {
                    this.pieEcharts.resize();
                }

vue项目中在同一页面多次引入同一个echarts图表子组件的自适应问题第2张    vue项目中在同一页面多次引入同一个echarts图表子组件的自适应问题第3张

可以看到,只有第二个才发生了变化,而且会自动居中和适应大小

 2. 多个图表同时刷新的情况:

                // 监听窗口变化 - 多个图表同时刷新
                window.addEventListener('resize', ()=> {
                    this.pieEcharts.resize();
                })

 vue项目中在同一页面多次引入同一个echarts图表子组件的自适应问题第4张   vue项目中在同一页面多次引入同一个echarts图表子组件的自适应问题第5张

两个同时变化了哦!

但是为什么两个监听方法会有这样不同的效果呢??? 这个有空的时候再研究。。。知道的朋友可以留言告诉我哦,万分感谢

免责声明:文章转载自《vue项目中在同一页面多次引入同一个echarts图表子组件的自适应问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇解析UML九种图CentOS7安装桌面环境 并支持远程访问下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue中Axios的封装和API接口的管理

前端小白的声明: 这篇文章为转载:主要是为了方便自己查阅学习。如果对原博主造成侵犯,我会立即删除。 转载地址:点击查看 如图,面对一团糟代码的你~~~真的想说,What F~U~C~K!!! 回归正题,我们所要的说的axios查看更多关于 axios 的文章 的封装和api接口的统一管理,其实主要目的就是在帮助我们简化代码和利于后期的更新维护。 一、ax...

基于Idea从零搭建一个最简单的vue项目

一、需要了解的基本知识 node.js Node.js是一个Javascript运行环境(runtime),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。Node.js对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境下运行得更好。V8引擎执行Javascript的速度非常快,性能非常好。 No...

Vue项目中左右布局支持拉伸宽度

<template> <el-row :gutter="10"> <el-col :span="5" v-show="type === '2' && sidebar.opened" > <data-tree :t...

vuex页面刷新数据丢失的解决办法

在vue项目中用vuex来做全局的状态管理, 发现当刷新网页后,保存在vuex实例store里的数据会丢失。 原因: 因为store里的数据是保存在运行内存中的,当页面刷新时,页面会重新加载vue实例,store里面的数据就会被重新赋值初始化 解决思路: 将state的数据保存在localstorage、sessionstorage或cookie中(三者...

vue组件传值:父组件异步获取数据传递给子组件 吴小明

1、给子组件加上v-if 2、通过ref将异步获取的值赋值给子组件中对应的参数 3、子组件中通过watch监听props的值(或computed)-----常用 props: { data: { type: Object }},computed: { list() { const { id } = this.data r...

vue组件实现简单的路由

首先在当前项目下安装依赖包,运行npm install  vue-router  则package.json中添加了vue-router 此时在src 下的index.js主程序中引入vue-router,同时告诉Vue使用此路由配置 1 import VueRouter from "vue-router" 2 Vue.use(VueRouter); 在i...