vue echarts饼图封装以及同一个组件2个饼图不加载问题解决

0 环境

  • 系统:win10
  • 前端框架:vue
  • 前端IDE:vscode

1 饼图封装

1 安装echarts

npm install echarts --save

2 查看是否安装成功

  • 文件查看


    在vue项目根目录package.json查看
  • 界面查看(win+r --> 输入cmd --> 输入vue ui 等待启动)


    输入vue ui
查看依赖

3 在main.js中引入echarts

import echarts from "echarts";
Vue.prototype.$echarts = echarts;

2 封装组件

1 新建子组件

<!-- echartscom.vue -->
  <template>
    <div class="">
        <div style="width: 500px; height: 500px" :id="id" class="echarts" ref="echarts"></div>
    </div>
</template>
   
  <script>
import * as echarts from 'echarts';
require('echarts/theme/shine'); //引入主题

export default {
    name: 'echartscom',
    // id --> 为了多图渲染
    // title --> 标题
    // chartData --> value数组
    // nameData --> name数组
    props: ['id', 'title', 'chartData', 'nameData'],
    data() {
        return {
            arr: []
        };
    },
    methods: {
        drawCharts() {
            var myChart = echarts.init(document.getElementById(this.id));
            myChart.setOption({
                title: {
                    text: this.title,
                    subtext: '详情',
                    left: 'center'
                },
                tooltip: {
                    trigger: 'item',
                    formatter: '{a} <br/>{b}: {c} ({d}%)'
                },
                legend: {
                    orient: 'vertical',
                    x: 'left',
                    data: this.nameData
                },
                series: [
                    {
                        name: '访问来源',
                        type: 'pie',
                        radius: '40%',
                        center: ['50%', '60%'],
                        avoidLabelOverlap: false,
                        label: {
                            normal: {
                                formatter: '{b}:{c}' + '\n\r' + '({d}%)',
                                show: true,
                                position: 'left'
                            },
                            emphasis: {
                                show: true
                            }
                        },
                        labelLine: {
                            show: true, //数据标签引导线
                            lineStyle: {
                                color: 'rgba(255, 255, 255, 0.3)'
                            },
                            normal: {
                                // 设置引导线
                                show: true
                                // length: 18
                            }
                        },
                        data: this.arr
                    }
                ]
            });

            // window.addEventListener('resize', function () {
            //     myChart.resize();
            // });
        },
        initData() {
            this.nameData.forEach((val, i) => {
            // 列数据
                this.chartData.forEach((item, index) => {
                    if (i == index) {
                        this.arr.push({
                            value: item,
                            name: val
                        });
                    }
                });
            });
        }
    },
    watch: {
        chartData: {
            // 在父组件数据发生改变后子组件要做到实时更新,就需要子组件用watch来监听数据的变化
            // 看情况是否需要newValue和oldValue之间值比较
            handler(newValue, oldValue) {
                this.arr.length = 0;
                this.initData();
                this.drawCharts();
            },
            deep: true
        }
    },
    computed: {
        echarts() {
            return 'echarts' + Math.random() * 100000;
        }
    },
    mounted() {
        this.drawCharts();
    },
    beforeMount() {},
    beforeCreate() {
    },
    created() {
        this.initData();
    },
    components: {}
};
</script>
  
 <style></style>

2 父组件调用子组件

<template>
    <div class="">
        <el-row :gutter="20">
            <el-col :span="12">
                <div>
                    <!-- v-if 数值存在时加载饼图 -->
                    <echartscom
                        id="echarts"
                        v-if="msg.chartData.length > 0"
                        :nameData="msg.rows"
                        title="图1查询"
                        :chartData="msg.chartData2"
                        autoresize
                    />
                </div>
            </el-col>
            <el-col :span="12">
                <div>
                  <echartscom
                        id="all"
                        v-if="msg.chartData1.length > 0"
                        :nameData="msg.rows1"
                        title="图2查询"
                        :chartData="msg.chartData3"
                        autoresize
                    />
                </div>
            </el-col>
        </el-row>
    </div>
</template>

<script>
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如:import 《组件名称》 from '《组件路径》';
import echartscom from '你的子组件echartscom的位置';

export default {
    //import引入的组件需要注入到对象中才能使用
    components: {
        echartscom
    },
    data() {
        //这里存放数据
        return {
            msg: {
                rows: ['直接访问', '邮件营销', '联盟广告', '视频广告'],
                rows1: ['直接访问', '邮件营销', '联盟广告'],
                chartData: [335, 310, 234, 135],
                chartData1: [335, 310, 234]
            }
        };
    },
    //监听属性 类似于data概念
    computed: {},
    //监控data中的数据变化
    watch: {},
    //方法集合
    methods: {
        initData(){
            // 请求后台数据 返回返回给chartData chartData1即可
        }
    },
    //生命周期 - 创建完成(可以访问当前this实例)
    created() {},
    //生命周期 - 挂载完成(可以访问DOM元素)
    mounted() {
        // 在这里初始化你的数据
        this.initData();
    },
    beforeCreate() {}, //生命周期 - 创建之前
    beforeMount() {}, //生命周期 - 挂载之前
    beforeUpdate() {}, //生命周期 - 更新之前
    updated() {}, //生命周期 - 更新之后
    beforeDestroy() {}, //生命周期 - 销毁之前
    destroyed() {}, //生命周期 - 销毁完成
    activated() {} //如果页面有keep-alive缓存功能,这个函数会触发
};
</script>
<style scoped>
</style>

3 效果图

参考图效果

4 2个饼图不加载/没有实时刷新问题

1.使用$nextTick方法 我试了没用 需要在父组件添加v-if判断 存在 加载自子组件(饼图)

2.子组件添加watch 监听父组件传来的值是否变化 来决定是否加载饼图

5 参考地址

vue中使用echarts图表不显示解决办法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容

  • 中原焦点团队 肖巧风 焦点解决中级网络班第21期 坚持第281天原创分享 总约练302次 约练感悟 1.正向开场,...
    凤舞九天阅读 343评论 0 0
  • 我加入的几乎每一家公司都会有一套编程规范,虽然在一定程度上起到了统一代码风格的作用,不过我仍然认为,过分强调规范,...
    MathPhilosophy阅读 442评论 0 2
  • 借势民族战争电影热度,品牌营销燃炸中华魂!...
    对话初心阅读 139评论 0 0
  • 渐变的面目拼图要我怎么拼? 我是疲乏了还是投降了? 不是不允许自己坠落, 我没有滴水不进的保护膜。 就是害怕变得面...
    闷热当乘凉阅读 4,241评论 0 13
  • 夜莺2517阅读 127,717评论 1 9