uni-app引用Echarts的踩坑记录

在uni-app项目引用Echarts

effect.gif

demo附件:https://github.com/chellel/echarts-uniapp

按照 uni-app中使用Echarts的实践总结 的步骤引用echarts
先在uni-app新建项目,然后在命令行管理中进入到该目录下,执行

npm init

然后安装依赖。

npm install echarts mpvue-echarts --save

将下载后的三个库从node_modules剪切到项目的根目录下。
开始在项目中使用echarts。
page/index/index.vue

<template>
    <div class="container">
        <mpvue-echarts ref="pieChart" :echarts="echarts" :onInit="onInit" />
    </div>
</template>

<script>
    import * as echarts from 'echarts'
    import mpvueEcharts from 'mpvue-echarts'

    function initChart(canvas, width, height) {
        debugger
        const chart = echarts.init(canvas, null, {
            width: width,
            height: height
        })
        canvas.setChart(chart)

        var option = {
        title: {
            text: '某站点用户访问来源',
            subtext: '纯属虚构',
            x: 'center'
        },
        tooltip: {
            trigger: 'item',
            formatter: "{a} {b} : {c} ({d}%)"
        },
        legend: {
            orient: 'vertical',
            bottom: '10%',
            data: ['直接访问', '邮件营销', '联盟广告', '视频广告', '搜索引擎']
        },
        series: [{
            name: '访问来源',
            type: 'pie',
            radius: '55%',
            center: ['50%', '40%'],
            data: [{
                    value: 335,
                    name: '直接访问'
                },
                {
                    value: 310,
                    name: '邮件营销'
                },
                {
                    value: 234,
                    name: '联盟广告'
                },
                {
                    value: 135,
                    name: '视频广告'
                },
                {
                    value: 1548,
                    name: '搜索引擎'
                }
            ],
            itemStyle: {
                emphasis: {
                    shadowBlur: 10,
                    shadowOffsetX: 0,
                    shadowColor: 'rgba(0, 0, 0, 0.5)'
                }
            }
        }]
    };
    
    
        chart.setOption(option)
        return chart
    }

    export default {
        data() {
            return {
                echarts,
                onInit: initChart
            }
        },

        components: {
            mpvueEcharts
        }
    }
</script>

<style>
    .container {
        flex: 1;
    }
</style>

第一个坑

出现报错: this.echarts.setCanvasCreator is not a function


image.png

尝试将manifest.json - 源码视图中的小程序配置usingComponents删除

 "mp-weixin": { /* 小程序特有相关 */
       "usingComponents":true
    }

修改为

 "mp-weixin": { /* 小程序特有相关 */
  }

停止微信开发者工具后重新运行,虽然显示图表,但是这不应该是正确的处理方式。
于是寻找另外一种解决办法。根据处理方法 #插件讨论# 【 ECharts页面模板 - DCloud 】APP中 报错 this.echarts.setCanvasCreator is not a function
替换最新的 mpvue-echarts 组件echarts.vue, 源码地址:https://github.com/dcloudio/hello-uniapp/blob/master/components/mpvue-echarts/src/echarts.vue
替换后查看echarts.vue,可以看到init()通过$emit将onInit事件和数据发出

init() {
...
this.$emit('onInit', {
    width: res.width,
    height: res.height
});
...
},

因此在index.vue将

<mpvue-echarts ref="pieChart" :echarts="echarts" :onInit="onInit" />

修改为

<mpvue-echarts ref="pieChart" :echarts="echarts" @onInit="initChart" />

page/index/index.vue添加

methods:{
    initChart:initChart
}

修改initChart function

function initChart(e) {
        let {
            width,
            height
        } = e;
        
        let canvas = this.$refs.pieChart.canvas;
        echarts.setCanvasCreator(() => canvas);
        const chart = echarts.init(canvas, null, {
            width: width,
            height: height
        })
        canvas.setChart(chart)

        var option = {
            ...
        };
        chart.setOption(option)
        this.$refs.pieChart.setChart(chart)
        //return chart
    }
第二个坑

console不报错,但是页面也不显示图表。
原因是外框的height为0,需要设置外框的高度。同时要注意page的css
page{display:flex;}会同样无法显示图表。

<style>
    page,.container {
        height: 100%;
    }
</style>

完整代码:

在最新的echart.vue小作修改

init() {
...
this.$emit('onInit', {
    canvas: this.canvas,
    width: res.width,
    height: res.height
});
...
},

page/index/index.vue

<template>
    <view class="container">
        <mpvue-echarts ref="pieChart" :echarts="echarts" @onInit="initChart" />
    </view>
</template>

