donut.vue 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <template>
  2. <div id="donut">
  3. <div :id="gid"></div>
  4. <download :gid="gid" :canvas="canvas"></download>
  5. </div>
  6. </template>
  7. <script>
  8. import download from '@frame/parts/statistics/to-download';
  9. import { Donut } from '@antv/g2plot';
  10. import { mapState, createNamespacedHelpers } from 'vuex';
  11. export default {
  12. name: 'donut',
  13. props: {
  14. data: { type: [Object, Array], default: () => [] },
  15. axis: { type: Object, default: () => {} },
  16. gid: { type: String, default: `${new Date().getTime()}` },
  17. },
  18. components: { download },
  19. data: function() {
  20. return {
  21. chart: null,
  22. list: [],
  23. canvas: undefined,
  24. };
  25. },
  26. created() {},
  27. mounted() {
  28. this.init();
  29. },
  30. methods: {
  31. async init() {
  32. let { x, y, xAlias, yAlias } = this.axis;
  33. let meta = {};
  34. meta[x] = { alias: xAlias };
  35. meta[y] = { alias: yAlias };
  36. this.chart = new Donut(this.gid, {
  37. pixelRatio: 4,
  38. data: this.list,
  39. colorField: x,
  40. angleField: y,
  41. // meta: meta,
  42. point: {
  43. visible: true,
  44. },
  45. label: {
  46. visible: true,
  47. type: 'spider',
  48. formatter: (text, item) => `${item._origin[x]}: ${item._origin[y]}`,
  49. },
  50. //stackField + legend 一起使用,前者确定以哪个字段作为选项,后者是显示与否,位置
  51. stackField: x,
  52. legend: {
  53. visible: true,
  54. position: 'right-top',
  55. },
  56. //环形中间部分设置
  57. statistic: {
  58. visible: true,
  59. },
  60. events: {
  61. onPieClick: e => this.gclick(e),
  62. },
  63. });
  64. this.chart.render();
  65. this.prepaid();
  66. },
  67. gclick(data) {
  68. console.log('in function:gclick');
  69. console.log(data);
  70. },
  71. prepaid() {
  72. let doc = document.getElementById(this.gid);
  73. let cav = doc.getElementsByTagName('canvas');
  74. if (cav.length <= 0) {
  75. console.warn('没有找到图表');
  76. return;
  77. }
  78. this.$set(this, `canvas`, cav[0]);
  79. },
  80. },
  81. computed: {
  82. ...mapState(['user']),
  83. pageTitle() {
  84. return `${this.$route.meta.title}`;
  85. },
  86. },
  87. watch: {
  88. data: {
  89. immediate: true,
  90. deep: true,
  91. handler(val) {
  92. if (val) this.$set(this, `list`, val);
  93. },
  94. },
  95. },
  96. metaInfo() {
  97. return { title: this.$route.meta.title };
  98. },
  99. };
  100. </script>
  101. <style lang="less" scoped></style>