react-echarts之折线图的显⽰
react中想要实现折线图和饼图的功能,需要引⼊react-echarts包,然后再实现折线图的功能。我这⾥引⽤的版本是:0.1.1。其他的写法参echarts官⽹即可。下⾯详细讲解的是我在react+redux+router+webpack+antd脚⼿架上⾯完成的折线图和饼图。
这篇⽂章主要讲解的是折线图,折线图主要分为普通的折线图和⼤⾯积折线图,普通的折线图⼜分为三种获取单个折线图、两个折线图、多个每⾏两个折线图。
⼤⾯积折线图,echarts3官⽹⼤⾯积折线图官⽹实例如图,⽹址:echarts.baidu/demo.html#area-simple
将代码粘贴复制到⾃⼰的脚⼿架相对应的组件中即可,以下是我的⼀些功能实现,详细的讲解就在代码注释上⾯
import React, {PropTypes, Component} from 'react';//引⼊react包,⽤于编写react组件
import { Router, Route, browserHistory} from 'react-router';//引⼊react-router包,⽤于路由跳转
import {Row,Col} from 'antd';//引⼊蚂蚁⾦服的antUI组件中的row和col(栅格),管理布局
import ECharts from 'react-echarts';//引⼊react-echarts包,实现echarts实现
import '../../../common/sass/activity/activity.scss';//引⼊⾃⼰的scss⽂件
import '../../../common/sass/public/customButton.scss';
//设置全局变量
var optionDatas={},
converRate=null,
dateArray=[],
rateArray=[];
class ReactEcharts extends React.Component {
constructor(props) {
super(props);
//初始化修改状态属性
this.state = {
visible: false,
activityName:''
}
}
/*⽣命周期函数--->该⽅法在完成⾸次渲染之前被调⽤-》调⽤action中ajax⽅法,获取数据*/
componentWillMount() {
this.props.atyactions.queryAtyView();
}
/**
*条件:当组件确定要更新,在 render 之前调⽤
*⽤处:这个时候可以确定⼀定会更新组件,可以执⾏更新前的操作
*注意:⽅法中不能使⽤ setState ,setState 的操作应该在 componentWillReceiveProps ⽅法中调⽤
* @param nextProps
* @param nextState
*/
componentWillUpdate(nextProps, nextState) {
if(nextProps.atyViewDatas.queryAtyInfoById.status==="yes"){
dateArray.length=0;
rateArray.length=0;
const array=nextProps.urnDatas;
const converRateArray=array[0].converRateArray;
converRateArray.map((item, index) =>{
dateArray.push(item.activityDate);
rateArray.verRate);
converRate=array[0].converRate;
} );
}else{
converRate=null,
dateArray=[],
rateArray=[];
}
//echarts中获取数据的option设置
optionDatas ={
tooltip : {
trigger: 'axis',
position: function (pt) {
return [pt[0], '10%'];
}
},
title: {
text: '整体转化率:'+ converRate*100+"%" +" "
+ '更多详情请点击>>',
//backgroundColor:'#278BDD',
//borderColor: '#ccc',
//borderWidth: 0,
padding: 10,
link:'/activityManage' ,
textStyle: {
fontFamily: '微软雅⿊',
fontSize: 14,
fontStyle: 'normal',
fontWeight: 'normal',
}
},
toolbox: {
feature: {
dataZoom: {
yAxisIndex: 'none'
},
restore: {}
}
},
//布局设置,类似于margin
grid: {
left: '3%',
right: '2%',
bottom: '10%',
containLabel: true
},
//X轴数据设置dateArray
xAxis : [
{
type : 'category',
boundaryGap : false,
data : dateArray
}
],
yAxis : [
{
type : 'value'
}
],
/
/⼤⾯积折线图最下⾯的伸拉条设置,展⽰30天数据
dataZoom: [{
type: 'inside',
start: 0,
end: 30
}, {
start: 0,
end: 30,
//handleIcon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z', handleSize: '80%',
handleStyle: {
color: '#fff',
shadowBlur: 3,
shadowColor: 'rgba(0, 0, 0, 0.6)',
shadowOffsetX: 2,
shadowOffsetY: 2
}
}],
//折线图图标和线条设置以及Y轴数据设置rateArray
series : [
{
name:'转化率',
type:'line',
stack: '总量',
symbol:'star',//节点性状
itemStyle:{
normal:{
color: "#278BDD" //图标颜⾊
}
},
lineStyle:{
normal:{
width:3, //连线粗细
color: "#278BDD" //连线颜⾊
}
},
data:rateArray
}
]
};
}
render(){
return(
<div className="atyViewBg">
<Row style={{marginRight:-20}}>
<Col span={24} className="ehcharts">
<ECharts option={optionDatas} />
</Col>
</Row>
</div>
);
}
}
//定义组件默认的属性值(如果⽗组见没有传递数据,使⽤默认数据)
ReactEcharts.defaultProps = {};
/
/校验从⽗组件传递的属性值是否符合
ReactEcharts.propTypes = {};
//将ReactEcharts组建开放,其他组件只要在⽂件开始引⼊改组件即可引⽤
export default ReactEcharts;
⼤⾯积折线图
效果图如下:
普通折线图,echarts3官⽹普通折线图官⽹实例如图,⽹址:echarts.baidu/demo.html#area-stack
在这⾥我讲解两种折线图动态获取,⼀个是每次获取两个折线图(除了数据不⼀样,其他⼀样),另⼀个是获取多个两个折线图。主要⽤到的⽅法是ES6中的map循环,想了解该语法,请访问如下⽹址:es6.ruanyifeng/#docs/set-map
1. 每次获取两个折线图(除了数据不⼀样,其他⼀样),详细讲解在代码中,和上⾯重复的部分就不再详细讲解。
1 import React, {PropTypes, Component} from 'react';
2 import ECharts from 'react-echarts';
3 import {Row, Col} from 'antd';
4 import '../../../../common/sass/evaluate/evaluate.scss';
5
6 export default class OverallConverRate extends React.Component {
7//
8 constructor(props) {
9 super(props);
10 let d = new Date();
11this.state = {
12 echartsFlag: false,
13 queryParam: {
14 'activityId': this.props.evaluateData.activity.activityId,//活动ID
15 'statisDate': d.getFullYear() + "" + (d.getMonth() + 1) + "" + d.getDate(),//查询⽇期默认当天
16 'userType': 1,//⽤户类型:1是全部⽤户,2是注册⽤户
17 }
18 }
19 }
20 componentWillMount() {
21//调⽤action中的ajax⽅法,获取数据
22this.props.actions.overAllConverRateData(this.state.queryParam);
23 }
24
25 componentWillReceiveProps(nextProps) {
26if (nextProps.evaluateData.allConverRateData.dateArr.length > 0) {
27this.setState({echartsFlag: true});
28 }
29 }
30//echart⽅法
31 echarts() {
32 const optionUsers = {
33 tooltip: {
34 trigger: 'axis'
35 },
36 grid: {
37 left: '5%',
38 right: '5%',
39 top:'10px',
40 bottom: '5%',
41 containLabel: true
42 },
43 xAxis: [
44 {
45 type : 'category',
46 boundaryGap : false,
47 axisTick:{
48 show:false,//是否显⽰坐标轴刻度
49 },
50/*设置X轴字体样式*/
51 axisLabel: {
52 show: true,
53 interval: 0,
54 rotate: 20,//倾斜30度
55 textStyle: {
56 color: '#666',
57 fontSize: 12,
58 fontFamily: '微软雅⿊'
59 }
60 },
61 axisLine: {
62 lineStyle:{
63 color:'#999'
64 }
65 },
66 data: this.props.evaluateData.allConverRateData.dateArr
67 }
68 ],
69 yAxis: [
70 {
71 type : 'value',
72 axisTick:{
73 show:false,//是否显⽰坐标轴刻度
74 },
75//splitNumber:10,//增加Y轴刻度变多
76/*设置y轴字体样式*/
77 axisLabel: {
78 show: true,
79 formatter: '{value}%',
80 textStyle: {
81 color: '#666',
82 fontSize: 12,
83 fontFamily: '微软雅⿊'
84 }
85 },
86 axisLine: {
87 lineStyle:{
88 color:'#999'
89 }
90 }
91 }
92 ],
93 series: [
94 {
95 name: '推荐⼈次转化率',
96 type: 'line',
97 stack: '总量',
98 symbol: 'star',//节点性状
99 itemStyle: {
100 normal: {
101 color: "#278BDD" //图标颜⾊
102 }
103 },
104 lineStyle: {
105 normal: {
106 width: 2, //连线粗细
107 color: "#278BDD" //连线颜⾊
108 }
109 },
110 smooth: true,//折线图是趋缓的
111 data: this.props.evaluateData.allConverRateData.userRateArr 112 }
113 ]
114 };
115 const optionItems = {
116 tooltip: {
117 trigger: 'axis'
118 },
119 grid: {
120 left: '5%',
121 right: '0',
122 top:'10px',
123 bottom: '5%',
124 containLabel: true
125 },
126 xAxis: [
127 {
128 type : 'category',
129 boundaryGap : false,
130 axisTick:{
131 show:false,//是否显⽰坐标轴刻度
132 },
133/*设置X轴字体样式*/
134 axisLabel: {
135 show: true,
136 interval: 0,
137 rotate: 20,//倾斜30度
138 textStyle: {
139 color: '#666',
140 fontSize: 12,
141 fontFamily: '微软雅⿊'
142 }
143 },
144 axisLine: {
145 lineStyle:{
146 color:'#999'
147 }
148 },
149 data: this.props.evaluateData.allConverRateData.dateArr 150 }
151 ],
152 yAxis: [
153 {
154 type : 'value',
155 axisTick:{
156 show:false,//是否显⽰坐标轴刻度
157 },
158//splitNumber:10,//增加Y轴刻度变多
159/*设置y轴字体样式*/
160 axisLabel: {
161 show: true,
162 formatter: '{value}%',
163 textStyle: {
164 color: '#666',
165 fontSize: 12,
166 fontFamily: '微软雅⿊'
167 }
168 },
169 axisLine: {
170 lineStyle:{
171 color:'#999'
172 }
173 }
174 }
175 ],
176 series: [
177 {
178 name: '推荐内容转化率',
179 type: 'line',
180 stack: '总量',
181 symbol: 'star',//节点性状
182 itemStyle: {
183 normal: {
184 color: "#278BDD" //图标颜⾊
185 }
186 },
187 lineStyle: {
188 normal: {
189 width: 2, //连线粗细
190 color: "#278BDD" //连线颜⾊
191 }
192 },
193 smooth: true,//折线图是趋缓的
194 data: this.props.evaluateData.allConverRateData.itemRateArr
195 }
196 ]
197 };
198//推荐⼈次转化率和推荐内容转化率数组中的最后⼀个数据,在echart标题上()显⽰
199 const userRateLast = (this.props.evaluateData.allConverRateData.userRateArr[this.props.e
valuateData.allConverRateData.userRateArr.length-1]) ? (this.props.evaluateData.allConverRateData.userRateArr[this.props.evaluateData.allCon 200 const itemRateLast = (this.props.evaluateData.allConverRateData.itemRateArr[this.props.evaluateData.allConverRateData.itemRateArr.length-1]) ? (this.props.evaluateData.allConverRateData.itemRateArr[this.props.evaluateData.allCon 201if (hartsFlag) {
202return <div className="common-echart-body-div">
203 <Col span={11} className="commont-small-ehcharts">
204 <Col span={14} offset={1}><h2 className="common-echart-title">推荐⼈次转化率({userRateLast})</h2></Col>
205 <ECharts option={optionUsers} />
206 </Col>
207 <Col span={2} ><div className="common-echart-border"></div></Col>
208 <Col span={11} className="commont-small-ehcharts">
209 <Col span={14} offset={1}><h2 className="common-echart-title">推荐内容转化率({itemRateLast})</h2></Col>
210 <ECharts option={optionItems} />
211 </Col>
212 </div>;
213 } else {
214return '没有折线图';
215 }
216 }
217
218 render() {
219return (
220 <div className="sceneEvaluateRate">
221 {harts()}{/*调⽤echarts()⽅法*/}
222 </div>
223 );
224 }
225 }
效果图如下:
2.获取多个两个折线图,代码如下:
1 import React, {PropTypes, Component} from 'react';
2 import ECharts from 'react-echarts';
3 import {Row,Col,Modal} from 'antd';
4 import SceneConverRateModal from './SceneConverRateModal';
5 import '../../../../common/sass/public/echarts.scss';
6
7 export default class SceneConverRate extends React.Component {
8 constructor(props) {
9 super(props);
10 let d = new Date();
11//初始化修改状态属性
12this.state = {
13 visible: false,
14 queryParam: {
15 'activityId': this.props.evaluateData.activity.activityId,//活动ID
16 'statisDate': d.getFullYear() + "" + (d.getMonth() + 1) + "" + d.getDate(),//查询⽇期默认当天
17 'userType': 1,//⽤户类型:1是全部⽤户,2是注册⽤户
18 'channelId':null,//渠道ID
19 'operpId':null,//运营位ID
20 'rows':3,// 每页总条数据
21 'page':1// 当前页
22 }
23 }
24 }
25//组件渲染之前调⽤⽅法获取数据
26 componentDidMount() {
27//调⽤redux中action中的ajax⽅法,调⽤相对应的java的⽅法获取返回数据
28this.props.actions.sceneEvaluateRate(this.state.queryParam);
29 }
30 render() {
31 const sceneEvaluateRateData = this.props.evaluateData.sceneEvaluateRateData.data;
32return (
33 <div>
34 <h2 className="common-echart-title-mn">分场景转化率</h2>
35 {/*map⽅法循环获取echart折线图*/}
36 {react native
37 sceneEvaluateRateData.map((item, index) => {
38return <div><EchartsCom item={item} index={index}></EchartsCom></div>
39 })
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论