column.vue 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <template>
  2. <div id="column">
  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 { Column } from '@antv/g2plot';
  10. import { mapState, createNamespacedHelpers } from 'vuex';
  11. export default {
  12. name: 'column',
  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 Column(this.gid, {
  37. pixelRatio: 4,
  38. data: this.list,
  39. xField: x,
  40. yField: y,
  41. meta: meta,
  42. point: {
  43. visible: true,
  44. },
  45. label: {
  46. visible: true,
  47. },
  48. //stackField + legend 一起使用,前者确定以哪个字段作为选项,后者是显示与否,位置
  49. stackField: x,
  50. legend: {
  51. visible: true,
  52. position: 'right-top',
  53. },
  54. events: {
  55. onColumnClick: e => this.gclick(e),
  56. },
  57. });
  58. this.chart.render();
  59. this.prepaid();
  60. },
  61. gclick(data) {
  62. console.log('in function:gclick');
  63. console.log(data);
  64. },
  65. prepaid() {
  66. let doc = document.getElementById(this.gid);
  67. let cav = doc.getElementsByTagName('canvas');
  68. if (cav.length <= 0) {
  69. console.warn('没有找到图表');
  70. return;
  71. }
  72. this.$set(this, `canvas`, cav[0]);
  73. },
  74. },
  75. watch: {
  76. data: {
  77. immediate: true,
  78. deep: true,
  79. handler(val) {
  80. if (val) this.$set(this, `list`, val);
  81. },
  82. },
  83. },
  84. computed: {
  85. ...mapState(['user']),
  86. pageTitle() {
  87. return `${this.$route.meta.title}`;
  88. },
  89. },
  90. metaInfo() {
  91. return { title: this.$route.meta.title };
  92. },
  93. };
  94. </script>
  95. <style lang="less" scoped></style>