Echarts使用方法详细步骤vue2项目中

1.导入Echarts

1. 点击快速入门

2. 选择在项目中引入Echarts,先根据NPM安装Echarts,然后按需引入

2.1. 在vue项目中引入Echarts,直接复制到script中即可,并且写一个div盒子

<template>
  <div id="main">折线图</div>
</template>
<script>
// 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
import * as echarts from 'echarts/core';
// 引入柱状图图表,图表后缀都为 Chart
import { BarChart } from 'echarts/charts';
// 引入标题,提示框,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component
import {
  TitleComponent,
  TooltipComponent,
  GridComponent,
  DatasetComponent,
  TransformComponent
} from 'echarts/components';
// 标签自动布局、全局过渡动画等特性
import { LabelLayout, UniversalTransition } from 'echarts/features';
// 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
import { CanvasRenderer } from 'echarts/renderers';
</script>
2.2. 注册组件,写到created()中
<template>
  <div id="main">折线图</div>
</template>
<script>
  // 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
  import * as echarts from 'echarts/core';
  // 引入柱状图图表,图表后缀都为 Chart
  import { BarChart } from 'echarts/charts';
  // 引入标题,提示框,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component
  import {
    TitleComponent,
    TooltipComponent,
    GridComponent,
    DatasetComponent,
    TransformComponent
  } from 'echarts/components';
  // 标签自动布局、全局过渡动画等特性
  import { LabelLayout, UniversalTransition } from 'echarts/features';
  // 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
  import { CanvasRenderer } from 'echarts/renderers';
  export default { //写export default 
    created() {
      echarts.use([
        TitleComponent,
        TooltipComponent,
        GridComponent,
        DatasetComponent,
        TransformComponent,
        BarChart,
        LabelLayout,
        UniversalTransition,
        CanvasRenderer
      ]);
    }
  }
</script>
2.3. 初始化图标,需要在mounted中初始化
<template>
  <div id="main"></div>
</template>
<script>
  // 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
  import * as echarts from 'echarts/core';
  // 引入柱状图图表,图表后缀都为 Chart
  import { BarChart } from 'echarts/charts';
  // 引入标题,提示框,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component
  import {
    TitleComponent,
    TooltipComponent,
    GridComponent,
    DatasetComponent,
    TransformComponent
  } from 'echarts/components';
  // 标签自动布局、全局过渡动画等特性
  import { LabelLayout, UniversalTransition } from 'echarts/features';
  // 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
  import { CanvasRenderer } from 'echarts/renderers';
  export default {
    created() {
      echarts.use([
        TitleComponent,
        TooltipComponent,
        GridComponent,
        DatasetComponent,
        TransformComponent,
        BarChart,
        LabelLayout,
        UniversalTransition,
        CanvasRenderer
      ]);
    },
  mounted(){
    var myChart = echarts.init(document.getElementById('main'));
    const option = {
      title: {
        text: 'ECharts 入门示例'
      },
      tooltip: {},
      xAxis: {
        data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
      },
      yAxis: {},
      series: [
        {
          name: '销量',
          type: 'bar',
          data: [5, 20, 36, 10, 10, 20]
        }
      ]
    }
    myChart.setOption(option)
  }
</script>
2.4. 给mian写一个大小,这样才能在浏览器当中查看到效果(样式自己随意设置就行,具体就是为了看到效果,根据实际情况设置即可)
<template>
  <div id="main"></div>
</template>
  // 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
  import * as echarts from 'echarts/core';
  // 引入柱状图图表,图表后缀都为 Chart
  import { BarChart } from 'echarts/charts';
  // 引入标题,提示框,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component
  import {
    TitleComponent,
    TooltipComponent,
    GridComponent,
    DatasetComponent,
    TransformComponent
  } from 'echarts/components';
  // 标签自动布局、全局过渡动画等特性
  import { LabelLayout, UniversalTransition } from 'echarts/features';
  // 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
  import { CanvasRenderer } from 'echarts/renderers';
  export default {
    created() {
      echarts.use([
        TitleComponent,
        TooltipComponent,
        GridComponent,
        DatasetComponent,
        TransformComponent,
        BarChart,
        LabelLayout,
        UniversalTransition,
        CanvasRenderer
      ]);
    },
    mounted(){
      var myChart = echarts.init(document.getElementById('main'));
      let option = {
        title: {
          text: 'ECharts 入门示例' //标题
        },
        tooltip: {},//工具提示
        xAxis: {
          data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
        },  //x轴
        yAxis: {},  //y轴
        series: [  //数据
          {
            name: '销量',
            type: 'bar',
            data: [5, 20, 36, 10, 10, 20]
          }
        ]
      }
      myChart.setOption(option)
    }
  }
<style>
  #main {
    width:600px;
    height:400px;
  }
  </style>

