JavaScript

超轻量级php框架startmvc

VUE2.0+Element-UI+Echarts封装的组件实例

更新时间:2020-06-30 08:18:01 作者:startmvc
本文用Vue2.0+elementUI的panel组件和table组件+echarts的柱状图和折线图实现对结果的展示,实现

本文用Vue2.0+elementUI的panel组件和table组件+echarts的柱状图和折线图实现对结果的展示,实现了表格和图之间的切换和图和表之间的转置。

-html


<div class="resultDiv">
 <div id="panels">
 <el-collapse>
 <el-collapse-item v-for="item in indicators">
 <template slot="title">
 <span class='resulticon'>
 {{item.indicatorName}} 
 <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="el-icon-upload2" :class="item.indicatorName" download="somedata.xls" @click="return exportExcel(item.indicatorName)" 
 data-command="show" title="保存为表"></a>
 <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="glyphicon glyphicon-repeat" aria-hidden="true" @click="convert" data-command="show" title="图表切换"></a>
 <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="glyphicon glyphicon-transfer" aria-hidden="true" @click="transpose" data-command="show" title="行列转置"></a>
 </span>
 </template>
 <template>
 <div v-show="tableAndMap==3?true:tableAndMap==1?true:false" :id="item.indicatorName"></div>
 </template>
 <template v-if="tableAndMap==3?true:tableAndMap==2?true:false">
 <el-table :data="item.tableData" max-height="300" stripe border fix style="width: 100%">
 <el-table-column v-for="(column,index) in item.columns" :prop="column" :fixed="index==0" :label="column" min-width="150"></el-table-column>
 </el-table>
 </template>
 </el-collapse-item>
 </el-collapse>
 </div> 
 </div>

js,panel组件的代码


