pie.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <template>
  2. <div id="down-pie">
  3. <div :id="gid"></div>
  4. </div>
  5. </template>
  6. <script>
  7. import { mapState, createNamespacedHelpers } from 'vuex';
  8. import { Pie } from '@antv/g2plot';
  9. export default {
  10. name: 'downPie',
  11. props: {
  12. data: { type: Array, default: () => [] },
  13. axis: { type: Object, default: () => {} }, //{x:x轴字段名; xAlias:x轴名称; y:y轴字段名; yAlias:y轴名称}
  14. gid: { type: String, default: `${new Date().getTime()}` },
  15. headTitle: { type: String, default: '' },
  16. },
  17. components: {},
  18. data: () => {
  19. return {
  20. chart: null,
  21. list: undefined,
  22. };
  23. },
  24. mounted() {
  25. this.init();
  26. },
  27. methods: {
  28. async init() {
  29. let e = document.getElementById(this.gid);
  30. if (!e) {
  31. console.warn('没有找到指定渲染容器');
  32. return;
  33. }
  34. if (!this.list) {
  35. //未获得数据
  36. return;
  37. }
  38. if (this.chart) {
  39. this.chart.updateConfig({ data: this.list });
  40. } else {
  41. let { x, y, xAlias, yAlias } = this.axis;
  42. let meta = {};
  43. meta[x] = { alias: xAlias };
  44. meta[y] = { alias: yAlias };
  45. this.chart = new Pie(this.gid, {
  46. title: { visible: true, text: this.headTitle },
  47. pixelRatio: 4,
  48. data: this.list,
  49. colorField: x,
  50. angleField: y,
  51. meta: meta,
  52. point: {
  53. visible: true,
  54. },
  55. label: {
  56. visible: true,
  57. type: 'spider',
  58. formatter: (text, item) => `${item._origin[x]}: ${item._origin[y]}`,
  59. },
  60. //stackField + legend 一起使用,前者确定以哪个字段作为选项,后者是显示与否,位置
  61. stackField: x,
  62. legend: {
  63. visible: true,
  64. position: 'right-top',
  65. },
  66. events: {
  67. // onPieClick: e => this.gclick(e),
  68. },
  69. });
  70. }
  71. this.chart.render();
  72. },
  73. },
  74. watch: {
  75. data: {
  76. handler(val) {
  77. if (val.length > 0) this.$set(this, `list`, val);
  78. },
  79. immediate: true,
  80. deep: true,
  81. },
  82. list: {
  83. handler(val) {
  84. if (val) this.$nextTick(() => this.init());
  85. },
  86. },
  87. },
  88. computed: {
  89. ...mapState(['user']),
  90. pageTitle() {
  91. return `${this.$route.meta.title}`;
  92. },
  93. },
  94. metaInfo() {
  95. return { title: this.$route.meta.title };
  96. },
  97. };
  98. </script>
  99. <style lang="less" scoped>
  100. .rightData {
  101. padding: 0 30px;
  102. height: 391px;
  103. overflow: hidden;
  104. }
  105. /deep/.el-table td {
  106. padding: 8px 0;
  107. }
  108. /deep/.el-table th {
  109. padding: 8px 0;
  110. }
  111. </style>