3. 引入案例

3.1. 在echarts中点开示例

3.2. 将好看的示例替换到上面写的代码中,例如图下

3.3. 修改引入的图表和组件

把引入的柱状图 BarChart 换成折线图 LineChart,并新增数据缩放组件 DataZoomComponent

  • LineChart: 要画折线图,就必须引入折线图的核心模块。
  • DataZoomComponent: 要实现底部的滚动条和图表内部拖拽缩放,就需要这个组件。
<template>
  <div id="main"></div>
</template>
  // 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
  import * as echarts from 'echarts/core';
  // 替换成折线图
  import { LineChart } from 'echarts/charts'; // 1. 换成 LineChart
  // 引入标题,提示框,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component
  import {
    TitleComponent,
    TooltipComponent,
    GridComponent,
    DatasetComponent,
    TransformComponent
    DataZoomComponent // 2. 新增这一行
  } from 'echarts/components';
  // 标签自动布局、全局过渡动画等特性
  import { LabelLayout, UniversalTransition } from 'echarts/features';
  // 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
  import { CanvasRenderer } from 'echarts/renderers';
  export default {
    created() {
      echarts.use([
        TitleComponent,
        TooltipComponent,
        GridComponent,
        DatasetComponent,
        TransformComponent,
        LineChart, //修改这里 把柱状图修改为折线图
        LabelLayout,
        UniversalTransition,
        CanvasRenderer
        DataZoomComponent //在这里使用
      ]);
    },
    mounted(){
      var myChart = echarts.init(document.getElementById('main'));
      let option = {
        title: {
          text: 'ECharts 入门示例' //标题
        },
        tooltip: {},//工具提示
        xAxis: {
          data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
        },  //x轴
        yAxis: {},  //y轴
        series: [  //数据
          {
            name: '销量',
            type: 'bar',
            data: [5, 20, 36, 10, 10, 20]
          }
        ]
      }
      myChart.setOption(option)
    }
  }
<style>
  #main {
    width:600px;
    height:400px;
  }
  </style>
3.4. 添加数据生成函数

<script> 标签的顶部,export default 之前,添加一个名为 generateData1 的函数。

这个函数就是用来生成示例图表里那些模拟数据的。它会生成一个包含时间、数值的数组,并特别标记出 “休息时间”(break)的开始和结束点,这是实现 X 轴断点的关键。

<template>
  <div id="main"></div>
</template>
  // 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
  import * as echarts from 'echarts/core';
  // 替换成折线图
  import { LineChart } from 'echarts/charts'; // 1. 换成 LineChart
  // 引入标题,提示框,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component
  import {
    TitleComponent,
    TooltipComponent,
    GridComponent,
    DatasetComponent,
    TransformComponent
    DataZoomComponent // 2. 新增这一行
  } from 'echarts/components';
  // 标签自动布局、全局过渡动画等特性
  import { LabelLayout, UniversalTransition } from 'echarts/features';
  // 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
  import { CanvasRenderer } from 'echarts/renderers';
  function generateData1() {
  var seriesData = [];
  var time = new Date('2024-04-09T09:30:00Z');
  var endTime = new Date('2024-04-09T15:00:00Z').getTime();
  var breakStart = new Date('2024-04-09T11:30:00Z').getTime();
  var breakEnd = new Date('2024-04-09T13:00:00Z').getTime();
  for (var val = 1669; time.getTime() <= endTime; ) {
    if (time.getTime() <= breakStart || time.getTime() >= breakEnd) {
      val = val + Math.floor((Math.random() - 0.5 * Math.sin(val / 1000)) * 20 * 100) / 100;
      val = +val.toFixed(2);
      seriesData.push([time.getTime(), val]);
    }
    time.setMinutes(time.getMinutes() + 1);
  }
  return { seriesData: seriesData, breakStart: breakStart, breakEnd: breakEnd };
}
  export default {
    created() {
      echarts.use([
        TitleComponent,
        TooltipComponent,
        GridComponent,
        DatasetComponent,
        TransformComponent,
        LineChart,//替换柱状图
        LabelLayout,
        UniversalTransition,
        CanvasRenderer,
        DataZoomComponent//底部的滚动条和图表内部拖拽缩放
      ]);
    },
    mounted(){
      var myChart = echarts.init(document.getElementById('main'));
      let option = {
        title: {
          text: 'ECharts 入门示例' //标题
        },
        tooltip: {},//工具提示
        xAxis: {
          data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
        },  //x轴
        yAxis: {},  //y轴
        series: [  //数据
          {
            name: '销量',
            type: 'bar',
            data: [5, 20, 36, 10, 10, 20]
          }
        ]
      }
      myChart.setOption(option)
    }
  }
