vue-element-admin 综合开发五:引入 echarts,封装echarts 组件

简介: 这篇文章介绍了如何在vue-element-admin项目中引入并封装ECharts组件,以及如何实现折线图、柱状图和饼图的展示。

导言

一、初尝试echarts

  1. ecahrts 官网:https://echarts.apache.org/zh/index.html
  2. 学习使用跟着官网走即可
  3. API位置:
    在这里插入图片描述

1. 引入方式

  1. 根据官网去下载
  2. cdn方式:

    <script src="https://cdn.staticfile.org/echarts/4.3.0/echarts.min.js"></script>
    

2. 项目新建 echarts.html

将官网的事例拿过来,换上 上面的cdn方式

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>ECharts</title>
    <!-- 引入刚刚下载的 ECharts 文件 -->
    <script src="https://cdn.staticfile.org/echarts/4.3.0/echarts.min.js"></script>
  </head>
  <body>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="main" style="width: 600px;height:400px;"></div>
    <script type="text/javascript">
      // 基于准备好的dom,初始化echarts实例
      var myChart = echarts.init(document.getElementById('main'));

      // 指定图表的配置项和数据
      var option = {
        title: {
          text: 'ECharts 入门示例'
        },
        tooltip: {},
        legend: {
          data: ['销量']
        },
        xAxis: {
          data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
        },
        yAxis: {},
        series: [
          {
            name: '销量',
            type: 'bar',
            data: [5, 20, 36, 10, 10, 20]
          }
        ]
      };

      // 使用刚指定的配置项和数据显示图表。
      myChart.setOption(option);
    </script>
  </body>
</html>

3. 页面展示

在这里插入图片描述

二、 项目引入echarts

1. 安装

npm install echarts@5.1.2 or yarn add echarts@5.1.2

2. 引入

哪个页面用,就在哪个页面引入即可(无须在main.js中引入)
引入语句

import * as echarts from "echarts";

三、本项目开发:折线图、柱状图、饼图

1. 数据来源

在上一个博文中使用了mock数据模拟后端返回的数据,在 /home/getData 这个请求中返回了所有数据,包括上一个博客已经用到的列表数据,还有本博客的折线图、柱状图、饼状图的数据。

2. 折线图

a、dom位置

dom位置:放折线图的地方

      <!-- 右中:折线图 -->
      <el-card style="height: 280px">
        <div style="height: 280px" ref="echarts"></div>
      </el-card>

在这里插入图片描述

b、method 定义 echarts 折线图

  1. method 定义的方法
   // 折线图
    zhexiantu(data) {
      // 折线图
      const order = data.orderData;
      const xData = order.date;
      // console.log(JSON.stringify(xData))
      const keyArray = Object.keys(order.data[0]);
      const series = [];
      keyArray.forEach((key) => {
        series.push({
          name: key,
          data: order.data.map((item) => item[key]),
          type: "line",
        });
      });

      const option = {
        xAxis: {
          data: xData,
        },
        yAxis: {},
        legend: {
          data: keyArray,
        },
        series,
      };
      const e = echarts.init(this.$refs.echarts);
      e.setOption(option);
    },

c、方法挂载到 mounted 钩子函数

  1. 将方法放到 mounted 钩子函数中调用
  mounted() {
    getData().then((res) => {
      const { code, data } = res.data;
      if (code == 20000) {
        // 左下方表格
        this.tableData = data.tableData;
        // 右方 中间 折线图
        this.zhexiantu(data);
      }
      console.log("res:", res);
    });
  },
  1. 注意这里的数据,还是之前封装的mock数据,mock数据。

3. 柱状图

a、dom位置

        <el-card style="height: 260px">
          <div style="height: 240px" ref="userEcharts"></div>
        </el-card>

在这里插入图片描述

