vue-echarts主题切换+选择面板实现

通过实现主题选择面板,更方便的对echarts图表进行主题的切换,并且支持饼状图、折线图、柱状图等多类型echarts图表。

目录

1、实现过程

1.1、导入echarts主题JS文件

1.2、添加选择按钮图片

1.3、添加按钮

1.4、主题选择面板实现

1.5、初始化echarts图

1.6、添加选择事件

2、实现效果

3、实现代码

4、面板所需图片文件


1、实现过程

1.1、导入echarts主题JS文件

实现echarts主题切换需要导入echarts模块的主题JS文件,文件位于echarts/theme/目录下。

import * as echarts from "echarts";
import 'echarts/theme/azul.js'
import 'echarts/theme/bee-inspired.js'
import 'echarts/theme/blue.js'
import 'echarts/theme/caravan.js'
import 'echarts/theme/carp.js'
import 'echarts/theme/cool.js'
import 'echarts/theme/dark.js'
import 'echarts/theme/dark-blue.js'
import 'echarts/theme/dark-bold.js'
import 'echarts/theme/dark-digerati.js'
import 'echarts/theme/dark-fresh-cut.js'
import 'echarts/theme/dark-mushroom.js'
import 'echarts/theme/eduardo.js'
import 'echarts/theme/forest.js'
import 'echarts/theme/fresh-cut.js'
import 'echarts/theme/fruit.js'
import 'echarts/theme/gray.js'
import 'echarts/theme/green.js'
import 'echarts/theme/helianthus.js'
import 'echarts/theme/infographic.js'
import 'echarts/theme/inspired.js'
import 'echarts/theme/jazz.js'
import 'echarts/theme/london.js'
import 'echarts/theme/macarons.js'
import 'echarts/theme/macarons2.js'
import 'echarts/theme/mint.js'
import 'echarts/theme/red.js'
import 'echarts/theme/red-velvet.js'
import 'echarts/theme/roma.js'
import 'echarts/theme/royal.js'
import 'echarts/theme/sakura.js'
import 'echarts/theme/shine.js'
import 'echarts/theme/tech-blue.js'
import 'echarts/theme/vintage.js'

1.2、添加选择按钮图片

图片文件已放到文章末尾,下载之后,将文件夹添加到/src/assets/目录下即可,

与代码相对应

:src="require(`@/assets/right_angle_picture/`+btn+`.png`)"

1.3、添加按钮

添加按钮控制面板显示,点击按钮将弹出主题选择面板

<el-button type="info" plain @click="dialogVisible = true">切换主题</el-button>

1.4、主题选择面板实现

使用el-dialog 显示面板,添加el-scrollbar 滚动条展示选择按钮,v-for循环添加按钮和图片

<el-dialog
      title="Echarts主题选择"
      :visible.sync="dialogVisible"
      width="500px"
      class="class_dialog_hospital"
      center>
      <div class="cab">
        <el-scrollbar style="height: 100%">
          <el-row align="middle"
                  v-for="(btnArr, index) in oprBtn"
                  :key="index">
            <el-col :span="12"
                    style="padding-top:5px;padding-bottom:5px"
                    v-for="(btn, index) in btnArr"
                    :key="index">
              <div>
                <div>
                  <el-button plain round @click="handleToggle(btn)">
                    <img style="width: 151px; height: 19px"
                         :src="require(`@/assets/right_angle_picture/`+btn+`.png`)" alt=""/>
                  </el-button>
                </div>
              </div>
            </el-col>
          </el-row>
        </el-scrollbar>
      </div>
    </el-dialog>

1.5、初始化echarts图

指定主题名。在ECharts对象初始化时,通过init的第2个参数指定需要引入的主题名。如statisticsChart = echarts.init(this.$refs.statisticsChart, 主题名); 。

  mounted() {
    statisticsChart = echarts.init(this.$refs.statisticsChart, 'light',{renderer:'svg'}); //svg格式显示图表
    statisticsChart.setOption(this.options);
  },

1.6、添加选择事件

点击主题选择按钮之后,将主题名称传入方法中,改变主题先将echarts头像销毁,并重新构建echarts,点击之后隐藏主题选择面板,这里构建echarts时选择SVG 渲染器,

    handleToggle(theme) {
      statisticsChart.dispose(); //销毁echarts
      statisticsChart = echarts.init(this.$refs.statisticsChart, theme,{renderer:'svg'});  //svg格式显示图表
      statisticsChart.setOption(this.options);
      this.dialogVisible = false;
    },

2、实现效果

ee2aad9eb56742189ccd96f8a682d3fd.png

 7b2eae739b7546cebbccb31cda6dd02c.png

 7faa545ae08f43e8895a3da037f77735.png

3、实现代码

<template>
  <div class="app-container">
    <el-button type="info" plain @click="dialogVisible = true">切换主题</el-button>
    <div ref="statisticsChart" class="statistics"></div>
    <el-dialog
      title="Echarts主题选择"
      :visible.sync="dialogVisible"
      width="500px"
      class="class_dialog_hospital"
      center>
      <div class="cab">
        <el-scrollbar style="height: 100%">
          <el-row align="middle"
                  v-for="(btnArr, index) in oprBtn"
                  :key="index">
            <el-col :span="12"
                    style="padding-top:5px;padding-bottom:5px"
                    v-for="(btn, index) in btnArr"
                    :key="index">
              <div>
                <div>
                  <el-button plain round @click="handleToggle(btn)">
                    <img style="width: 151px; height: 19px"
                         :src="require(`@/assets/right_angle_picture/`+btn+`.png`)" alt=""/>
                  </el-button>
                </div>
              </div>
            </el-col>
          </el-row>
        </el-scrollbar>
      </div>
    </el-dialog>
  </div>
