Echarts表格的使用,折线图,柱状图,饼状图的实现

1,402 阅读1分钟

首先引入Echarts.js

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.staticfile.org/echarts/4.3.0/echarts.min.js"></script>
</head>
<body>
    <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:['销量']
            },
            // x轴
            xAxis: {
                data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
            },
            // y轴
            yAxis: {},
            
            series: [{
                name: '销量',
                type: 'bar',
                data: [5, 20, 36, 10, 10, 20]
            }]
        };
 
        // 使用刚指定的配置项和数据显示图表。
        myChart.setOption(option);
    </script>
</body>
</html>

实现效果:

QQ截图20211230122757.png

折线统计图,柱状图,饼状图的实现

在项目中安装echarts

npm install echarts --S

在Home.vue中引入echarts

 <el-card shadom="hover" style="height:280px" >
          <!-- <div style="height:280px;width=100%" ref="echart" ></div> -->
          <echart :chartData="echartData.order" style="height:280px"></echart>
        </el-card>
           <div class="graph">
                <el-card shadom="hover" style="height:260px">
                  <!-- <div style="height:240px" ref="userEchart"></div> -->
                    <echart :chartData="echartData.user" style="height:240px"></echart>
                </el-card>
                <el-card shadom="hover" style="height:260px">
                  <!-- <div style="height:240px" ref="videoEchart"></div> -->
                  <echart :chartData="echartData.video" style="height:240px" :isAxisChart="false">
                  </echart>
                </el-card>
            </div>
            
            
<script>
import { getHome } from '../../api/data';
// import * as echarts from "echarts";
import Echart from '@/components/ECharts.vue'

export default {
  components:{
    Echart,   
  },
  data() {
    return {
      userImg: require("../../assets/images/user.png"),
      tableData: [],
      tableLabel: {},
      countData: [],  
      echartData:{
        order:{
          xData:[],
          series:[],
        },
        user:{
          xData:[],
          series:[],
        },
        video:{
          series:[],
        }
      }
    };
  },
  methods:{
      getTableData(){
          getHome().then((res)=>{
              this.tableData=res.data.tableData;

              // 折线图的展示
              const order=res.data.orderData;
              // console.log(order);
              // this.echartsData.order.xAxis.data=order.date;
              let keyArray=Object.keys(order.data[0]);
              // keyArray.forEach((key)=>{
              //   this.echartsData.order.series.push({
              //     name:key,
              //     data:order.data.map((item)=>item[key]),
              //     type:'line',
              //   })
              // })
              // const myEchartsOrder= echarts.init(this.$refs.echart);
              // myEchartsOrder.setOption(this.echartsData.order);

            // 传给组件的值
             this.echartData.order.xData=order.date;
               keyArray.forEach((key)=>{
                this.echartData.order.series.push({
                  name:key,
                  data:order.data.map((item)=>item[key]),
                  type:'line',
                })
              })
              // 用户图
              this.echartData.user.xData=res.data.userData.map((item)=>item.date);
               this.echartData.user.series.push({
                  name:'新增用户',
                  data:res.data.userData.map((item)=>item.new),
                  type:'bar',
                })

               this.echartData.user.series.push({
                  name:'活跃用户',
                  data:res.data.userData.map((item)=>item.active),
                  type:'bar',
                }) 
              // this.echartsData.user.xAxis.data=res.data.userData.map((item)=>item.date);
              // console.log( this.echartsData.user.xAxis.data);
              // this.echartsData.user.series.push({
              //     name:'新增用户',
              //     data:res.data.userData.map((item)=>item.new),
              //     type:'bar',
              //   })

              //  this.echartsData.user.series.push({
              //     name:'活跃用户',
              //     data:res.data.userData.map((item)=>item.active),
              //     type:'bar',
              //   })                

              // const myEchartsUser= echarts.init(this.$refs.userEchart);
              // myEchartsUser.setOption(this.echartsData.user);

              // 饼状图
                this.echartData.video.series.push({
                data:res.data.videoData,
                type:"pie",
              })
              // this.echartsData.video.series.push({
              //   data:res.data.videoData,
              //   type:"pie",
              // })

              // const myEchartsvideo= echarts.init(this.$refs.videoEchart);
              // myEchartsvideo.setOption(this.echartsData.video);
          })
      }
  },
  mounted(){
  this.getTableData()
  }
};
</script>

