vue中Echart如何打包下载图片

 

一、单Echarts下载

众所周知echarts是通过canvas画布绘制的图形,单图下载很简单只需要调用原有的API,工具类即可:

toolbox: {
            show: true,
            right:'20px',
            top:'10px',
            itemSize:'30',
            iconStyle: {
                borderColor: '#fff',//图标颜色
                borderWidth: '5',
                emphasis: {
                    color: this.info["color"],//鼠标滑过的颜色
               },
            },
          feature: {
            saveAsImage: {
                show:true,
                    backgroundColor: this.info["background"],//保存图片的背景色
                excludeComponents :['toolbox'],
                pixelRatio: 2
            }
          }
        },

那么多图应该如何处理?

二、多Echarts打包下载

首先我们要借助两个强大的依赖,jszip和file-save,通过字面理解,jszip很显然是打包用的,而file-save主要就是做文件保存的。

先说下整体思路吧,例如有3张Echarts图表,需要打包下载。首先应有个下载的button来才能触发打包下载的事件,其次获取到每张图表的base64编码,以及每张图表的名称(名称可以自己拟定)利用file-save来进行保存,最后通过jszip进行打包下载。话不多说直接上代码:

1.依次安装以上两个包

npm i jszip
npm i file-saver

2.在全局或需要的组件引用

import JSZip from 'jszip'
import FileSaver from 'file-saver'

3.接下来重点来了,因为我目前的项目是属于可视化大屏展示,涉及到百张图表的处理,所以一个Echarts对应一个组件。我在此处用到的Vue的混入,熟称mixin,因为需要获取到需要下载图表原型,也就是echarts.init('chart'),来获取每一张图表的base64编码,所以我用到了混入,小伙伴们可以自行理解,或者有更好的方法可以一起分享,直接上代码,看我的混入。

import * as echarts from "echarts";
export default {
  data() {
    return {
      myChart: null,
      zcRecordId:null
    };
  },
  mounted() {
    this.myChart = echarts.init(this.$refs[this.zcChart]);
    this.zcRecordId = this.recordId;//每张图表对应的id,小伙伴们可以自行拟定,或者Math.random()也行。
    setTimeout(()=>{
      var opts = {
        type: 'jpeg', // 配置导出的格式,还可以是png
        pixelRatio: 5,// 导出的图片分辨率,默认为 1。
        backgroundColor: '#1A43A3',// 导出的图片背景色,默认使用 option 里的 backgroundColor
      }
      var resBase64 = this.myChart.getDataURL(opts);  
      this.$store.state.allFile.push({
        title:this.zcRecordId+ ".png",//导出文件的标题
        base64:resBase64//导出文件的编码
      })
    },1000)
  },
};

上述code其实已经大白话了,有啥不懂的评论区私信我,上文为mixin文件,首先获取到当前图表的原型已经对应的名字,其次转换base64编码格式,最后push进一个提前创建好的数组里,我是在Vuex中创建了个空数组,因为我在需要下载的图表文件中引入了mixin,例如我有五张图需要下载,那么我就在这5张图表所对应的文件中引入mixin,此时我的数组里应该是有5个对象。此时你的数组打印出来应该是这样的

认真的小伙伴或许已经看到了setTimeout为什么要用setTimeout呢,其实是Eachart的渲染机制的问题,这里就不详细讲解了,如果不适用延迟,你最终下载的可能是一张没有灵魂的图片。

4.在需要下载的echar中引入mixin,这里不做过多的讲解,直接上代码

<template>
  <div class="chart-box">
    <div class="chart" :ref="zcChart"></div>
  </div>
</template>
<script>
import mixin from "@/components/mixin";
export default {
  mixins: [mixin],
}

5.给下载按钮绑定事件,创建JSZip,在zip.generateAsync函数中,执行FileSaver.saveAs()方法

<template>
  <div>
    <div @click='upload'>下载</div>
  </div>
</template>
import JSZip from "jszip";
import FileSaver from 'file-saver';
export default {
    methods: {
        upload(){
          let zip = new JSZip();
          let fileName = "charts-file";//压缩包的文件名
          this.$store.state.allFile.forEach(item => {
              //打包的数据
              zip.file(item.title, this.dataUrlFile(item.base64,item.title))
           })
          zip.generateAsync({type: "blob"}).then(content => {
            FileSaver.saveAs(content, fileName); // file-saver方法保存文件
           })
    },
    }
}

终于好了,复制到这里,你可以拿去交工了,不用谢,不要喷,喜欢的点赞带走,不喜欢的请自觉绕道,写个需要的人,喷子勿扰!!!

插播一条广告:

       本公司自营项目:

                  微信电商小程序(拼团、砍价、会员、积分、限时秒杀、分销、直播等诸多功能);

                  刷脸支付(招商加盟,代理加盟,一站式源码部署);

                  另:接各种开发项目,PC、移动、webApp、小程序、App、M站等;

                 如果有需要请打开http://yykj.huijik.com进行留言,(进入页面下拉到最底端即可留言)

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Vue使用Echarts进行前后端数据交互,可以通过以下步骤实现: 1.在Vue项目安装Echarts ```shell npm install echarts --save ``` 2.在Vue组件引入Echarts ```javascript import echarts from 'echarts' ``` 3.在Vue组件创建一个Echarts实例 ```javascript mounted() { // 基于准备好的dom,初始化echarts实例 let myChart = echarts.init(document.getElementById('myChart')) // 指定图表的配置项和数据 let option = { title: { text: 'ECharts 入门示例' }, tooltip: {}, legend: { data:['销量'] }, xAxis: { data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"] }, yAxis: {}, series: [{ name: '销量', type: 'bar', data: [5, 20, 36, 10, 10, 20] }] } // 使用刚指定的配置项和数据显示图表。 myChart.setOption(option) } ``` 4.在Vue组件使用axios获取后端数据 ```javascript import axios from 'axios' export default { data() { return { chartData: [] } }, mounted() { axios.get('/api/chartData') .then(res => { this.chartData = res.data this.renderChart() }) .catch(err => { console.log(err) }) }, methods: { renderChart() { let myChart = echarts.init(document.getElementById('myChart')) let option = { title: { text: 'ECharts 入门示例' }, tooltip: {}, legend: { data:['销量'] }, xAxis: { data: this.chartData.categories }, yAxis: {}, series: [{ name: '销量', type: 'bar', data: this.chartData.data }] } myChart.setOption(option) } } } ``` 5.在后端使用koa2编写接口,返回数据给前端 ```javascript const Koa = require('koa') const Router = require('koa-router') const app = new Koa() const router = new Router() router.get('/api/chartData', async (ctx, next) => { const chartData = { categories: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子'], data: [5, 20, 36, 10, 10, 20] } ctx.body = chartData }) app.use(router.routes()).use(router.allowedMethods()) app.listen(3000, () => { console.log('server is running at http://localhost:3000') }) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值