echarts按需引入支持echarts图片下载echarts随着浏览器窗口变化

9 篇文章 0 订阅
6 篇文章 0 订阅

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在本地项目里创建/js/lib/eCharts.js文件,文件内容如下

/*按需引入 eCharts*/
import * as eCharts from 'echarts/core' // 引入核心库
import { BarChart, LineChart, PieChart, GaugeChart } from 'echarts/charts' // 引入图表类型
import {
  TitleComponent,
  TooltipComponent,
  GridComponent,
  LegendComponent
} from 'echarts/components' // 引入配套组件
import { CanvasRenderer } from 'echarts/renderers' // canvas 渲染器
// 注册必须的组件
eCharts.use([
  TitleComponent,
  TooltipComponent,
  GridComponent,
  BarChart,
  CanvasRenderer,
  LineChart,
  GaugeChart,
  PieChart,
  LegendComponent
])

export default eCharts

在vue文件里写

<!-- 目录填报情况 -->
<template>
  <div class="card-view">
    <div class="situation-lay">
      <div class="news-head">
        <span>
          <span style="padding-left: 0.1rem;">资源统计情况概况</span>
        </span>
      </div>
      <div class="echarts-box">
        <div ref="main" id="main" style="width: 100%; height: 400px; "></div>
        <div class="btn-view">
          <el-tooltip class="item" effect="dark" content="数据视图" placement="bottom">
            <el-button icon="el-icon-tickets" type="text" @click="showCard = true"></el-button>
          </el-tooltip>
          <el-tooltip class="item" effect="dark" content="保存为图片" placement="bottom">
            <el-button icon="el-icon-download" type="text" @click="pictureDownload()"></el-button>
          </el-tooltip>
        </div>
        <div class="card-view" v-show="showCard">
          <div class="card-title">
            数据视图
          </div>
          <div class="form-view">
            <el-form ref="form" :model="form" size="mini" label-width="120px">
              <el-form-item label="无条件共享:">
                <span>{{ form.name1 }}</span> 条
              </el-form-item>
              <el-form-item label="有条件共享:">
                <span>{{ form.name1 }}</span> 条
              </el-form-item>
              <el-form-item label="不共享:">
                <span>{{ form.name1 }}</span> 条
              </el-form-item>
            </el-form>
          </div>
          <div class="card-btn">
            <el-button type="primary" size="mini" @click="showCard = false">关闭</el-button>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

局部引入 import eCharts from ‘@/js/lib/eCharts’

<script>
var myChart
import eCharts from '@/js/lib/eCharts'
export default {
  name: 'LeftCatalogECharts',
  data() {
    return {
      showCard: false,
      dataList: [
        { value: 335, name: '无条件共享' },
        { value: 310, name: '有条件共享' },
        { value: 234, name: '不共享' }
      ],
      form: {
        name1: 0
      }
    }
  },
 
  mounted() {
    let _this = this
    setTimeout(function() {
      _this.init()
    }, 100)
    兼容不用的浏览器 窗口的大小 
    window.addEventListener('resize', function() {
      _this.$nextTick(_this.myChartLeft.resize())
    })
 
  },
  methods: {
     //接收动态数据
      echartsInit(list) {
      this.dataList = list
      let _this = this
      setTimeout(function() {
        _this.init()
      }, 100)
    },
    init() {
      let _dataList = this.dataList
      // 基于准备好的dom,初始化echarts实例
      myChart = eCharts.init(document.getElementById('main'))
      myChart.resize({
        width: `${this.$refs.main.offsetWidth}`,
        height: '400'
      })
      // 指定图表的配置项和数据
      const option = {
        tooltip: {
          trigger: 'item'
        },
        legend: {
          orient: 'vertical',
          data: this.dataList.name,
          left: 'left',
          textStyle: {
            fontSize: 13,
            width: 120,
            rich: {
              a: {
                align: 'left',
                color: '#333333',
                padding: [0, 0, 0, 0]
              },
              b: {
                align: 'right',
                color: '#333333',
                padding: [0, 0, 0, 5]
              }
            }
          },
          formatter: function(name) {
            let _index = 0
            _dataList.forEach((item, i) => {
              if (item.name === name) {
                _index = i
              }
            })
            let arr
            if (name === '无条件共享') {
              arr = ['{a|' + name + '}', '{b|( ' + _dataList[_index].value + ' )}']
            } else {
              arr = ['{a|' + name + '}', '{b|( ' + _dataList[_index].value + ' )}']
            }
            return arr.join('')
          }
        },
        series: [
          {
            type: 'pie',
            radius: ['40%', '60%'],
            center: ['50%', '60%'],
            emphasis: {
              label: {
                show: true,
                fontSize: '20',
                shadowColor: '#333333'
              },
              itemStyle: {
                show: true,
                shadowColor: '#333333'
              }
            },
            data: this.dataList
          }
        ]
      }
      // 使用刚指定的配置项和数据显示图表。
      myChart.setOption(option, true)
    },
    pictureDownload() {
      //导出图片
      var img = new Image()
      img.src = myChart.getDataURL({
        type: 'png',
        pixelRatio: 1, //放大2倍
        backgroundColor: '#fff'
      })
      img.onload = function() {
        var canvas = document.createElement('canvas')
        canvas.width = img.width
        canvas.height = img.height
        var ctx = canvas.getContext('2d')
        ctx.drawImage(img, 0, 0)
        var dataURL = canvas.toDataURL('image/png')
        var a = document.createElement('a')
        // 创建一个单击事件
        var event = new MouseEvent('click')
        // 将a的download属性设置为我们想要下载的图片名称,若name不存在则使用‘下载图片名称’作为默认名称
        a.download = '目录共享方式统计.png'
        // 将生成的URL设置为a.href属性
        a.href = dataURL
        // 触发a的单击事件
        a.dispatchEvent(event)
      }
    }
  }
}
</script>

样式代码


<style lang="scss" scoped>
.card-view {
  .situation-lay {
    width: 100%;
    .center {
      display: flex;
      align-items: center;
      justify-content: space-between;
    }
    .news-head {
      width: 100%;
      height: 0.4rem;
      line-height: 0.4rem;
      font-size: 0.18rem;
      & > span:before {
        content: '';
        border-left: solid 3px #166bf2;
        position: relative;
      }
    }
    .echarts-box {
      position: relative;
      .btn-view {
        position: absolute;
        top: 0.02rem;
        right: 0.1rem;
      }
      #main {
        width: 100%;
        height: 4rem;
        border: $effect-border-edging;
      }
      .card-view {
        position: absolute;
        width: calc(100% - 0.02rem);
        top: 0.02rem;
        left: 0.01rem;
        right: 0.01rem;
        height: 3.99rem;
        background: #ffffff;
        display: flex;
        justify-content: center;
        flex-direction: column;
        align-items: center;
        .card-title {
          padding: 0.1rem 0.2rem;
          color: rgb(0, 0, 0);
          width: calc(100% - 0.4rem);
        }
        .form-view {
          width: calc(100% - 0.4rem);
          padding-top: 0.3rem;
          height: 2.6rem;
          border: $effect-border-edging;
          & span {
            color: $color-red-base;
          }
          /deep/.el-form-item {
            margin-bottom: 0;
          }
        }
        .card-btn {
          height: 0.4rem;
          padding: 0.1rem 0.2rem;
          width: calc(100% - 0.4rem);
          display: flex;
          justify-content: flex-end;
        }
      }
    }
  }
}
</style>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值