在src文件夹下api文件夹下mockServeData文件夹下home.js

// mock数据模拟
import Mock from 'mockjs'

// 图表数据
let List = []
export default {
  getStatisticalData: () => {
    //Mock.Random.float 产生随机数100到8000之间 保留小数 最小0位 最大0位
    for (let i = 0; i < 7; i++) {
      List.push(
        Mock.mock({
          苹果: Mock.Random.float(100, 8000, 0, 0),
          vivo: Mock.Random.float(100, 8000, 0, 0),
          oppo: Mock.Random.float(100, 8000, 0, 0),
          魅族: Mock.Random.float(100, 8000, 0, 0),
          三星: Mock.Random.float(100, 8000, 0, 0),
          小米: Mock.Random.float(100, 8000, 0, 0)
        })
      )
    }
    return {
      code: 20000,
      data: {
        // 饼图
        videoData: [
          {
            name: '小米',
            value: 2999
          },
          {
            name: '苹果',
            value: 5999
          },
          {
            name: 'vivo',
            value: 1500
          },
          {
            name: 'oppo',
            value: 1999
          },
          {
            name: '魅族',
            value: 2200
          },
          {
            name: '三星',
            value: 4500
          }
        ],
        // 柱状图
        userData: [
          {
            date: '周一',
            new: 5,
            active: 200
          },
          {
            date: '周二',
            new: 10,
            active: 500
          },
          {
            date: '周三',
            new: 12,
            active: 550
          },
          {
            date: '周四',
            new: 60,
            active: 800
          },
          {
            date: '周五',
            new: 65,
            active: 550
          },
          {
            date: '周六',
            new: 53,
            active: 770
          },
          {
            date: '周日',
            new: 33,
            active: 170
          }
        ],
        // 折线图
        orderData: {
          date: ['20191001', '20191002', '20191003', '20191004', '20191005', '20191006', '20191007'],
          data: List
        },
        tableData: [
          {
            name: 'oppo',
            todayBuy: 500,
            monthBuy: 3500,
            totalBuy: 22000
          },
          {
            name: 'vivo',
            todayBuy: 300,
            monthBuy: 2200,
            totalBuy: 24000
          },
          {
            name: '苹果',
            todayBuy: 800,
            monthBuy: 4500,
            totalBuy: 65000
          },
          {
            name: '小米',
            todayBuy: 1200,
            monthBuy: 6500,
            totalBuy: 45000
          },
          {
            name: '三星',
            todayBuy: 300,
            monthBuy: 2000,
            totalBuy: 34000
          },
          {
            name: '魅族',
            todayBuy: 350,
            monthBuy: 3000,
            totalBuy: 22000
          }
        ]
      }
    }
  }
}

封装echarts

在src文件夹下的components文件夹下新建ECharts.vue组件

<template>
  <div ref="echart"></div>
</template>


<script>
import * as echarts from "echarts";
export default {
    props:{
      chartData:{
          type:Object,
          default(){
              return{
                  xData:[],
                  series,
              }
          }
      },
      isAxisChart:{
          type:Boolean,
          default:true,
      }
    },
    watch:{
        chartData:{
            handler:function(){
              this.initChart()
            },
            deep:true
        }
    },
    computed:{
        options(){
            return this.isAxisChart ?this.axisOption:this.normalOpiton
        }
    },
    methods:{
        initChart(){
            this.initChartData();
            // 设置echarts表格          
            if(this.echart){
                this.echart.setOption(this.options);
            }else{
                this.echart=echarts.init(this.$refs.echart);
                this.echart.setOption(this.options);
            }
        },
        initChartData(){
            if(this.isAxisChart){
                this.axisOption.xAxis.data=this.chartData.xData;
                this.axisOption.series=this.chartData.series;              }else{
                this.normalOpiton.series=this.chartData.series;
            }
        }
    },
  data() {
    return {
      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: [],
      },
      normalOpiton: {
        tooltip: {
          trigger: "item",
        },
        color: [
          "#0f78f4",
          "#dd536b",
          "#9462e5",
          "#a6a6a6",
          "#e1bb22",
          "#39c362",
          "#3ed1cf",
        ],
        series: [],
      },
      echart:null,
    };
  },
};
</script>

实现效果:

QQ截图20211230125450.png