<script>
    import * as echarts from 'echarts'
    import mpvueEcharts from 'mpvue-echarts'

    export default {
        data() {
            return {
                echarts
            }
        },
        components: {
            mpvueEcharts
        },
        methods: {
            initChart(e) {
                let {
                    canvas,
                    width,
                    height
                } = e;
                width = width - 20;
                //let canvas = this.$refs.pieChart.canvas;
                echarts.setCanvasCreator(() => canvas);
                const chart = echarts.init(canvas, null, {
                    width: width,
                    height: height
                })

                canvas.setChart(chart)
                var option = {
                    title: {
                        text: '某站点用户访问来源',
                        subtext: '纯属虚构',
                        x: 'center'
                    },
                    tooltip: {
                        trigger: 'item',
                        formatter: "{a} {b} : {c} ({d}%)"
                    },
                    legend: {
                        orient: 'vertical',
                        bottom: '10%',
                        data: ['直接访问', '邮件营销', '联盟广告', '视频广告', '搜索引擎']
                    },
                    series: [{
                        name: '访问来源',
                        type: 'pie',
                        radius: '55%',
                        center: ['50%', '40%'],
                        data: [{
                                value: 335,
                                name: '直接访问'
                            },
                            {
                                value: 310,
                                name: '邮件营销'
                            },
                            {
                                value: 234,
                                name: '联盟广告'
                            },
                            {
                                value: 135,
                                name: '视频广告'
                            },
                            {
                                value: 1548,
                                name: '搜索引擎'
                            }
                        ],
                        itemStyle: {
                            emphasis: {
                                shadowBlur: 10,
                                shadowOffsetX: 0,
                                shadowColor: 'rgba(0, 0, 0, 0.5)'
                            }
                        }
                    }]
                };

                chart.setOption(option)
                this.$refs.pieChart.setChart(chart);
                //return chart
            }
        }
    }
</script>

<style>
    page,
    .container {
        height: 100%;
    }

    .container {
        padding: 0 10px;
    }
</style>

完成。

接下来解决引用uni-app引用mpvue echarts超过小程序大小限制

在小程序开发工具中编译和预览时,提示Error:源码包超出最大限制,source size 3905KB exceed max limit 2MB

参考:https://www.npmjs.com/package/mpvue-echarts
FAQ:打包结果超过小程序大小限制?

使用自定义版 echarts,官网定制

FAQ:文件太大怎么办?

本项目默认提供的 ECharts 文件是最新版本的包含所有组件文件,为了便于开发,提供的是未压缩的版本。远程调试或预览可以下载 echarts.min.js 压缩版本。
发布时,如果对文件大小要求更高,可以在 ECharts 在线定制网页下载仅包含必要组件的包,并且选择压缩。

定制按需选择后得到echarts.min.js
将echarts.min.js文件复制到echarts目录下。
并修改引用:

    import * as echarts from 'echarts/echarts.min.js'
    import mpvueEcharts from 'mpvue-echarts/src/echarts.vue'

重新运行后文件得到精简,小程序端可以正常编译和预览。

h5 运行到浏览器时,控制台报错:TypeError: t.addEventListener is not a function

image.png

解决方法查看:UNI-app新引入echarts 报错 https://blog.csdn.net/qq_36444936/article/details/86599300

3.编辑刚才拷贝的echarts.min.js,检索“e(t.echarts={})”字符串
4.找到相邻的(this,function(t) 串 ,将其改为(this,function(t,window,document)保存即可

注:本项目仅在微信小程序和h5测试,其他平台暂时没有考虑。

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

推荐阅读更多精彩内容

  • 我快要哭了,怎么都做不出来了。无论是按照网上的教程还是把以前的代码放进现在的项目,都会报错。我不知道问题究竟在何处...
    uesugieriislf阅读 2,948评论 1 2
  • uni-app跨平台框架官方教程 链接:https://ke.qq.com/course/343370 一、框架简...
    Neyo_凉阅读 36,166评论 0 43
  • 前言 这是我第一次开发小程序,开发的产品是音频类的,在大佬的建议下采用了mpvue,一周时间把功能都做出来,由于不...
    fengxianqi阅读 2,213评论 0 5
  • 写在有道笔记上,uni项目实践,转过来格式不太好看,先做此记录吧。 看了uniapp多端开发,感觉不错,还有模板商...
    YellowPoint阅读 2,354评论 0 1
  • 夜半三更,小丫头梦中惊醒,安抚好梦中的惊慌失措,我却睡意全无,总觉得心里有点不一样的感觉,可是却无从说起。 放假之...
    晋文芳阅读 243评论 0 1