<style>
  #main {
    width:600px;
    height:400px;
  }
  </style>
3.5. 更新 mounted 中的图表配置

mounted 函数里初始化图表的代码,换成使用新数据和新配置的版本。

这是最核心的一步,它用新的配置告诉 ECharts:

  • X 轴是时间轴 (type: 'time'),并且有断点 (breaks)。
  • 图表类型是折线图 (type: 'line')。
  • 数据来源是我们刚生成的 _data.seriesData
  • 要显示数据缩放滑块 (dataZoom)。
<template>
  <div id="main"></div>
</template>
<script>
  // 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
  import * as echarts from 'echarts/core';
  // 替换成折线图
  import { LineChart } from 'echarts/charts'; // 1. 换成 LineChart
  // 引入标题,提示框,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component
  import {
    TitleComponent,
    TooltipComponent,
    GridComponent,
    DatasetComponent,
    TransformComponent,
    DataZoomComponent // 2. 新增这一行
  } from 'echarts/components';
  // 标签自动布局、全局过渡动画等特性
  import { LabelLayout, UniversalTransition } from 'echarts/features';
  // 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
  import { CanvasRenderer } from 'echarts/renderers';
  function generateData1() {
  var seriesData = [];
  var time = new Date('2024-04-09T09:30:00Z');
  var endTime = new Date('2024-04-09T15:00:00Z').getTime();
  var breakStart = new Date('2024-04-09T11:30:00Z').getTime();
  var breakEnd = new Date('2024-04-09T13:00:00Z').getTime();
  for (var val = 1669; time.getTime() <= endTime; ) {
    if (time.getTime() <= breakStart || time.getTime() >= breakEnd) {
      val = val + Math.floor((Math.random() - 0.5 * Math.sin(val / 1000)) * 20 * 100) / 100;
      val = +val.toFixed(2);
      seriesData.push([time.getTime(), val]);
    }
    time.setMinutes(time.getMinutes() + 1);
  }
  return { seriesData: seriesData, breakStart: breakStart, breakEnd: breakEnd };
}
  export default {
    created() {
      echarts.use([
        TitleComponent,
        TooltipComponent,
        GridComponent,
        DatasetComponent,
        TransformComponent,
        LineChart,//替换柱状图
        LabelLayout,
        UniversalTransition,
        CanvasRenderer,
        DataZoomComponent//底部的滚动条和图表内部拖拽缩放
      ]);
    },
   mounted() {
  var myChart = echarts.init(document.getElementById('main'));
  var _data = generateData1(); // 1. 获取模拟数据

  var option = {
    useUTC: true,
    title: { text: 'Intraday Chart with Breaks (Single Day)', left: 'center' },
    tooltip: { show: true, trigger: 'axis' },
    xAxis: [{
      type: 'time',
      interval: 1000 * 60 * 30,
      axisLabel: {
        showMinLabel: true,
        showMaxLabel: true,
        formatter: (value, index, extra) => {
          if (!extra || !extra.break) {
            return echarts.time.format(value, '{HH}:{mm}', true);
          }
          if (extra.break.type === 'start') {
            return echarts.time.format(extra.break.start, '{HH}:{mm}', true) + '/' + echarts.time.format(extra.break.end, '{HH}:{mm}', true);
          }
          return '';
        }
      },
      breakLabelLayout: { moveOverlap: false },
      breaks: [{ start: _data.breakStart, end: _data.breakEnd, gap: 0 }],
      breakArea: { expandOnClick: false, zigzagAmplitude: 0, zigzagZ: 200 }
    }],
    yAxis: { type: 'value', min: 'dataMin' },
    dataZoom: [{ type: 'inside', xAxisIndex: 0 }, { type: 'slider', xAxisIndex: 0 }],
    series: [{ type: 'line', symbolSize: 0, data: _data.seriesData }]
  };

  myChart.setOption(option);
}
    </script>
<style>
  #main {
    width:600px;
    height:400px;
  }
  </style>

2.后端接口数据

1.API请求函数定义
  • 这段代码定义了一个API请求函数,使用封装的request工具
  • 当调用getTodayData()时,会向/statistic/todayData发送GET请求
  • 返回的是一个Promise对象,可以使用async/await或.then()处理响应