b、method 定义 echarts 柱状图

    // 柱状图
    zhuzhuangtu(data) {
      const userOption = {
        legend: {
          // 图例文字颜色
          textStyle: {
            color: "#333",
          },
        },
        grid: {
          left: "20%",
        },
        // 提示框
        tooltip: {
          trigger: "axis",
        },
        xAxis: {
          type: "category", // 类目轴
          data: data.userData.map((item) => item.data),
          axisLine: {
            lineStyle: {
              color: "#17b3a3",
            },
          },
          axisLabel: {
            interval: 0,
            color: "#333",
          },
        },
        yAxis: [
          {
            type: "value",
            axisLine: {
              lineStyle: {
                color: "#17b3a3",
              },
            },
          },
        ],
        color: ["#2ec7c9", "#b6a2de"],
        series: [
          {
            name: "新增用户",
            data: data.userData.map((item) => item.new),
            type: "bar",
          },
          {
            name: "活跃用户",
            data: data.userData.map((item) => item.active),
            type: "bar",
          },
        ],
      };
      const e = echarts.init(this.$refs.userEcharts);
      e.setOption(userOption);
    },

c、挂载到mounted

  mounted() {
    getData().then((res) => {
      const { code, data } = res.data;
      if (code == 20000) {
        // 左下方表格
        this.tableData = data.tableData;
        // 右方 中间 折线图
        this.zhexiantu(data);
        // 右方 下面 柱状图
        this.zhuzhuangtu(data);
      }
      console.log("res:", res);
    });
  },

在这里插入图片描述

4. 饼图

a、dom位置

        <el-card style="height: 260px">
          <div style="height: 240px" ref="videoEcharts"></div>
        </el-card>

在这里插入图片描述

b、method 定义的 echarts 饼状图

    // 饼图
    bingtu(data) {
      const videoOption = {
        tooltip: {
          trigger: "item",
        },
        color: [
          "#0f78f4",
          "#dd536b",
          "#9462e5",
          "#a6a6a6",
          "#e1bb22",
          "#39c362",
          "#3ed1cf",
        ],
        series: [
          {
            data: data.videoData,
            type: 'pie'
          }
        ],
      };
      const e = echarts.init(this.$refs.videoEcharts)
      e.setOption(videoOption)
    },

c、挂载到mounted 钩子函数

  mounted() {
    getData().then((res) => {
      const { code, data } = res.data;
      if (code == 20000) {
        // 左下方表格
        this.tableData = data.tableData;
        // 右方 中间 折线图
        this.zhexiantu(data);
        // 右方 下面 柱状图
        this.zhuzhuangtu(data);
        // 右方 下面 饼图
        this.bingtu(data);
      }
      console.log("res:", res);
    });
  },

在这里插入图片描述

5. 引出的问题

一个页面有三个E chart图,然后引用了三次,代码冗余有点多,应该封装出一个Echart 组件。

四、封装echarts组件

1. 新建组件: components/Echarts.vue

  1. 将图表分为 线性图饼图 两类。
  2. 父组件 传到 子组件的 isAxisChart 属性 用于区分 线性图和饼图
  3. watch 监听入口
<template>
  <div ref="echart"></div>