var panelsVue = new Vue({
 el : "#panels",
 props : ["initData","indicators","mapOptions"],
 data : {
 rowOrColumn : false, //行列转换
 tableOrMap : true, //表和图切换
 tableAndMap : 3, //表和图同时显示
 mapInitOption : {
 title: {
 text: ''
 },
 tooltip : {
 trigger: 'axis'
 },
 toolbox: {
 show : true,
 feature : {
 mark : {show: true},
 dataView : {show: true, readOnly: false},
 magicType : {show: true, type: ['line', 'bar']},
 restore : {show: true},
 saveAsImage : {show: true}
 }
 },
 calculable : true,
 xAxis : [
 {
 type : 'category',
 boundaryGap : false
 }
 ],
 yAxis : [
 {
 type : 'value',
 axisLabel : {
 formatter: '{value}'
 }
 }
 ]
 } //echarts 初始化参数
 },
 methods:{
 table : function(ev){
 if(this.rowOrColumn){
 this.indicators=this.listToRowObject(this.initData);
 this.mapOptions= this.listToColumnMap(this.initData);
 this.rowOrColumn=false;
 }else{
 this.indicators=this.listToColumnObject(this.initData);
 this.mapOptions= this.listToRowMap(this.initData);
 this.rowOrColumn=true;
 }
 for(var i=0;i<this.mapOptions.length;i++){
 var indicatorName= this.mapOptions[i].title.text;
 var dom = document.getElementById([indicatorName])
 var heigth = $(dom).siblings('div').height()*1.5;
 var width = $(dom).siblings('div').width();
 $(dom).css({
 height:heigth,
 width:width
 });
 var myChart= echarts.init(document.getElementById([indicatorName]),'macarons');
 myChart.setOption(this.mapOptions[i]);
 }
 ev.stopPropagation();
 },
 listToRowObject :function (ListAndList){
 var indicatorNames=[];
 var tableDatas=[];
 var columns = [];
 var options = [];
 ListAndList = ListAndList.indicatorResult;
 for(var i=0;i<ListAndList.indicatorNames.length;i++){
 var objects=[];
 var column =[];
 var indicatorName = ListAndList.indicatorNames[i];
 for(var yIndex in ListAndList[indicatorName]){
 var obj = {};
 obj[indicatorName]=ListAndList.colKeys[yIndex];
 for(var xIndex in ListAndList[indicatorName][yIndex]){
 obj[ListAndList.rowKeys[xIndex]]=ListAndList[indicatorName][yIndex][xIndex];
 }
 objects.push(obj);
 }
 indicatorNames.push(indicatorName);
 column.push(indicatorName);
 column=column.concat(ListAndList.rowKeys);
 var indicator={};
 indicator[indicatorName]=objects;
 columns.push(column);
 tableDatas.push(indicator);
 }
 for(var j = 0; j<indicatorNames.length;j++){
 var indicatorObj = {};
 indicatorObj["tableData"]=tableDatas[j][indicatorNames[j]];
 indicatorObj["columns"] = columns[j];
 indicatorObj["indicatorName"] = indicatorNames[j];
 options.push(indicatorObj);
 }
 return options;
 },
 listToColumnObject :function (ListAndList) {
 var options = [];
 var columns = [];
 var indicatorNames = [];
 var indicatorMap = {};
 ListAndList = ListAndList.indicatorResult;
 for (var i = 0; i < ListAndList.indicatorNames.length; i++) {
 var column = [];
 var objs = [];
 var indicatorName = ListAndList.indicatorNames[i];
 indicatorNames.push(indicatorName);
 column.push(indicatorName);
 column = column.concat(ListAndList.colKeys);
 columns.push(column);
 var indicatorData = [];
 indicatorData.push(ListAndList.rowKeys);
 indicatorData = indicatorData.concat(ListAndList[indicatorName]);
 for (var k = 0; k < indicatorData[0].length; k++) {
 var aRow = {};
 for (var j = 0; j < indicatorData.length; j++) {
 aRow[column[j]] = indicatorData[j][k];
 }
 objs.push(aRow);
 }
 indicatorMap[indicatorName] = objs;
 }
 for (var j = 0; j < indicatorNames.length; j++) {
 var indicatorObj = {};
 indicatorObj["tableData"] = indicatorMap[indicatorNames[j]];
 indicatorObj["columns"] = columns[j];
 indicatorObj["indicatorName"] = indicatorNames[j];
 options.push(indicatorObj);
 }
 return options;
 },
 listToColumnMap: function(ListAndList){
 ListAndList = ListAndList.indicatorResult;
 var options=[];
 for(var j = 0;j<ListAndList.indicatorNames.length;j++){
 var sigleOption ={};
 sigleOption=JSON.parse(JSON.stringify(this.mapInitOption));//实现深复制
 sigleOption.xAxis[0]["data"]=ListAndList.rowKeys;
 var indicatorName = ListAndList.indicatorNames[j];
 sigleOption["title"]["text"]=indicatorName;
 var series =[];
 for(var k=0;k<ListAndList[indicatorName].length;k++){
 var sigleSerie={type:'line'};
 sigleSerie["name"] = ListAndList.colKeys[k];
 sigleSerie["data"] = ListAndList[indicatorName][k];
 series.push(sigleSerie);
 }
 sigleOption["series"]=series;
 options.push(sigleOption);
 };
 return options;
 },
 listToRowMap: function(ListAndList){
 ListAndList = ListAndList.indicatorResult;
 var options=[];
 for(var j = 0;j<ListAndList.indicatorNames.length;j++){
 var sigleOption ={};
 sigleOption=JSON.parse(JSON.stringify(this.mapInitOption));//实现深复制
 sigleOption.xAxis[0]["data"]=ListAndList.colKeys;
 var indicatorName = ListAndList.indicatorNames[j];
 sigleOption["title"]["text"]=indicatorName;
 var series =[];
 for(var k=0;k<ListAndList.rowKeys.length;k++){
 var sigleSerie={type:'line'};
 var x= [];
 for(var z = 0;z<ListAndList.colKeys.length;z++){
 x.push(ListAndList[indicatorName][z][k]);
 }
 sigleSerie["name"] = ListAndList.rowKeys[k];
 sigleSerie["data"] = x;
 series.push(sigleSerie);
 }
 sigleOption["series"]=series;
 options.push(sigleOption);
 };
 return options;
 },
 map : function(ev){
 if(this.tableAndMap==1){
 this.tableAndMap=2;
 }else if(this.tableAndMap==2){
 this.tableAndMap=3;
 }else{
 this.tableAndMap=1;
 }
 ev.stopPropagation();
 },
 exportExcel : function(indicatorName,my){
 debugger;
 console.log(indicatorName);
 var listAndList = JSON.parse(JSON.stringify(this.initData.indicatorResult));
 var rowTd = listAndList.rowKeys;
 var excellData=[];
 rowTd.splice(0,0,indicatorName);
 excellData.push(rowTd);
 for(var i = 0;i<listAndList[indicatorName].length;i++){
 var rowTr = listAndList[indicatorName][i];
 rowTr.splice(0,0,listAndList.colKeys[i]);
 excellData.push(rowTr);
 }
 return ExcellentExport.excelByData($("."+indicatorName)[0], excellData, 'Sheet', 'download' + new Date().getTime() + '.xls');
 }
 },
 watch : {
 initData : function(newValue){
 this.indicators=this.listToRowObject(newValue);
 }
 },
 mounted : function(){
 }
});
Vue.set(panelsVue,'initData',ListAndList);

在使用上述组件过程中,发现当转置和表格切换之后里面全部都有变化,虽然可以做到单个panel组件自己实现转置和切换,但是发现如果数据太多会导致页面卡死,为了性能优化所以后来考虑采用多vue对象的形式(虽然我的思路是如果改变数据之后,vue将重新渲染html,导致页面卡死,但是后来仔细查资料之后,发现vue当数据改变之后会复用原来相同的html。但是由于时间的原因,也没试。大家可以考虑一下)