import request from '@/utils/request' // 引入封装的 request
// 定义获取今日数据的接口请求函数
export function getTodayData () {
  return request({
    url: '/statistic/todayData',
    method: 'get'
  })
}
2.在组件当中引入
<template>
  <div id="main"></div>
</template>

<script>
// 在组件当中引入上面的接口
import { getTodayData } from '@/api/dashboard'
// 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
  import * as echarts from 'echarts/core'
  // 替换成折线图
  import { LineChart } from 'echarts/charts' // 1. 换成 LineChart
  // 引入标题,提示框,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component
  import {
    TitleComponent,
    TooltipComponent,
    GridComponent,
    DatasetComponent,
    TransformComponent,
    DataZoomComponent // 2. 新增这一行
  } from 'echarts/components'
  // 标签自动布局、全局过渡动画等特性
  import { LabelLayout, UniversalTransition } from 'echarts/features'
  // 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
  import { CanvasRenderer } from 'echarts/renderers'
  function generateData1() {
  var seriesData = []
  var time = new Date('2024-04-09T09:30:00Z')
  var endTime = new Date('2024-04-09T15:00:00Z').getTime()
  var breakStart = new Date('2024-04-09T11:30:00Z').getTime()
  var breakEnd = new Date('2024-04-09T13:00:00Z').getTime()
  for (var val = 1669; time.getTime() <= endTime;) {
    if (time.getTime() <= breakStart || time.getTime() >= breakEnd) {
      val = val + Math.floor((Math.random() - 0.5 * Math.sin(val / 1000)) * 20 * 100) / 100
      val = +val.toFixed(2)
      seriesData.push([time.getTime(), val])
    }
    time.setMinutes(time.getMinutes() + 1)
  }
  return { seriesData: seriesData, breakStart: breakStart, breakEnd: breakEnd }
}
  export default {
    created() {
      echarts.use([
        TitleComponent,
        TooltipComponent,
        GridComponent,
        DatasetComponent,
        TransformComponent,
        LineChart, // 替换柱状图
        LabelLayout,
        UniversalTransition,
        CanvasRenderer,
        DataZoomComponent// 底部的滚动条和图表内部拖拽缩放
      ])
    },
   mounted() {
  var myChart = echarts.init(document.getElementById('main'))
  var _data = generateData1() // 1. 获取模拟数据

  var option = {
    useUTC: true,
    title: { text: 'Intraday Chart with Breaks (Single Day)', left: 'center' },
    tooltip: { show: true, trigger: 'axis' },
    xAxis: [{
      type: 'time',
      interval: 1000 * 60 * 30,
      axisLabel: {
        showMinLabel: true,
        showMaxLabel: true,
        formatter: (value, index, extra) => {
          if (!extra || !extra.break) {
            return echarts.time.format(value, '{HH}:{mm}', true)
          }
          if (extra.break.type === 'start') {
            return echarts.time.format(extra.break.start, '{HH}:{mm}', true) + '/' + echarts.time.format(extra.break.end, '{HH}:{mm}', true)
          }
          return ''
        }
      },
      breakLabelLayout: { moveOverlap: false },
      breaks: [{ start: _data.breakStart, end: _data.breakEnd, gap: 0 }],
      breakArea: { expandOnClick: false, zigzagAmplitude: 0, zigzagZ: 200 }
    }],
    yAxis: { type: 'value', min: 'dataMin' },
    dataZoom: [{ type: 'inside', xAxisIndex: 0 }, { type: 'slider', xAxisIndex: 0 }],
    series: [{ type: 'line', symbolSize: 0, data: _data.seriesData }]
  }

  myChart.setOption(option)
}
  }
</script>

<style>
#main {
  width: 600px;
  height: 400px;
}
</style>
3.在控制台打印后端给的数据的方法
<template>
  <div id="main"></div>
</template>