</template>
<script>
import * as echarts from 'echarts'
export default {
  name: 'Echart',
  props: {
    isAxisChart: {
      type: Boolean, // true 代表 线性图, false 代表 饼状图
      default: true
    },
    chartData: {
      type: Object,
      default(){
        return {
          xData: [],
          series: [],
        }
      }
    }
  },
  // 监听
  watch: {
    // chartData 是props 中父组件传过来的数据
    chartData: {
      // 入口  handler : 固定
      handler: function(){
        console.log('echarts, echart:', this.echart) // 第一次为 undefined 以后都有值
        this.initChart()
        console.log('echarts, this.option:', this.option)
        console.log('echarts, this.option type:', typeof(this.option))
        console.log('echarts, isAxisChart:', this.isAxisChart)
      },
      // 首次对数据监听的话 不应该加的是immediate吗,这里的deep 是应为 chartData 是对象才用的 深入deep吧。
      deep: true
    }

  },
  methods: {
    initChart(){
      // 先初始化 图表数据
      this.initChartData()
      // 再 显示图表
      if(this.echart){
        // 已有 echarts 对象
        this.echart.setOption(this.option)
      } else {
        // 没有 echarts 对象
        this.echart = echarts.init(this.$refs.echart)
        this.echart.setOption(this.option)
      }
    },
    initChartData(){
      if(this.isAxisChart){
        // 线性图
        this.axisOption.xAxis.data = this.chartData.xData
        this.axisOption.series = this.chartData.series
      } else {
        // 饼状图
        this.normalOption.series = this.chartData.series
      }
    }
  },
  data(){
    return {
      ecahrt: null,
      // 折线图
      axisOption: {
        legend: {
          // 图例文字颜色
          textStyle: {
            color: "#333",
          },
        },
        grid: {
          left: "20%",
        },
        // 提示框
        tooltip: {
          trigger: "axis",
        },
        xAxis: {
          type: "category", // 类目轴
          data: [],
          axisLine: {
            lineStyle: {
              color: "#17b3a3",
            },
          },
          axisLabel: {
            interval: 0,
            color: "#333",
          },
        },
        yAxis: [
          {
            type: "value",
            axisLine: {
              lineStyle: {
                color: "#17b3a3",
              },
            },
          },
        ],
        color: ["#2ec7c9", "#b6a2de", "#5ab1ef", "#ffb980", "#d87a80", "#8d98b3"],
        series: [],
      },
      // 饼状图
      normalOption: {
          tooltip: {
            trigger: "item",
          },
          color: [
            "#0f78f4",
            "#dd536b",
            "#9462e5",
            "#a6a6a6",
            "#e1bb22",
            "#39c362",
            "#3ed1cf",
          ],
          series: [],
        },
    }
  },
  computed: {
    option(){
      // this.isAxisChart 为 true 则获取 饼状图 和折线图 ,否则获取 饼状图 的数据
      return this.isAxisChart ? this.axisOption : this.normalOption
    }
  }
}
</script>

2. 修改 home/index.vue

a、引入 Echarts组件

import Echart from '../../components/Echarts.vue'

b、html 改变

在这里插入图片描述

c、数据改变

在这里插入图片描述

3. 柱状图、饼状图同理

但是饼状图有点问题

五、最终界面

在这里插入图片描述

相关文章
|
1天前
|
编解码 Java 程序员
写代码还有专业的编程显示器?
写代码已经十个年头了, 一直都是习惯直接用一台Mac电脑写代码 偶尔接一个显示器, 但是可能因为公司配的显示器不怎么样, 还要接转接头 搞得桌面杂乱无章,分辨率也低,感觉屏幕还是Mac自带的看着舒服
|
3天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1540 5
|
1月前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
7天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
576 22
|
3天前
|
存储 SQL 关系型数据库
彻底搞懂InnoDB的MVCC多版本并发控制
本文详细介绍了InnoDB存储引擎中的两种并发控制方法:MVCC(多版本并发控制)和LBCC(基于锁的并发控制)。MVCC通过记录版本信息和使用快照读取机制,实现了高并发下的读写操作,而LBCC则通过加锁机制控制并发访问。文章深入探讨了MVCC的工作原理,包括插入、删除、修改流程及查询过程中的快照读取机制。通过多个案例演示了不同隔离级别下MVCC的具体表现,并解释了事务ID的分配和管理方式。最后,对比了四种隔离级别的性能特点,帮助读者理解如何根据具体需求选择合适的隔离级别以优化数据库性能。
201 3
|
10天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
10天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
571 5
|
23天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
6天前
|
XML 安全 Java
【Maven】依赖管理,Maven仓库,Maven核心功能
【Maven】依赖管理,Maven仓库,Maven核心功能
233 3
|
9天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
327 2