341 lines
6.9 KiB
Vue
Raw Normal View History

2022-06-08 15:48:09 +08:00
<template>
<canvas v-if="canvasId" :id="canvasId" :canvasId="canvasId" :style="{'width':cWidth*pixelRatio+'px','height':cHeight*pixelRatio+'px', 'transform': 'scale('+(1/pixelRatio)+')','margin-left':-cWidth*(pixelRatio-1)/2+'px','margin-top':-cHeight*(pixelRatio-1)/2+'px'}"
@touchstart="touchStart" @touchmove="touchMove" @touchend="touchEnd" @error="error">
</canvas>
</template>
<script>
import uCharts from './u-charts.js';
var canvases = {};
export default {
props: {
chartType: {
required: true,
type: String,
default: 'column'
},
opts: {
required: true,
type: Object,
default () {
return null;
},
},
canvasId: {
type: String,
default: 'u-canvas',
},
cWidth: {
default: 375,
},
cHeight: {
default: 250,
},
pixelRatio: {
type: Number,
default: 1,
},
legends: {
type: Boolean,
default: true
}
},
data() {
return {
colors: [
"#5181F6",
"#00DBB6",
"#F67F51",
"#FF515A",
"#8B5CFF",
"#00CA69"
]
}
},
watch: {
opts: {
handler(newVal, oldVal) {
this.init();
// console.log('canvases')
// console.log(canvases)
// if(canvases=={}){
// this.init();
// }else{
// this.changeData(this.canvasId,newVal)
// }
},
deep: true,
immediate: true,
}
},
mounted() {
// this.init();
},
methods: {
init() {
console.log('图表初始化')
switch (this.chartType) {
case 'column':
this.initColumnChart();
break;
case 'line':
this.initLineChart();
break;
case 'arcbar': //半圆
this.initArcbarChart();
break;
case 'ring': //圆环
this.initRingChart();
break;
default:
break;
}
},
initColumnChart() {
var xData = this.opts.categories
for (var i = 0; i < xData.length; i++) {
if(xData[i].length>5){
xData[i]=xData[i].substring(0,5)+'...'
}
}
canvases[this.canvasId] = new uCharts({
$this: this,
canvasId: this.canvasId,
type: 'column',
legend: {
show: false
},
colors: this.colors,
fontSize: 11,
background: '#FFFFFF',
pixelRatio: this.pixelRatio,
animation: true,
categories: xData,
series: this.opts.series,
enableScroll: true,
xAxis: {
disableGrid: true,
itemCount: 6,
labelCount:this.opts.categories.length,
rotateLabel: true
},
yAxis: {
format: (val) => {
if ((val + "").indexOf(".") != -1) {
return val.toFixed(0); //保留小数后1位
} else {
return val;
}
},
// data:{
// }
// axisLine:false
//disabled:true
},
dataLabel: true,
width: this.cWidth * this.pixelRatio,
height: this.cHeight * this.pixelRatio,
extra: {
column: {
type: 'group',
width: 14
}
},
scales:{
xAxis: [{
stacked: true,
ticks: {
fontColor: 'red' // X轴样式
}
}],
}
});
},
initLineChart() {
canvases[this.canvasId] = new uCharts({
$this: this,
canvasId: this.canvasId,
type: 'line',
fontSize: 11,
legend: {
show: this.legends
},
dataLabel: false,
dataPointShape: true,
colors: this.colors,
background: '#FFFFFF',
pixelRatio: this.pixelRatio,
categories: this.opts.categories,
series: this.opts.series,
animation: true,
enableScroll: true,
xAxis: {
type: 'grid',
axisLine: false,
gridColor: '#fff',
gridType: 'dash',
dashLength: 8,
itemCount: 4,
scrollShow: true
},
yAxis: {
axisLine: false,
// gridType: 'dash',
gridColor: 'rgba(42, 43, 91, 0.1)',
// dashLength: 8,
// splitNumber: 5,
min:0,
// max: 180,
// format: (val) => {
// return val.toFixed(0) + '元'
// }
},
width: this.cWidth * this.pixelRatio,
height: this.cHeight * this.pixelRatio,
extra: {
line: {
type: 'curve'
}
}
});
},
//半圆
initArcbarChart() {
let winWidth = 0;
uni.getSystemInfo({
success: function(res) {
winWidth = res.windowWidth / 2 - 10;
}
});
canvases[this.canvasId] = new uCharts({
$this: this,
canvasId: this.canvasId,
type: 'arcbar',
fontSize: 11,
legend: {
show: false
},
background: '#FFFFFF',
pixelRatio: 1,
series: this.opts.series,
animation: true,
width: this.cWidth,
height: this.cHeight,
dataLabel: true,
subtitle: {
name: this.opts.series[0].name,
color: '#000',
fontSize: 25,
offsetY: -12
},
extra: {
arcbar: {
type: 'default',
width: 12,
startAngle: 1,
endAngle: 0,
gap: 5,
radius: 90,
center: {
y: 100,
x: winWidth
}
}
}
});
},
//圆环
initRingChart() {
console.log('this.canvasId',this.canvasId)
var dataLabel=false,legend=false;
var radius = 0;
if(this.canvasId=='integritySafety'){
dataLabel=legend=true
}
if(this.canvasId=='qualityPieChart'){
radius = 30
}
canvases[this.canvasId] = new uCharts({
$this: this,
canvasId: this.canvasId,
type: 'ring',
fontSize: 11,
title: this.opts.title,
legend: {show:legend},
extra: {
pie: {
ringWidth:12,
offsetAngle:-90,
activeRadius:radius,
},
tooltip:{
showBox:false,
}
},
width: this.cWidth,
height: this.cHeight,
background: '#FFFFFF',
series: this.opts.series,
dataLabel: dataLabel,
});
},
// 这里仅作为示例传入两个参数cid为canvas-id,newdata为更新的数据需要更多参数请自行修改
changeData(cid, newdata) {
console.log('updateData',newdata)
console.log(canvases[cid])
var xData = newdata.categories
for (var i = 0; i < xData.length; i++) {
if(xData[i].length>5){
xData[i]=xData[i].substring(0,5)+'...'
}
}
canvases[cid].updateData({
series: newdata.series,
categories: xData,
title: newdata.title
});
},
touchStart(e) {
canvases[this.canvasId].showToolTip(e, {
format: function(item, category) {
return category + ' ' + item.name + ':' + item.data
}
});
canvases[this.canvasId].scrollStart(e);
},
touchMove(e) {
canvases[this.canvasId].scroll(e);
},
touchEnd(e) {
canvases[this.canvasId].scrollEnd(e);
},
error(e) {
console.log(e)
}
},
};
</script>
<style scoped>
.charts {
width: 100%;
height: 100%;
flex: 1;
background-color: #FFFFFF;
}
</style>