<script>
import { getTodayData } from '@/api/dashboard'
// 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
  import * as echarts from 'echarts/core'
  // 替换成折线图
  import { LineChart } from 'echarts/charts' // 1. 换成 LineChart
  // 引入标题,提示框,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component
  import {
    TitleComponent,
    TooltipComponent,
    GridComponent,
    DatasetComponent,
    TransformComponent,
    DataZoomComponent // 2. 新增这一行
  } from 'echarts/components'
  // 标签自动布局、全局过渡动画等特性
  import { LabelLayout, UniversalTransition } from 'echarts/features'
  // 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
  import { CanvasRenderer } from 'echarts/renderers'
  function generateData1() {
  var seriesData = []
  var time = new Date('2024-04-09T09:30:00Z')
  var endTime = new Date('2024-04-09T15:00:00Z').getTime()
  var breakStart = new Date('2024-04-09T11:30:00Z').getTime()
  var breakEnd = new Date('2024-04-09T13:00:00Z').getTime()
  for (var val = 1669; time.getTime() <= endTime;) {
    if (time.getTime() <= breakStart || time.getTime() >= breakEnd) {
      val = val + Math.floor((Math.random() - 0.5 * Math.sin(val / 1000)) * 20 * 100) / 100
      val = +val.toFixed(2)
      seriesData.push([time.getTime(), val])
    }
    time.setMinutes(time.getMinutes() + 1)
  }
  return { seriesData: seriesData, breakStart: breakStart, breakEnd: breakEnd }
}
  export default {
    created() {
      echarts.use([
        TitleComponent,
        TooltipComponent,
        GridComponent,
        DatasetComponent,
        TransformComponent,
        LineChart, // 替换柱状图
        LabelLayout,
        UniversalTransition,
        CanvasRenderer,
        DataZoomComponent// 底部的滚动条和图表内部拖拽缩放
      ])
    },
   mounted() {
  var myChart = echarts.init(document.getElementById('activityChart'))
  var _data = generateData1() // 1. 获取模拟数据
  this.generateData1() //当页面刷新的时候,就会调用接口

  var option = {
    useUTC: true,
    title: { text: 'Intraday Chart with Breaks (Single Day)', left: 'center' },
    tooltip: { show: true, trigger: 'axis' },
    xAxis: [{
      type: 'time',
      interval: 1000 * 60 * 30,
      axisLabel: {
        showMinLabel: true,
        showMaxLabel: true,
        formatter: (value, index, extra) => {
          if (!extra || !extra.break) {
            return echarts.time.format(value, '{HH}:{mm}', true)
          }
          if (extra.break.type === 'start') {
            return echarts.time.format(extra.break.start, '{HH}:{mm}', true) + '/' + echarts.time.format(extra.break.end, '{HH}:{mm}', true)
          }
          return ''
        }
      },
      breakLabelLayout: { moveOverlap: false },
      breaks: [{ start: _data.breakStart, end: _data.breakEnd, gap: 0 }],
      breakArea: { expandOnClick: false, zigzagAmplitude: 0, zigzagZ: 200 }
    }],
    yAxis: { type: 'value', min: 'dataMin' },
    dataZoom: [{ type: 'inside', xAxisIndex: 0 }, { type: 'slider', xAxisIndex: 0 }],
    series: [{ type: 'line', symbolSize: 0, data: _data.seriesData }]
  }

  myChart.setOption(option)
},
methods: {
  async generateData1 () {
    const res = await getTodayData()
    console.log(res)
  }
}
  }
</script>

<style>
#main {
  width: 600px;
  height: 400px;
}
</style>
4.添加判断的方法,如果接口访问成功,应该怎么做,如果访问不成功
<template>
  <div id="main"></div>
</template>

