123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- <template>
- <div :style="{ padding: '0 0 32px 32px' }">
- <v-chart :forceFit="true" :height="300" :data="chartData" :scale="scale">
- <v-coord type="polar" :startAngle="-202.5" :endAngle="22.5" :radius="0.75"></v-coord>
- <v-axis
- dataKey="value"
- :zIndex="2"
- :line="null"
- :label="axisLabel"
- :subTickCount="4"
- :subTickLine="axisSubTickLine"
- :tickLine="axisTickLine"
- :grid="null"
- ></v-axis>
- <v-axis dataKey="1" :show="false"></v-axis>
- <v-series
- gemo="point"
- position="value*1"
- shape="pointer"
- color="#1890FF"
- :active="false"
- ></v-series>
- <v-guide
- type="arc"
- :zIndex="0"
- :top="false"
- :start="arcGuide1Start"
- :end="arcGuide1End"
- :vStyle="arcGuide1Style"
- ></v-guide>
- <v-guide
- type="arc"
- :zIndex="1"
- :start="arcGuide2Start"
- :end="getArcGuide2End"
- :vStyle="arcGuide2Style"
- ></v-guide>
- <v-guide
- type="html"
- :position="htmlGuidePosition"
- :html="getHtmlGuideHtml()"
- ></v-guide>
- </v-chart>
- </div>
- </template>
- <script>
- import { registerShape } from 'viser-vue';
- registerShape('point', 'pointer', {
- draw(cfg, container) {
- let point = cfg.points[0];
- point = this.parsePoint(point);
- const center = this.parsePoint({
- x: 0,
- y: 0,
- });
- container.addShape('line', {
- attrs: {
- x1: center.x,
- y1: center.y,
- x2: point.x,
- y2: point.y + 15,
- stroke: cfg.color,
- lineWidth: 5,
- lineCap: 'round',
- }
- });
- return container.addShape('circle', {
- attrs: {
- x: center.x,
- y: center.y,
- r: 9.75,
- stroke: cfg.color,
- lineWidth: 4.5,
- fill: '#fff',
- }
- });
- }
- });
- const scale = [{
- dataKey: 'value',
- min: 0,
- max: 9,
- tickInterval: 1,
- nice: false,
- }];
- const data = [
- { value: 7.0 },
- ];
- export default {
- name:"DashChartDemo",
- props:{
- datasource:{
- type: Number,
- default:7
- },
- title: {
- type: String,
- default: ''
- }
- },
- created(){
- if(!this.datasource){
- this.chartData = data;
- }else{
- this.chartData = [
- { value: this.datasource },
- ];
- }
- this.getChartData()
- },
- watch: {
- 'datasource': function (val) {
- this.chartData = [
- { value: val},
- ];
- this.getChartData();
- }
- },
- methods:{
- getChartData(){
- if(this.chartData && this.chartData.length>0){
- this.abcd = this.chartData[0].value * 10
- }else{
- this.abcd = 70
- }
- },
- getHtmlGuideHtml(){
- return '<div style="width: 300px;text-align: center;">\n' +
- '<p style="font-size: 14px;color: #545454;margin: 0;">'+this.title+'</p>\n' +
- '<p style="font-size: 36px;color: #545454;margin: 0;">'+this.abcd+'%</p>\n' +
- '</div>'
- },
- getArcGuide2End(){
- return [this.chartData[0].value, 0.945]
- }
- },
- data() {
- return {
- chartData:[],
- height: 400,
- scale: scale,
- abcd:70,
- axisLabel: {
- offset: -16,
- textStyle: {
- fontSize: 18,
- textAlign: 'center',
- textBaseline: 'middle'
- }
- },
- axisSubTickLine: {
- length: -8,
- stroke: '#fff',
- strokeOpacity: 1,
- },
- axisTickLine: {
- length: -17,
- stroke: '#fff',
- strokeOpacity: 1,
- },
- arcGuide1Start: [0, 0.945],
- arcGuide1End: [9, 0.945],
- arcGuide1Style: {
- stroke: '#CBCBCB',
- lineWidth: 18,
- },
- arcGuide2Start: [0, 0.945],
- arcGuide2Style: {
- stroke: '#1890FF',
- lineWidth: 18,
- },
- htmlGuidePosition: ['50%', '100%'],
- htmlGuideHtml: `
- <div style="width: 300px;text-align: center;">
- <p style="font-size: 14px;color: #545454;margin: 0;">${this.title}</p>
- <p style="font-size: 36px;color: #545454;margin: 0;">${this.abcd}%</p>
- </div>
- `,
- };
- },
- };
- </script>
|