采用多vue对象的形式之后的页面

html


<div class="resultDiv"></div>

js,panel组件


var panelsVueArr = [];
var responseData;
function createHtml(respData){
 var indicatorResult = respData.indicatorResult; 
 var indicators = [];
 for(var j=0;j<indicatorResult.indicatorNames.length;j++){
 var indicator = {};
 indicator["indicatorName"]=indicatorResult.indicatorNames[j];
 indicator["indicatorUnit"]=indicatorResult.indicatorUnits[j];
 indicator["rowKeys"]=indicatorResult.rowKeys;
 indicator["colKeys"]=indicatorResult.colKeys;
 indicator["indicatorData"]=indicatorResult[indicatorResult.indicatorNames[j]];
 indicators.push(indicator);
 }
 for(var i =0;i<indicators.length;i++){
 var el = $("<div></div>");
 $(".resultDiv").append(el[0]); 
 var vueObj = new Vue({
 el : el[0],
 template : '<div id="panels"><el-collapse><el-collapse-item>'+
 '<template slot="title"><span class="resulticon">{{item.indicatorName}}({{item.indicatorUnit}}) <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="el-icon-upload2" :class="item.indicatorName" download="somedata.xls" @click="exportExcel" data-command="show" title="保存为表"></a>'+
 '<a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="glyphicon glyphicon-repeat" aria-hidden="true" @click="convert" data-command="show" title="图表切换"></a><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="glyphicon glyphicon-transfer" aria-hidden="true" @click="transpose" data-command="show" title="行列转置"></a>'+
 '</span></template><template><div v-show="!tableAndMap" :id="item.indicatorName"></div></template><template v-if="tableAndMap"><el-table :data="item.tableData" max-height="300" stripe border fix fit style="width: 100%">'+
 '<el-table-column v-for="(column,index) in item.columns" :prop="column" :fixed="index==0" :label="column" :min-width="column.length<8?118:column.length>16?250:column.length*15"></el-table-column></el-table></template></el-collapse-item></el-collapse></div>',
 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
 },
 calculable : 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 = '<span style="display:inline-block;margin-right:5px;"'+
 '>行:'+params.seriesName +'</span><br>';
 html+='<span style="display:inline-block;margin-right:5px;'+
 '">列:'+params.name +'</span><br>';
 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+='<span style="display:inline-block;margin-right:5px;'+
 '">值:'+showValue +'</span>';
 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',
 barMaxWidth : 40,
 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,ticket,callback) {
 var myUnit =unitHandle;
 var color = params.color;
 var html = '<span style="display:inline-block;margin-right:5px;"'
 + '">行:'+params.seriesName +'</span><br>';
 html+='<span style="display:inline-block;margin-right:5px;"'
 + '">列:'+params.name +'</span><br>';
 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+='<span style="display:inline-block;margin-right:5px;"'
 + '">值:'+showValue +'</span>';
 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, 0, listAndList.indicatorName+'('+listAndList.indicatorUnit+')');
 excellData.push(rowTd);
 for (var i = 0; i < listAndList.indicatorData.length; i++) {
 for(var j=0;j<listAndList.indicatorData[i].length;j++){
 listAndList.indicatorData[i][j]=cellsDeal(listAndList.indicatorData[i][j],listAndList.indicatorUnit);
 }
 var rowTr = listAndList.indicatorData[i];
 rowTr.splice(0, 0, listAndList.colKeys[i]);
 excellData.push(rowTr);
 }
 ExcellentExport.excelByData($("." + listAndList.indicatorName)[0], excellData, 'Sheet', 'download' + new Date().getTime() + '.xls');
 return ev.stopPropagation();
 }
 },
 watch : {
 indicator : function (newValue) {
 }
 },
 mounted : function () {
 // this.item= this.listToRowObject(this.indicator);
 },
 beforeMount : function(){
 this.item= this.listToRowObject(this.indicator);
 this.mapOption = this.listToRowMap(this.indicator);
 }
 })
 panelsVueArr.push(vueObj);
 } 
}
//格式化Y轴数字显示
var yAxisFormatter = function(value, index) {
 var text = value;
 if (!isNaN(value)) {
 if (value > 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,ticket,callback) {
 console.log(params);
 var color = params.color;
 var html = '<span style="display:inline-block;margin-right:5px;' + 'border-radius:10px;width:9px;height:9px;background-color:'
 + color + '">行:'+params.seriesName +'</span>';
 html+='<span style="display:inline-block;margin-right:5px;' + 'border-radius:10px;width:9px;height:9px;background-color:'
 + color + '">列:'+params.name +'</span>';
 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+='<span style="display:inline-block;margin-right:5px;' + 'border-radius:10px;width:9px;height:9px;background-color:'
 + color + '">值:'+showValue +'</span>';
 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.slice(-3) + result;
 num = num.slice(0, 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封装的组件实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

vue封装组件