<script>
import { getTodayData } from '@/api/dashboard'
// 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
  import * as echarts from 'echarts/core'
  // 替换成折线图
  import { LineChart } from 'echarts/charts' // 1. 换成 LineChart
  // 引入标题,提示框,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component
  import {
    TitleComponent,
    TooltipComponent,
    GridComponent,
    DatasetComponent,
    TransformComponent,
    DataZoomComponent // 2. 新增这一行
  } from 'echarts/components'
  // 标签自动布局、全局过渡动画等特性
  import { LabelLayout, UniversalTransition } from 'echarts/features'
  // 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
  import { CanvasRenderer } from 'echarts/renderers'
  function generateData1() {
  var seriesData = []
  var time = new Date('2024-04-09T09:30:00Z')
  var endTime = new Date('2024-04-09T15:00:00Z').getTime()
  var breakStart = new Date('2024-04-09T11:30:00Z').getTime()
  var breakEnd = new Date('2024-04-09T13:00:00Z').getTime()
  for (var val = 1669; time.getTime() <= endTime;) {
    if (time.getTime() <= breakStart || time.getTime() >= breakEnd) {
      val = val + Math.floor((Math.random() - 0.5 * Math.sin(val / 1000)) * 20 * 100) / 100
      val = +val.toFixed(2)
      seriesData.push([time.getTime(), val])
    }
    time.setMinutes(time.getMinutes() + 1)
  }
  return { seriesData: seriesData, breakStart: breakStart, breakEnd: breakEnd }
}
  export default {
    created() {
      echarts.use([
        TitleComponent,
        TooltipComponent,
        GridComponent,
        DatasetComponent,
        TransformComponent,
        LineChart, // 替换柱状图
        LabelLayout,
        UniversalTransition,
        CanvasRenderer,
        DataZoomComponent// 底部的滚动条和图表内部拖拽缩放
      ])
    },
   mounted() {
  var myChart = echarts.init(document.getElementById('activityChart'))
  var _data = generateData1() // 1. 获取模拟数据
  this.generateData1()

  var option = {
    useUTC: true,
    title: { text: 'Intraday Chart with Breaks (Single Day)', left: 'center' },
    tooltip: { show: true, trigger: 'axis' },
    xAxis: [{
      type: 'time',
      interval: 1000 * 60 * 30,
      axisLabel: {
        showMinLabel: true,
        showMaxLabel: true,
        formatter: (value, index, extra) => {
          if (!extra || !extra.break) {
            return echarts.time.format(value, '{HH}:{mm}', true)
          }
          if (extra.break.type === 'start') {
            return echarts.time.format(extra.break.start, '{HH}:{mm}', true) + '/' + echarts.time.format(extra.break.end, '{HH}:{mm}', true)
          }
          return ''
        }
      },
      breakLabelLayout: { moveOverlap: false },
      breaks: [{ start: _data.breakStart, end: _data.breakEnd, gap: 0 }],
      breakArea: { expandOnClick: false, zigzagAmplitude: 0, zigzagZ: 200 }
    }],
    yAxis: { type: 'value', min: 'dataMin' },
    dataZoom: [{ type: 'inside', xAxisIndex: 0 }, { type: 'slider', xAxisIndex: 0 }],
    series: [{ type: 'line', symbolSize: 0, data: _data.seriesData }]
  }

  myChart.setOption(option)
},
methods: {
  async generateData1 () {
    const res = await getTodayData()
    if (res.code === 200) {
  console.log('成功,准备更新图表...')
} else {
  this.$message.error('请求失败,请稍后重试')
}
  }
}
  }
</script>

<style>
#main {
  width: 600px;
  height: 400px;
}
</style>
5.写data+methods当中的东西,具体从控制台看,返回了什么数据

5.1 先写data里面的东西

5.2 删除原始数据

5.3 在methods写后端返回来的数据

<template style="background: #f5f6fa">
  <div class="typical-home" ref="portaletDiv">
    <a-row :gutter="[24, 24]" class="module-list">
      <a-col>
        <div class="module-in module-in06">
          <a-page-header :ghost="false" title="今日户数">
            <template slot="extra">
              <a-icon type="more" />
            </template>
          </a-page-header>
          <div class="lone">
            <div id="activityChart"></div>
          </div>
        </div>
      </a-col>
    </a-row>
  </div>
</template>

<style type="less">
body {
  .modlule-show {
    height: 240px;

    .ant-btn-lg {
      height: 40px;
      font-size: 16px;
      border-radius: 4px;
    }
  }
}

.lone {
  width: 115%;
  height: 320px;

  #activityChart {
    left: -85px;
    top: -55px;
    width: 100%;
    height: 100%;
  }
}
</style>
<script>
// 在组件当中引入上面的接口
import { getTodayData } from '@/api/dashboard'
// 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
import * as echarts from 'echarts/core'
// 替换成折线图
import { LineChart } from 'echarts/charts'// 1. 换成 LineChart
// 引入标题,提示框,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component
import {
  TitleComponent,
  TooltipComponent,
  GridComponent,
  DatasetComponent,
  TransformComponent,
  DataZoomComponent // 2. 新增这一行
} from 'echarts/components'
// 标签自动布局、全局过渡动画等特性
import { LabelLayout, UniversalTransition } from 'echarts/features'
// 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
import { CanvasRenderer } from 'echarts/renderers'

