内容简介:虽说如此,但是因此就来专门讲一讲这配置项的坑以及如何通过组件的方式正确的”食用“。
ECharts ,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上。可以这么说,在国内,是个前端都知道这个玩意是干嘛用的,毕竟它还是出自于国人之手。
虽说如此,但是 Echarts 涵盖的类型实在是太广了,它给我们提供了很多配置项,但呼之而来的问题是会有点让刚接触的人有点茫然… 哪些参数是必要的?哪个参数又跟什么地方的 key 值相对应,缺失后就无法正常的显示…
因此就来专门讲一讲这配置项的坑以及如何通过组件的方式正确的”食用“。
其实 Echarts 也有自己的使用教程,但本文的重心并不是从零开始讲解 Echarts ,至于更多使用细节可以看官方的 文档 。
这里姑且先用折线图作示例。首先需要先引入 ECharts , 我们选择好自己所需的版本后(tips: 如何选择版本,可以去看看 这里 ),然后在 </body> 前插入脚本: <script src="echarts.min.js"></script> 。
随后通过 echarts 提供的 API 初始化目标容器节点:
// 初始化 echarts
var myChart = echarts.init(document.getElementById('main'));
接着我们需要填写配置项:
var config = {
// 全局 tooltip ,
tooltip: {
show: true,
// 坐标轴触发
trigger: 'axis'
},
// 图例组件,也就是提供显示或隐藏某一条数据信息开关
legend: {
// 组件在底部显示
bottom: '0px',
// 图例每项之间的间隔
itemGap: 46,
// 图例的数据数组, 省略则自动从 series.name 中获取
// 但我们需要定制样式,因此我们添上去上去
data: [
{
name: '曝光量',
icon: 'circle'
},
{
name: '点击量',
icon: 'circle'
}
],
// 文字样式
textStyle: {
color: '#276dcc',
fontSize: 14
}
},
// 重设全局调色盘的颜色,比如当前涉嫌图示例中有两条数据
// 那这两条数据就会取得我们当前设置颜色作为展示
color: ['#42a66a', '#276dcc'],
// 网格布局
grid: {
// 下面三个是离容器的位置
left: '3%',
right: '4%',
bottom: '40px',
// 坐标刻度,默认是false
containLabel: true
},
// X轴配置
xAxis: {
type: 'category',
boundaryGap: false,
// 坐标轴配置
axisLine: {
lineStyle: {
color: '#d6dfea'
}
},
// 坐标轴上的 label 样式
axisLabel: {
margin: 18,
fontSize: 14,
color: '#56749d'
},
// 类目数据,只有在 type: 'category' 中有效。
// 一般情况下我们并不会手动写死数据进去,而是通过 Ajax 请求数据来展示
data: []
},
// Y轴配置
yAxis: [
{
// 数值轴
type: 'value',
name: '点击量',
// 左侧显示
position: 'left',
// 下面的样式不再多说
axisLine: {
lineStyle: {
color: '#d6dfea'
}
},
axisLabel: {
margin: 18,
fontSize: 14,
color: '#56749d'
}
},
{
type: 'value',
name: '曝光量',
position: 'right',
axisLine: {
lineStyle: {
color: '#d6dfea'
}
},
axisLabel: {
margin: 18,
fontSize: 14,
color: '#56749d'
}
}
],
// 系列列表, 这个是数据的关键所在
series: [
// 如果 legend.data 设置了数据的话,那么 series 的数目需要和 legend.data 的数目一致。
// 否则图表会不工作 !!
{
name: '点击量',
// 图表的类型,在这个示例中我们使用是折线图
type: 'line',
yAxisIndex: 1,
// 系列中的数据内容数组
// 同样的,我们主要展示的数据来自于服务端
data: []
},
{
name: '曝光量',
type: 'line',
// 折线图一维数据可能是这种形式的数组
// [1, 2, 3, 1, 4]
data: []
}
]
};
随后可以通过 Ajax 获取数据,再使用 setOption 来设置选项:
$.ajax({
url: url,
method: 'GET',
data: data
}).done(function(res){
config.series[0].data = res.data.click;
config.series[1].data = res.data.exposure;
config.xAxis.data = res.data.xAxis;
myChart.setOption(option);
});
如此,这样我们定义的 echarts 就完成啦~
Vue 组件
在 vue 中封装组件也不难,大致如下:
<template>
<div:class="['data-echart', echartClass ]">
<divclass="data-echart__header">
<slotname="title">
<divclass="header__title">
<spanv-if="title"class="title-name">{{title}}</span>
<el-popover
v-if="tooltip"
ref="tooltip"
placement='bottom'
trigger='hover'>
<divv-html="tooltip"></div>
</el-popover>
<iv-if="tooltip"class="el-icon-question"v-popover:tooltip></i>
</div>
</slot>
</div>
<div:id="echartId"class="echart__main"></div>
</div>
</template>
<script>
import echarts from 'echarts';
export default {
name: 'echart',
props: {
title: {
type: String,
default: ''
},
tooltip: {
type: String,
default: ''
},
echartClass: {
type: String,
default: ''
},
option: {
type: Object,
default() {
return {};
}
},
loading: {
type: Boolean,
default: false
}
},
computed: {
domEchartId() {
return (document || window.document).getElementById(this.echartId);
}
},
data() {
return {
// 随机生成一个ID
echartId: this.randomChar(20),
myChart: null
};
},
watch: {
option: {
deep: true,
handler(newVal) {
this.update(newVal);
}
},
loading(newVal) {
this.toggleLoading(newVal);
}
},
mounted() {
this.init();
},
methods: {
// 调起loading
toggleLoading(flag) {
flag ? this.myChart.showLoading() : this.myChart.hideLoading();
},
init() {
this.myChart = echarts.init(this.domEchartId);
this.myChart.on('click', (params) => {
this.$emit('clickEchart', params);
});
// 绘制图表
this.myChart.setOption(this.option);
// Object.keys(this.data).length !== 0 && this.myChart.setOption(this.data);
},
update(data) {
this.myChart.setOption(data);
},
/**
* 生成随机字符串
* @param { Number } len - 指定随机字符串的长度
*/
randomChar(len) {
const x = '0123456789qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM';
let tmp = '';
for (let i = 0; i < len; i++) {
tmp += x.charAt(Math.ceil(Math.random() * 100000000) % x.length);
}
return tmp;
},
}
};
</script>
<stylelang='scss'scoped>
@import '~Scss/theme';
.data-echart {
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
overflow: hidden;
}
.data-echart__header {
width: 100%;
}
.header__title {
.title-name {
font-size: 16px;
color: $f-color--title;
font-weight: 600;
}
.el-icon-question {
font-size: 18px;
color: $f-color--tip;
}
}
.echart__main {
flex: 1;
width: 100%;
height: 100%;
}
</style>
我们需要将组件放入一个设有高度的容器上:
<divclass="container"style="height: 600px;"> <echart:option="charts.option"></echart> </div>
调用的方式也面类似。首先声明一个基础的配置作为模板,在通过 ajax 拿到数据。通过动态数据传入组件内,组件 watch 到数据变化后立即重新渲染:
// 某处集中封装的 ajax 请求
import API from 'Common/apis'
// 同上配置
const config = {...}
export default {
data() {
return {
charts: {
title: 'My charts'
option: config
}
}
},
created() {
API.getChartData()
.then(res=> {
let data = res.data
this.charts.option.xAxis.data = data.xAxis;
this.charts.option.series[0].data = data.click;
this.charts.option.series[1].data = data.exposure;
})
}
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Emmet 食用指北
- Flutter Redux 食用总结
- 拿走不谢,这份【亿级流量系统】数据一致性重构的食用指南【石杉的架构笔记】
- Reddit大热,伯克利PPT带你丝滑入门机器学习:知识点全面覆盖,笔记可搭配食用
- BootDo 1.4.0 发布,sql 注解方式更改成 xml 方式
- 正则表达式创建方式的区别及编写简单的正则方式(js学习总结)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。