• 通过循环生成多个echarts图表并实现自适应


    不推荐使用grid布局,不清楚为什么左边一列的不会自适应,换成flex布局就可以了

    主要方法借助中的getInstanceByDom方法

    完整代码:

    1. <template>
    2. <div class="statis">
    3. <div class="content" >
    4. <!-- v-for 遍历父级div-->
    5. <div class="main" v-for="(item,index) in echartsData" :key="index">
    6. <!--自定义宽高的dom,用于放置图表-->
    7. <div class="bar"></div>
    8. <img class="title-bg" src="@/assets/img/title-bg.png"/>
    9. </div>
    10. </div>
    11. </div>
    12. </template>
    13. <script>
    14. import elementResizeDetectorMaker from "element-resize-detector";
    15. export default {
    16. name: "test",
    17. data() {
    18. return {
    19. observer: null,
    20. titleIcon:require('@/assets/img/title-bg.png'),
    21. echartsData: [
    22. {
    23. title:'标题1换个环境官方',
    24. data: [
    25. { value: 20, name: '数据1' },
    26. { value: 300, name: '数据2' },
    27. { value: 300, name: '数据3' }
    28. ],
    29. },
    30. {
    31. title:'环境官方',
    32. data: [
    33. { value: 20, name: '数据1' },
    34. { value: 300, name: '数据2' }
    35. ],
    36. },
    37. {
    38. title:'官方',
    39. data: [
    40. { value: 20, name: '数据1'},
    41. { value: 300, name: '数据2'}
    42. ],
    43. },
    44. {
    45. title:'标题1换个环境官方',
    46. data: [
    47. { value: 20, name: '数据1'},
    48. { value: 300, name: '公共 部分' }
    49. ],
    50. }
    51. ],
    52. color: ['#5B8FF9', '#ca2df5', '#42CE92', '#f96950', '#047ff5'],//颜色列表
    53. }
    54. },
    55. methods: {
    56. // 方法:绘制柱状图
    57. drawBar() {
    58. var myEchart = document.getElementsByClassName('bar'); //获取类名
    59. //此处for循环多次初始化 echarts 实例
    60. for (var i = 0; i < myEchart.length; i++) {
    61. var myChart = this.$echarts.init(myEchart[i]) //初始化echarts实例要在for循环内
    62. if(myChart){
    63. let option = {
    64. title: {
    65. text: this.echartsData[i].title,
    66. left: 40,
    67. top:'20',
    68. textStyle: {
    69. color:'#383838',
    70. fontSize: 16,
    71. }
    72. },
    73. tooltip: {
    74. trigger: 'item'
    75. },
    76. legend: {
    77. top: '50',
    78. left: 'center'
    79. },
    80. series: [
    81. {
    82. type: 'pie',
    83. radius: ['40%', '55%'],
    84. center: ['50%', '60%'], // 调整饼图位置
    85. data: this.echartsData[i].data,
    86. itemStyle:{
    87. normal:{
    88. label:{
    89. show: true,
    90. formatter: '{b} : {c} ({d}%)'
    91. },
    92. labelLine :{show:true},
    93. color: function (colors) {
    94. var colorList = [
    95. '#73DEB3',
    96. '#578EF8',
    97. '#9A60B4',
    98. '#ef6567',
    99. '#f9c956',
    100. '#3BA272'
    101. ];
    102. return colorList[colors.dataIndex];
    103. }
    104. }
    105. }
    106. }]
    107. }
    108. //使用刚指定的配置项和数据显示图表
    109. myChart.setOption(option)
    110. // window.addEventListener("resize", () => {
    111. // myChart.resize();
    112. // })
    113. }
    114. // const echartAll = document.getElementsByClassName('bar')
    115. // window.onresize = function() {
    116. // for (let i = 0; i < echartAll.length; i++) {
    117. // var myChart = this.$echarts.init(echartAll[i])
    118. // myChart.resize()
    119. // }
    120. // }
    121. }
    122. },
    123. // 处理多个图形的自适应
    124. getEchartObj() {
    125. var myEchart = document.getElementsByClassName('bar'); //获取类名
    126. for (var i = 0; i < myEchart.length; i++){
    127. console.log('myEchart[i]',myEchart[i]);
    128. let _ref= myEchart[i];//遍历生成的折线图的Dom
    129. let myEchars = _ref?this.$echarts.getInstanceByDom(_ref):undefined;
    130. if(myEchars!== undefined){
    131. myEchars.resize();
    132. }
    133. }
    134. },
    135. },
    136. mounted() {
    137. //调用绘制柱状图的方法
    138. this.$nextTick(()=>{
    139. this.drawBar()
    140. })
    141. this.$nextTick(()=>{
    142. window.onresize = ()=>{
    143. this.getEchartObj()
    144. }
    145. })
    146. }
    147. }
    148. </script>
    149. <style scoped>
    150. .content {
    151. display: flex;
    152. /* grid-template-columns: 1fr 1fr 1fr; */
    153. gap: 20px;
    154. flex-wrap: wrap;
    155. }
    156. .main {
    157. width:calc((100% - 46px)/3);
    158. border: 1px solid #D0D0D0;
    159. height: 360px;
    160. background-color: #FFFFFF;
    161. position: relative;
    162. }
    163. .title-bg{
    164. position:absolute;
    165. top:23px;
    166. left:20px;
    167. }
    168. .main .bar {
    169. width: 100%;
    170. height: 100%;
    171. }
    172. </style>

  • 相关阅读:
    一文读懂Casper区块链上的NFT
    跨模态神经搜索实践VCED CLIP简介
    什么是AIoT?
    java基础-集合
    算法通关村第十九关——最小路径和
    代码随想录训练营day49, 买卖股票的最佳时机I/II
    SpringBoot前后端分离开发拆分和部署
    2023年中国BaaS行业发展概况及未来发展趋势分析:未来多链支持和发展将是BaaS平台发展重点方向[图]
    doker中的Jenkins容器配置github
    6 种创新的人工智能在牙科领域的应用
  • 原文地址:https://blog.csdn.net/weixin_45776308/article/details/133888383