本文用Vue2.0+elementUI的panel组件和table组件+echarts的柱状图和折线图实现对结果的展示,实现了表格和图之间的切换和图和表之间的转置。
-html
js,panel组件的代码
在使用上述组件过程中,发现当转置和表格切换之后里面全部都有变化,虽然可以做到单个panel组件自己实现转置和切换,但是发现如果数据太多会导致页面卡死,为了性能优化所以后来考虑采用多vue对象的形式(虽然我的思路是如果改变数据之后,vue将重新渲染html,导致页面卡死,但是后来仔细查资料之后,发现vue当数据改变之后会复用原来相同的html。但是由于时间的原因,也没试。大家可以考虑一下)
采用多vue对象的形式之后的页面
html
js,panel组件
");
$(".resultDiv").append(el[0]);
var vueObj = new Vue({
el : el[0],template : ''+
'',props : ['item','mapOption'],data : {
indicator : indicators[i],rowOrColumn : false,// 行列转换
tableOrMap : true,// 表和图切换
tableAndMap : true,// 表和图同时显示
indexid : i,mapInitOption : {
title : {
text : '',show : false
},tooltip : {
trigger : 'item',formatter: ''
},legend : {
data : [],right : 90,// 不要遮住右边的按钮
left : 85,padding : 10
},toolbox : {
show : true,feature : {
mark : {
show : true
},magicType : {
show : true,type : ['line','bar']
},restore : {
show : true
},saveAsImage : {
show : true
}
}
},grid : {
y : '',y2 : '',containLabel : true
},xAxis : [{
type : 'category',boundaryGap : false,axisLabel : {
interval : 0
// rotate : 45
}
}
],yAxis : [{
type : 'value',axisLabel : {
formatter : yAxisFormatter
}
}
]
} // echarts 初始化参数
},methods : {
transpose : function (ev) {
if (this.rowOrColumn) {
this.item = this.listToRowObject(this.indicator);
this.mapOption = this.listToRowMap(this.indicator);
this.rowOrColumn = false;
} else {
this.item = this.listToColumnObject(this.indicator);
this.mapOption = this.listToColumnMap(this.indicator);
this.rowOrColumn = true;
}
var indicatorName = this.mapOption.title.text;
var myChart = echarts.init(document.getElementById([indicatorName]),rmp_theme);
var grid = computerGrid(this.mapOption);
myChart.resize({
width : grid.chartWidth+"px",height : grid.chartHeight+"px"
});
myChart.setOption(this.mapOption);
ev.stopPropagation();
},listToColumnObject : function (ListAndList) {
var x_y = column.text+""+row.text;
var itemTable ={};
var columnR = [];
var tableData=[];
for (var yIndex in ListAndList.indicatorData) {
var obj = {};
obj[x_y] = ListAndList.colKeys[yIndex];
for (var xIndex in ListAndList.indicatorData[yIndex]) {
obj[ListAndList.rowKeys[xIndex]] =cellsDeal(ListAndList.indicatorData[yIndex][xIndex],ListAndList.indicatorUnit);
}
tableData.push(obj);
}
columnR.push(x_y);
columnR = columnR.concat(ListAndList.rowKeys);
itemTable["indicatorName"]=ListAndList.indicatorName;
itemTable["tableData"] = tableData;
itemTable["columns"]=columnR;
itemTable["indicatorUnit"]=ListAndList.indicatorUnit;
return itemTable;
},listToRowObject : function (ListAndList) {
var itemTable ={};
var indicatorMap = {};
var indicatorData=[];
var y_x = row.text+""+column.text;
var columnR = [];
var tableData = [];
columnR.push(y_x);
columnR = columnR.concat(ListAndList.colKeys);
indicatorData.push(ListAndList.rowKeys);
indicatorData = indicatorData.concat(ListAndList.indicatorData);
for (var k = 0; k < indicatorData[0].length; k++) {
var aRow = {};
for (var j = 0; j < indicatorData.length; j++) {
if(j==0){
aRow[columnR[j]] = indicatorData[j][k];
}else{
aRow[columnR[j]] = cellsDeal(indicatorData[j][k],ListAndList.indicatorUnit);
}
}
tableData.push(aRow);
}
itemTable["indicatorName"]=ListAndList.indicatorName;
itemTable["tableData"] = tableData;
itemTable["columns"]=columnR;
itemTable["indicatorUnit"]=ListAndList.indicatorUnit;
return itemTable;
},listToColumnMap : function (ListAndList) {
// var echartOption = echarts.getInstanceByDom(document.getElementById(ListAndList.indicatorName)).getOption();
// var mapType = echarts.getInstanceByDom(document.getElementById(ListAndList.indicatorName)).getOption().series[0].type;
var options = [];
var sigleOption = {};
sigleOption = this.mapInitOption; // 实现深复制
var rowKeys = JSON.parse(JSON.stringify(ListAndList.rowKeys));
rowKeys.pop();
sigleOption.xAxis[0]["data"] = rowKeys;
var indicatorName = ListAndList.indicatorName;
sigleOption["title"]["text"] = indicatorName;
var series = [];
for (var k = 0; k < ListAndList.indicatorData.length - 1; k++) {
var sigleSerie = {
type : 'line',barMaxWidth : 40,barMinHeight : 15
};
sigleSerie["name"] = ListAndList.colKeys[k];
var rows = JSON.parse(JSON.stringify(ListAndList.indicatorData[k]))
rows.pop();
sigleSerie["data"] = rows;
series.push(sigleSerie);
}
sigleOption["series"] = series;
var legendData = JSON.parse(JSON.stringify(ListAndList.colKeys));
legendData.pop();
sigleOption.legend.data = legendData;
var unitHandle=ListAndList.indicatorUnit;
sigleOption.tooltip.formatter=function (params,ticket,callback) {
var myUnit =unitHandle;
var html = '行:'+params.seriesName +' ';
html+=' ';
var showValue = params.value;
if (typeof (showValue) == "undefined") {
showValue = "NoData";
} else {
// 图悬浮框 千分位+万 +单位
if (!isNaN(showValue)) {
if (showValue > 10000) {
showValue = toThousands((showValue / 10000).toFixed(1)) + $.i18n.get('chart.wan')+ myUnit;
}else{
if(unitHandle=='%'){
showValue=parseFloat(showValue)*100;
showValue = showValue.toFixed(1) + myUnit;
}else{
showValue = showValue.toFixed(1) + myUnit;
}
}
}
}
html+='';
return html;
};
return sigleOption;
},listToRowMap : function (ListAndList) {
/* var mapType;
if(typeof(this.mapOptions)=='undefined'){
mapType='line';
}else{
mapType = echarts.getInstanceByDom(document.getElementById(ListAndList.indicatorNames[0])).getOption().series[0].type;
}*/
var options = [];
var sigleOption = {};
sigleOption = this.mapInitOption; // 实现深复制
var colKeys = JSON.parse(JSON.stringify(ListAndList.colKeys));
colKeys.pop();
sigleOption.xAxis[0]["data"] = colKeys;
var indicatorName = ListAndList.indicatorName;
sigleOption["title"]["text"] = indicatorName;
var series = [];
for (var k = 0; k < ListAndList.rowKeys.length - 1; k++) { // 图TTL指标去掉
var sigleSerie = {
type : 'line',barMinHeight : 15
};
var x = [];
for (var z = 0; z < ListAndList.colKeys.length - 1; z++) {
x.push(ListAndList.indicatorData[z][k]);
}
sigleSerie["name"] = ListAndList.rowKeys[k];
sigleSerie["data"] = x;
series.push(sigleSerie);
}
sigleOption["series"] = series;
var legendData = JSON.parse(JSON.stringify(ListAndList.rowKeys));
legendData.pop();
sigleOption.legend.data = legendData;
var unitHandle=ListAndList.indicatorUnit;
sigleOption.tooltip.formatter=function (params,callback) {
var myUnit =unitHandle;
var color = params.color;
var html = ' ';
html+=' ';
var showValue = params.value;
if (typeof (showValue) == "undefined") {
showValue = "NoData";
} else {
// 图悬浮框 千分位+万 +单位
if (!isNaN(showValue)) {
if (showValue > 10000) {
showValue = toThousands((showValue / 10000).toFixed(1)) + $.i18n.get('chart.wan')+myUnit;
}else{
if(unitHandle=='%'){
showValue=parseFloat(showValue)*100;
showValue = showValue.toFixed(1) + myUnit;
}else{
showValue = showValue.toFixed(1) + myUnit;
}
}
}
}
html+='';
return html;
};
return sigleOption;
},convert : function (ev) {
if (this.tableAndMap) {
this.tableAndMap = false;
} else {
this.tableAndMap = true;
}
var indicatorName = this.mapOption.title.text;
var myChart = echarts.init(document.getElementById([indicatorName]),rmp_theme);
var grid = computerGrid(this.mapOption);
myChart.resize({
width : grid.chartWidth+"px",height : grid.chartHeight+"px"
});
myChart.setOption(this.mapOption);
ev.stopPropagation();
},exportExcel : function (ev) {
var listAndList = JSON.parse(JSON.stringify(this.indicator));
var rowTd = listAndList.rowKeys;
var excellData = [];
rowTd.splice(0,listAndList.indicatorName+'('+listAndList.indicatorUnit+')');
excellData.push(rowTd);
for (var i = 0; i < listAndList.indicatorData.length; i++) {
for(var j=0;j 10000) {
// 千分位 + 万
text = toThousands((value / 10000).toFixed(1)) + $.i18n.get('chart.wan');
}
}
if (value.formatter) {
text = value.formatter.replace("{value}",text);
}
return text;
}
//格式化tooltip
var tooltipFormatter = function (params,callback) {
console.log(params);
var color = params.color;
var html = '';
html+='';
var showValue = params.value;
if (typeof (showValue) == "undefined") {
showValue = "NoData";
} else {
// 图悬浮框 千分位+万 +单位
if (!isNaN(showValue)) {
if (showValue > 10000||showValue<-10000) {
showValue = toThousands((showValue / 10000).toFixed(1)) + $.i18n.get('chart.wan');
}else{
showValue=parseFloat(showValue)*100;
showValue = showValue.toFixed(1) + unitHandle();
}
}
}
html+='';
console.log(html);
return html;
}
// 数字格式处理 1,000,000
function toThousands(num) {
if (typeof (num) == 'undefined') {
num = ""
}
num = num + '',result = '';
if (num.indexOf('%') > -1) {
return num;
}
var s = "";
if (num.indexOf('.') > -1) {
s = num.substring(num.indexOf('.'),num.length);
num = num.substring(0,num.indexOf('.'));
}
var n = false;
if (num.indexOf('-') > -1) {
num = num.substring(1);
n = true;
}
while (num.length > 3) {
result = ',' + num.slice(-3) + result;
num = num.slice(0,num.length - 3);
}
if (num != undefined) {
result = num + result;
}
if (n) {
result = "-" + result;
}
if(s=='.0'){
return result;
}
return result + s;
}
// 千分位与单位处理
function cellsDeal(num,unit) {
if (typeof (num) == 'undefined') {
num = "";
}
if(num===''){
return num;
}
num = num + '',result = '';
if (unit=='%') {
num=parseFloat(num)*100;
num = num.toFixed(1) + '';
if(num.indexOf(".")!=-1){
return num.substring(0,num.indexOf(".")+2)+"%";
}else{
return num+"%";
}
}
var s = "";
if (num.indexOf('.') > -1) {
num=parseFloat(num).toFixed(1);
s = num.substring(num.indexOf('.'),num.length); //小数位
num = num.substring(0,num.indexOf('.')); //整数位
}
var n = false;
if (num.indexOf('-') > -1) {
num = num.substring(1);
n = true;
}
while (num.length > 3) {
result = ',num.length - 3);
}
if (num != undefined) {
result = num + result;
}
if (n) {
result = "-" + result;
}
if(unit.indexOf("/")!=-1){
s=s.substring(0,2);
}else{
s="";
}
return result + s;
}
/*动态计算echarts的grid属性 */
function computerGrid(options){
// 图宽度 默认
var chartWidth = 810;
// 图例占宽度比
var legendWidth = chartWidth * 0.8;
// 图高度默认
var chartHeight = 250;
// 图中grid离容器下边距高度默认
var bottomHeight = 25;
// 图中grid离容器上边距高度默认
var topHeight = 40;
// 根据x轴刻度数量 算宽度,如果超过默认 则使用计算值
if (options.xAxis[0].data.length * 30 - chartWidth > 0) {
chartWidth = options.xAxis[0].data.length * 30;
}
// x轴刻度 最长的长度值
var maxLength = 0;
var legendCount = 8;
if (options.xAxis[0].data.length > legendCount) {
options.xAxis[0].data.forEach(function(val) {
if (maxLength < val.length) {
maxLength = val.length;
if (/[^u0000-u00FF]/.test(val)) {
// 计算图中grid离容器下边距高度
bottomHeight = maxLength * 14;
} else {
// 计算图中grid离容器下边距高度
bottomHeight = maxLength * 13.5;
}
}
});
}
var tmpWidth = 0;
options.legend.data.forEach(function(val) {
if (/[^u0000-u00FF]/.test(val)) {
tmpWidth += val.length * 22 + 30;
} else {
tmpWidth += val.length * 11 + 30;
}
});
var rowNum = tmpWidth / legendWidth;
// 根据图例算 图中grid离容器上边距高度
if (rowNum > 1) {
topHeight += (rowNum - 1) * 23;
}
chartHeight += bottomHeight + topHeight;
options.legend['width'] = legendWidth;
options.grid.y2 = bottomHeight;
options.grid.y = topHeight;
if(chartWidth!='810'){
options.grid["x"]=40;
}
var columnAndRow = ['startProvince','startArea']; //始发省份和地区默认X轴旋转45度
if(options.xAxis[0].data[0].match('^(d+)+(d+)')!=null||columnAndRow.indexOf(column.code)!=-1||columnAndRow.indexOf(row.code)!=-1){
options.xAxis[0].axisLabel['rotate']=45;
}else{
options.xAxis[0].axisLabel['rotate']=0;
}
return {chartHeight:chartHeight,chartWidth:chartWidth};
}
上述代码实现了 echart图数据的格式化,和对数据的自适应。修改为上述方式之后发现性能提高了不止一个数量级。
以上这篇VUE2.0+Element-UI+Echarts封装的组件实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程之家。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|