// function generateData1() {
//   var seriesData = []
//   var time = new Date('2024-04-09T09:30:00Z')
//   var endTime = new Date('2024-04-09T15:00:00Z').getTime()
//   var breakStart = new Date('2024-04-09T11:30:00Z').getTime()
//   var breakEnd = new Date('2024-04-09T13:00:00Z').getTime()
//   for (var val = 1669; time.getTime() <= endTime;) {
//     if (time.getTime() <= breakStart || time.getTime() >= breakEnd) {
//       val = val + Math.floor((Math.random() - 0.5 * Math.sin(val / 1000)) * 20 * 100) / 100
//       val = +val.toFixed(2)
//       seriesData.push([time.getTime(), val])
//     }
//     time.setMinutes(time.getMinutes() + 1)
//   }
//   return { seriesData: seriesData, breakStart: breakStart, breakEnd: breakEnd }
// }
export default {
  data() {
    return {
      seriesData: [], // 存储后端返回的[时间戳, 数值]数组
      breakStart: null, // 存储后端返回的起始时间(时间戳)
      breakEnd: null // 存储后端返回的结束时间(时间戳)
    }
  },
  created() {
    // 注册必须的组件
    echarts.use([
      TitleComponent,
      TooltipComponent,
      GridComponent,
      DatasetComponent,
      TransformComponent,
      LineChart,
      LabelLayout,
      UniversalTransition,
      CanvasRenderer,
      DataZoomComponent
    ])
  },
  mounted() {
    var myChart = echarts.init(document.getElementById('main'))
    var _data = generateData1()// 1. 获取模拟数据
    this.generateData1()

    var option = {
      useUTC: true,
      title: { text: 'Intraday Chart with Breaks (Single Day)', left: 'center' },
      tooltip: { show: true, trigger: 'axis' },
      xAxis: [{
        type: 'time',
        interval: 1000 * 60 * 30,
        axisLabel: {
          showMinLabel: true,
          showMaxLabel: true,
          formatter: (value, index, extra) => {
            if (!extra || !extra.break) {
              return echarts.time.format(value, '{HH}:{mm}', true)
            }
            if (extra.break.type === 'start') {
              return echarts.time.format(extra.break.start, '{HH}:{mm}', true) + '/' + echarts.time.format(extra.break.end, '{HH}:{mm}', true)
            }
            return ''
          }
        },
        breakLabelLayout: { moveOverlap: false },
        breaks: [{ start: _data.breakStart, end: _data.breakEnd, gap: 0 }],
        breakArea: { expandOnClick: false, zigzagAmplitude: 0, zigzagZ: 200 }
      }],
      yAxis: { type: 'value', min: 'dataMin' },
      dataZoom: [{ type: 'inside', xAxisIndex: 0 }, { type: 'slider', xAxisIndex: 0 }],
      series: [{ type: 'line', symbolSize: 0, data: _data.seriesData }]
    }
    myChart.setOption(option)
  },
  methods: {
    async generateData1() {
      // 1. 调用后端接口获取数据
      const res = await getTodayData()
      // 2. 验证接口返回(后端code=200表示成功,根据实际接口调整)
      if (res.code === 200 && res.data.seriesData) {
        // 3. 存储后端返回的核心数据([时间戳, 数值]数组)
        this.seriesData = res.data.seriesData
        // 4. 提取数据的起始时间(数组第1项的时间戳)
        this.breakStart = res.data.seriesData[0][0]
        // 5. 提取数据的结束时间(数组最后1项的时间戳)
        this.breakEnd = res.data.seriesData[res.data.seriesData.length - 1][0]
      } else {
        console.error('后端数据返回异常:', res)
      }
    }
  }
}

</script>
<style>
#main {
  width: 600px;
  height: 400px;
}
</style>

<style lang="less">
@import '../typical-home.less';
</style>
6.修改 mounted
  1. 改造mounted为异步函数,为获取数据做准备
  2. 修正 X 轴的breaks配置(避免错误)
  3. 监听窗口大小变化,自动调整图表
  4. 组件销毁时清理(避免内存泄漏)
<template style="background: #f5f6fa">
  <div class="typical-home" ref="portaletDiv">
    <a-row :gutter="[24, 24]" class="module-list">
      <a-col>
        <div class="module-in module-in06">
          <a-page-header :ghost="false" title="今日户数">
            <template slot="extra">
              <a-icon type="more" />
            </template>
          </a-page-header>
          <div class="lone">
            <div id="activityChart"></div>
          </div>
        </div>
      </a-col>
    </a-row>
  </div>
</template>

<style type="less">
body {
  .modlule-show {
    height: 240px;

    .ant-btn-lg {
      height: 40px;
      font-size: 16px;
      border-radius: 4px;
    }
  }
}

.lone {
  width: 115%;
  height: 320px;

  #activityChart {
    left: -85px;
    top: -55px;
    width: 100%;
    height: 100%;
  }
}
</style>

<script>
// 在组件当中引入上面的接口
import { getTodayData } from '@/api/dashboard'
// 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
import * as echarts from 'echarts/core'
// 替换成折线图
import { LineChart } from 'echarts/charts' // 1. 换成 LineChart
// 引入标题,提示框,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component
import {
  TitleComponent,
  TooltipComponent,
  GridComponent,
  DatasetComponent,
  TransformComponent,
  DataZoomComponent // 2. 新增这一行
} from 'echarts/components'
// 标签自动布局、全局过渡动画等特性
import { LabelLayout, UniversalTransition } from 'echarts/features'
// 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
import { CanvasRenderer } from 'echarts/renderers'

