echarts进阶阶段练习,拿到后端接口数据,渲染图表,完成调节样式(完整代码在最后)

效果图

我们可以将图表的渲染分成三个阶段 初始化阶段、数据更新阶段、分辨率适配阶段

一、初始化阶段

那么我们在初始化阶段要先拿到后端接口数据

首次需要在根路径下的main.js文件中引入axios并且将axios挂载到Vue原型对象上

import axios from 'axios'
// 请求基准路径的配置 根据自己的接口路径来修改
axios.defaults.baseURL = 'http://127.0.0.1:8888/api/'
// 将axios挂载到Vue原型对象上
// 在别的组件中this.$http
Vue.prototype.$http = axios

然后我们需要建立一个页面来写我们的图表,并在这个页面的methods中建立getData方法拿到接口数据

async getData () {// 根据自己的接口路径来修改方法里的参数const { data: ret } = await this.$http.get('trend')this.allData = retthis.updateChart()},

拿到接口后,我们就需要初始化这个图表

initChart () {this.chartInstance = this.$echarts.init(this.$refs.trendRef, 'chalk')const initOption = {grid: {left: '3%',top: '35%',right: '4%',bottom: '1%',// 把坐标轴的文字 控制在范围大小以内containLabel: true},tooltip: {trigger: 'axis'},legend: {left: 20,top: '15%',icon: 'circle'},xAxis: {type: 'category',// x轴 挤紧挨边缘boundaryGap: false},yAxis: {type: 'value'}}this.chartInstance.setOption(initOption)},

这时,我们图表的初始化已经完成,但是我们还没有将接口拿到的数据放进去,下面我们需要进行的就是第二阶段,数据更新阶段

二、数据更新阶段

在methods方法中建一个updateChart方法,在此方法中我们来处理接口拿到的数据

我们首先需要在方法中新建一个变量timeArr来拿我们类目轴的数据

const timeArr = this.allData.common.month

接着在新建变量拿y轴和series下的数据

const valueArr = this.allData[this.choiceType].dataconst seriesArr = valueArr.map((item, index) => {return {name: item.name,type: 'line',data: item.data,// 数据堆叠stack: this.choiceType,areaStyle: {color: new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [{offset: 0,color: colorArr1[index]}, // 百分之0的颜色值{offset: 1,color: colorArr2[index]} // 百分之100的颜色值])}}})

然后我们在新建一个变量来拿我们的图例数据

// 图例的数据const legendArr = valueArr.map(item => {return item.name})

接下来我们需要重新setOption图表数据,让我们拿到的数据渲染上去

以下是updateChart方法完整代码

updateChart () {// 半透明的颜色值const colorArr1 = ['rgba(11, 168, 44, 0.5)','rgba(44, 110, 255, 0.5)','rgba(22, 242, 217, 0.5)','rgba(254, 33, 30, 0.5)','rgba(250, 105, 0, 0.5)']// 全透明的颜色值const colorArr2 = ['rgba(11, 168, 44, 0)','rgba(44, 110, 255, 0)','rgba(22, 242, 217, 0)','rgba(254, 33, 30, 0)','rgba(250, 105, 0, 0)']// 处理数据// 类目轴的数据const timeArr = this.allData.common.month// y轴的数据 series下的数据const valueArr = this.allData[this.choiceType].dataconst seriesArr = valueArr.map((item, index) => {return {name: item.name,type: 'line',data: item.data,// 数据堆叠stack: this.choiceType,areaStyle: {color: new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [{offset: 0,color: colorArr1[index]}, // 百分之0的颜色值{offset: 1,color: colorArr2[index]} // 百分之100的颜色值])}}})// 图例的数据const legendArr = valueArr.map(item => {return item.name})const dataOption = {xAxis: {data: timeArr},legend: {data: legendArr},series: seriesArr}this.chartInstance.setOption(dataOption)},

接下来我们需要让图表可以根据屏幕的大小来自适应,那么就来到第三阶段分辨率适配阶段

三、分辨率适配

在methods中新建一个screenAdapter 方法来让图表自适应屏幕大小

screenAdapter () {this.titleFontSize = this.$refs.trendRef.offsetWidth / 100 * 3.6const adapterOption = {legend: {itemWidth: this.titleFontSize,itemHeight: this.titleFontSize,itemGap: this.titleFontSize,textStyle: {fontSize: this.titleFontSize / 2}}}this.chartInstance.setOption(adapterOption)this.chartInstance.resize()},

这样图表就渲染完成了,接下来我们可以做一些小小的优化来使图表给人体验感更好

完整代码如下

<template><div class="com-container"><div class="title" :style="comStyle"><span>{{ "▎" + showTitle }}</span><iclass="iconfont icon-arrow-down":style="comStyle"@click="showChoice = !showChoice"></i><div class="select-con" v-show="showChoice" :style="marginStyle"><divclass="select-item"v-for="item in selectTypes":key="item.key"@click="handleSelect(item.key)">{{ item.text }}</div></div></div><div class="com-chart" ref="trendRef"></div></div>
</template><script>
export default {name: 'Trend',data () {return {chartInstance: null,// 从服务器中获取的所有数据allData: null,// 是否显示可选项showChoice: false,// 显示的数据类型choiceType: 'map',// 指明标题字体大小titleFontSize: 0}},created () {// 组件创建完成后 进行回调函数的注册// this.$socket.registerCallBack('trendData', this.getData)},mounted () {this.initChart()this.getData()window.addEventListener('resize', this.screenAdapter)this.screenAdapter()},destroyed () {window.removeEventListener('resize', this.screenAdapter)},computed: {selectTypes () {if (!this.allData) {return []} else {return this.allData.type.filter(item => {return item.key !== this.choiceType})}},showTitle () {if (!this.allData) {return ''} else {return this.allData[this.choiceType].title}},// 设置给标题的样式comStyle () {return {fontSize: this.titleFontSize + 'px'}},marginStyle () {return {marginLeft: this.titleFontSize + 'px'}}},methods: {initChart () {this.chartInstance = this.$echarts.init(this.$refs.trendRef, 'chalk')const initOption = {grid: {left: '3%',top: '35%',right: '4%',bottom: '1%',// 把坐标轴的文字 控制在范围大小以内containLabel: true},tooltip: {trigger: 'axis'},legend: {left: 20,top: '15%',icon: 'circle'},xAxis: {type: 'category',// x轴 挤紧挨边缘boundaryGap: false},yAxis: {type: 'value'}}this.chartInstance.setOption(initOption)},async getData () {const { data: ret } = await this.$http.get('trend')this.allData = retconsole.log(this.allData)this.updateChart()},updateChart () {// 半透明的颜色值const colorArr1 = ['rgba(11, 168, 44, 0.5)','rgba(44, 110, 255, 0.5)','rgba(22, 242, 217, 0.5)','rgba(254, 33, 30, 0.5)','rgba(250, 105, 0, 0.5)']// 全透明的颜色值const colorArr2 = ['rgba(11, 168, 44, 0)','rgba(44, 110, 255, 0)','rgba(22, 242, 217, 0)','rgba(254, 33, 30, 0)','rgba(250, 105, 0, 0)']// 处理数据// 类目轴的数据const timeArr = this.allData.common.month// y轴的数据 series下的数据const valueArr = this.allData[this.choiceType].dataconst seriesArr = valueArr.map((item, index) => {return {name: item.name,type: 'line',data: item.data,// 数据堆叠stack: this.choiceType,areaStyle: {color: new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [{offset: 0,color: colorArr1[index]}, // 百分之0的颜色值{offset: 1,color: colorArr2[index]} // 百分之100的颜色值])}}})// 图例的数据const legendArr = valueArr.map(item => {return item.name})const dataOption = {xAxis: {data: timeArr},legend: {data: legendArr},series: seriesArr}this.chartInstance.setOption(dataOption)},screenAdapter () {this.titleFontSize = this.$refs.trendRef.offsetWidth / 100 * 3.6const adapterOption = {legend: {itemWidth: this.titleFontSize,itemHeight: this.titleFontSize,itemGap: this.titleFontSize,textStyle: {fontSize: this.titleFontSize / 2}}}this.chartInstance.setOption(adapterOption)this.chartInstance.resize()},handleSelect (currentValue) {this.choiceType = currentValuethis.updateChart()this.showChoice = false}},
};
</script><style lang="less" scoped>
.title {position: absolute;left: 20px;top: 20px;z-index: 10;color: #fff;cursor: pointer;.icon-arrow-down {cursor: pointer;margin-left: 10px;}.select-con {background-color: #222733;}
}
</style>

echarts进阶--销售趋势图相关推荐

  1. (完整)ECharts(趋势图(曲线版)带双滚轮)

    1.我是用的element + vue下面的代码是js代码 let myChart = echarts.init(document.getElementById('main'));that.table ...

  2. echarts仪表盘,柱状图,折线图,趋势图

    系列文章目录 文章目录 系列文章目录 前言 一.仪表盘 二.柱状图 三.折线图 四.趋势图 前言 //解决页面刷新canvas画布变大async loadEcharts(id) {var myChar ...

  3. 【Echarts】折线图/趋势图区间框选计算

    针对折线图类的趋势图,以时间为横坐标,根据用户图形的区域框选可实时计算框选范围内的均值.总量或其他数据,具体实现代码如下: let xData = ['2022-05-01', '2022-05-02 ...

  4. Echart.js的趋势图入门与实例

    在平时开发项目时,免不了需要对数据进行图表显示的需求,比如:趋势图.饼状图.柱形图等.自己身为一个PHPer,除了PHP本身的功能,不得不需要借助js来实现显示.在了解众多趋势图插件,国内外开源的项目 ...

  5. 汽车销量查询小助手(小程序)销量趋势图功能及代码知识分享

    1. 引言 在上篇博客汽车销量查询小助手(小程序)开发心路历程 我分享了整个小程序的开发历程,感谢有那么多同学阅读和关注. 后面就会将小程序中的各个功能块以代码片段的方式给大家分享出来,所有的代码都在 ...

  6. 中国蒸汽眼罩市场销售趋势及营销渠道策略报告(新版)2022-2027年

    中国蒸汽眼罩市场销售趋势及营销渠道策略报告(新版)2022-2027年 **************************************** [报告编号]: BG414923 [出版时间] ...

  7. echarts vue 酷炫图_「干货」用 Vue + Echarts 打造你的专属可视化界面(上)

    作者简介: Jaked 8年前端工作经验, 主要分享:职业发展方面.前端技术.面试技巧等. 在近期的项目中,有大量处理可视化数据的需求.说起这个,相信很多同学跟我一样,都会想到用 Echarts 来实 ...

  8. echarts.js实现雷达图

    echarts.js实现雷达图 本次小编要介绍的是雷达图画法与需求注意的点. 一.雷达图插件的引用 首先引用echarts.js 与jquery.js <script src="js/ ...

  9. echarts 虚实结合的折线图

    遇到实际与预测的需求时,经常会有趋势图实线与虚线结合的需求,分享一下实现关键点 首先,我们需要两条折线,一条实线(默认就是实线),一条虚线 其次,处理数据(L1实线数据,L3虚线数据) 可以看见'20 ...

最新文章

  1. springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序
  2. HotApp小程序统计,第一个专业的微信第三方小程序统计工具
  3. Memcached分布式算法详解--转
  4. BZOJ 4884 [Lydsy2017年5月月赛]太空猫(单调DP)
  5. 本地mysql无法监听_查询数据库出错,监听器无法监听
  6. Metal Framework基础使用教程
  7. ionic 压缩和上传视频文件
  8. 滑动窗口:LeetCode 3 无重复字符的最长子串
  9. oracle中怎么sqlprompt,自定义sqlplus登录过后的sqlprompt
  10. php后台发送qq消息,WebQQ消息发送功能
  11. ARMA 模型的参数估计 —— 增广最小二乘法
  12. Poi Excel 设置列宽计算公式
  13. PVAJP计划:暨关于.Press全站使用VUE-AJAX-JSON-PYTHON的新规划
  14. 基于有道翻译的英翻中微信小程序
  15. 更换电脑机械硬盘之后,无需重新安装程序技巧(系统盘为固态),解决D盘程序快捷方式图标白色方块
  16. 中国软件:10个人 20年坎坷路
  17. 机器视觉(Machine Vision)
  18. 【 Visual C++】游戏开发笔记之二——最简单的DirectX,vc窗口的编写
  19. 如何拍背景虚化的照片_拍摄人像背景虚化的照片怎么拍?
  20. [SolidWorks二次开发]特征造型——拉伸(1)

热门文章

  1. python的lxml库简介_Python lxml库简介
  2. 使用DMO遍历xml文件(将xml文件中要获取的内容存到ArrayList集合中再取出来)(DMO解析)
  3. Android Recovery模式
  4. 搜狗重磅开源的又一力作:一个服务器引擎
  5. Java练习:两种方式求1+1/2!+1/3!+1/4!+...前20项的和、用for,while,do-while分别实现1+1/2!+1/3!+1/4!+...前20项的和
  6. java 空文件夹删除_删除Java中的空文件夹,处理隐藏文件
  7. qt 新窗口show后马上关闭_qt学习(四)主窗选钮,显示新窗口。
  8. CHARINDEX 和 PATINDEX
  9. Vite+Vue3+TypeScript基础知识案例
  10. 详谈 2PC 3PC