</template>

<script>

import * as echarts from "echarts";

import 'echarts/theme/azul.js'
import 'echarts/theme/bee-inspired.js'
import 'echarts/theme/blue.js'
import 'echarts/theme/caravan.js'
import 'echarts/theme/carp.js'
import 'echarts/theme/cool.js'
import 'echarts/theme/dark.js'
import 'echarts/theme/dark-blue.js'
import 'echarts/theme/dark-bold.js'
import 'echarts/theme/dark-digerati.js'
import 'echarts/theme/dark-fresh-cut.js'
import 'echarts/theme/dark-mushroom.js'
import 'echarts/theme/eduardo.js'
import 'echarts/theme/forest.js'
import 'echarts/theme/fresh-cut.js'
import 'echarts/theme/fruit.js'
import 'echarts/theme/gray.js'
import 'echarts/theme/green.js'
import 'echarts/theme/helianthus.js'
import 'echarts/theme/infographic.js'
import 'echarts/theme/inspired.js'
import 'echarts/theme/jazz.js'
import 'echarts/theme/london.js'
import 'echarts/theme/macarons.js'
import 'echarts/theme/macarons2.js'
import 'echarts/theme/mint.js'
import 'echarts/theme/red.js'
import 'echarts/theme/red-velvet.js'
import 'echarts/theme/roma.js'
import 'echarts/theme/royal.js'
import 'echarts/theme/sakura.js'
import 'echarts/theme/shine.js'
import 'echarts/theme/tech-blue.js'
import 'echarts/theme/vintage.js'

let statisticsChart = null;
export default {
  name: "index",
  data() {
    return {
      //主题选择面板显示标识
      dialogVisible: false,
    }
  },
  mounted() {
    statisticsChart = echarts.init(this.$refs.statisticsChart, 'light',{renderer:'svg'}); //svg格式显示图表
    statisticsChart.setOption(this.options);
  },
  computed: {
    options() {
      return {
        legend: {},
        tooltip: {},
        dataset: {
          source: [
            ['product', '2015', '2016', '2017'],
            ['Matcha Latte', 43.3, 85.8, 93.7],
            ['Milk Tea', 83.1, 73.4, 55.1],
            ['Cheese Cocoa', 86.4, 65.2, 82.5],
            ['Walnut Brownie', 72.4, 53.9, 39.1]
          ]
        },
        xAxis: { type: 'category' },
        yAxis: {},
        series: [{ type: 'bar' }, { type: 'bar' }, { type: 'bar' }]
      };
    },
    //主题选择面板按钮
    oprBtn(){
      let index = 0;
      let arrTmp = [];
      let displayBtn = ['azul', 'bee-inspired', 'blue', 'caravan',
        'carp', 'cool', 'dark', 'dark-blue',
        'dark-bold', 'dark-digerati', 'dark-fresh-cut', 'dark-mushroom',
        'eduardo', 'forest', 'fresh-cut', 'fruit',
        'gray', 'green', 'helianthus', 'infographic', 'inspired',
        'jazz', 'london', 'macarons', 'macarons2',
        'mint', 'red', 'red-velvet', 'roma',
        'royal', 'sakura', 'shine', 'tech-blue', 'vintage'];
      for (let i = 0; i < displayBtn.length; i++) {
        index = parseInt(i / 4);
        if (arrTmp.length <= index) {
          arrTmp.push([]);
        }
        arrTmp[index].push(displayBtn[i])
      }
      return arrTmp;
    }
  },
  methods: {
    handleToggle(theme) {
      statisticsChart.dispose(); //销毁echarts
      statisticsChart = echarts.init(this.$refs.statisticsChart, theme,{renderer:'svg'});  //svg格式显示图表
      statisticsChart.setOption(this.options);
      this.dialogVisible = false;
    },
  }
}
</script>

<style scoped>

.statistics {
  width: 960px;
  height: 550px;
  background-color: #ffffff;
  padding: 20px;
  border-radius: 20px;
}

.cab {
  padding-left: 40px;
  padding-right: 10px;
  height: 480px;
}

/*头区样式*/
/deep/ .class_dialog_hospital .el-dialog__header {
  background: #F0FFF0;
  padding: 4px 0 4px 10px;
  border-top-left-radius: 9px;
  border-top-right-radius: 9px;
  height: 45px;
  line-height: 45px;
  font-family: "PingFang SC";
}

/*头区退出按钮样式*/
/deep/ .class_dialog_hospital .el-dialog__headerbtn {
  top: 10px;
  right: 10px;
  font-size: 15px;
}

/*样式穿透*/

/*对话框区*/
/deep/ .class_dialog_hospital .el-dialog {
  border: 1px solid #DCDFE6;
  box-shadow: 0 0 4px #e6e6e6;
  border-radius: 10px;
  padding: 0;
}

/*内容区*/
/deep/ .class_dialog_hospital .el-dialog__body {
  padding: 10px 0px 10px 0px;
}

/deep/ .cab .is-horizontal {
  display: none;
}

/deep/ .cab .el-scrollbar__wrap {
  overflow-x: hidden;
}

</style>

4、面板所需图片文件

图片文件

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

要成为大V的小v

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值