// function generateData1() {
//   var seriesData = []
//   var time = new Date('2024-04-09T09:30:00Z')
//   var endTime = new Date('2024-04-09T15:00:00Z').getTime()
//   var breakStart = new Date('2024-04-09T11:30:00Z').getTime()
//   var breakEnd = new Date('2024-04-09T13:00:00Z').getTime()
//   for (var val = 1669; time.getTime() <= endTime;) {
//     if (time.getTime() <= breakStart || time.getTime() >= breakEnd) {
//       val = val + Math.floor((Math.random() - 0.5 * Math.sin(val / 1000)) * 20 * 100) / 100
//       val = +val.toFixed(2)
//       seriesData.push([time.getTime(), val])
//     }
//     time.setMinutes(time.getMinutes() + 1)
//   }
//   return { seriesData: seriesData, breakStart: breakStart, breakEnd: breakEnd }
// }

export default {
  data() {
    return {
      seriesData: [], // 存储后端返回的[时间戳, 数值]数组
      breakStart: null, // 存储后端返回的起始时间(时间戳)
      breakEnd: null // 存储后端返回的结束时间(时间戳)
    }
  },
  created() {
    // 注册必须的组件
    echarts.use([
      TitleComponent,
      TooltipComponent,
      GridComponent,
      DatasetComponent,
      TransformComponent,
      LineChart,
      LabelLayout,
      UniversalTransition,
      CanvasRenderer,
      DataZoomComponent
    ])
  },
  mounted() {
    // var myChart = echarts.init(document.getElementById('main'))
    // var _data = generateData1()// 1. 获取模拟数据
    (async () => {
      // 等待数据加载完成
      await this.generateData1()
      // 数据加载完成后再初始化图表
      var myChart = echarts.init(document.getElementById('activityChart'))

      var option = {
        useUTC: true,
        title: { text: 'Intraday Chart with Breaks (Single Day)', left: 'center' },
        tooltip: { show: true, trigger: 'axis' },
        xAxis: [{
          type: 'time',
          interval: 1000 * 60 * 30,
          min: this.breakStart, // 保留:用数据起始时间作为X轴起点
          max: this.breakEnd, // 保留:用数据结束时间作为X轴终点
          axisLabel: {
            showMinLabel: true,
            showMaxLabel: true,
            formatter: (value, index, extra) => {
              if (!extra || !extra.break) {
                return echarts.time.format(value, '{HH}:{mm}', true)
              }
              if (extra.break.type === 'start') {
                return echarts.time.format(extra.break.start, '{HH}:{mm}', true) + '/' + echarts.time.format(extra.break.end, '{HH}:{mm}', true)
              }
              return ''
            }
          }
          // breakLabelLayout: { moveOverlap: false },
          // breaks: [{ start: _data.breakStart, end: _data.breakEnd, gap: 0 }],
          // breakArea: { expandOnClick: false, zigzagAmplitude: 0, zigzagZ: 200 }
        }],
        yAxis: { type: 'value', min: 'dataMin' },
        dataZoom: [{ type: 'inside', xAxisIndex: 0 }, { type: 'slider', xAxisIndex: 0 }],
        series: [{ type: 'line', symbolSize: 0, data: this.seriesData }]
      }
      myChart.setOption(option)
      // 6. 监听窗口大小变化,自动调整图表
      window.addEventListener('resize', () => {
        myChart.resize()
      })
      // 7. 组件销毁时清理(避免内存泄漏)
      this.$once('hook:beforeDestroy', () => {
        window.removeEventListener('resize', () => { })
        myChart.dispose()
      })
    })()
  },
  methods: {
    async generateData1() {
      // 1. 调用后端接口获取数据
      const res = await getTodayData()
      // 2. 验证接口返回(后端code=200表示成功,根据实际接口调整)
      if (res.code === 200 && res.data.seriesData) {
        // 3. 存储后端返回的核心数据([时间戳, 数值]数组)
        this.seriesData = res.data.seriesData
        // 4. 提取数据的起始时间(数组第1项的时间戳)
        this.breakStart = res.data.seriesData[0][0]
        // 5. 提取数据的结束时间(数组最后1项的时间戳)
        this.breakEnd = res.data.seriesData[res.data.seriesData.length - 1][0]
      } else {
        console.error('后端数据返回异常:', res)
      }
    }
  }
}
</script>

<style>
#main {
  width: 600px;
  height: 400px;
}
</style>

<style lang="less">
@import '../typical-home.less';
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值