当前位置:   article > 正文

前端vue echart自定义图表(柱形图 折线图 饼图 树形结构图 关系图谱 )_vue 图表 自定义工具

vue 图表 自定义工具

  欢迎加入我们的前端组件学习交流群,可添加群主微信,审核通过后入群。

前端组件化开发:使用ECharts快速实现自定义图表

摘要:
随着前端开发技术的发展,组件化开发已成为提高开发效率和降低维护成本的有效手段。本文将介绍如何使用ECharts库进行前端组件化开发,快速实现自定义的图表,包括柱形图、折线图、饼图、树形结构图和关系图谱等。通过结合业务特性的模块拆分策略、模块间的交互方式和构建系统等,可以实现灵活的组件组合和扩展,提高开发效率和降低维护成本。

一、引言

在前端开发中,图表的展示对于数据的可视化具有重要意义。传统的开发方式将图表与整个应用绑定在一起,导致修改或增加新图表变得非常困难。组件化开发可以将图表解耦为独立的组件,单独进行开发和维护,使得开发效率和维护成本得到显著提升。ECharts是一种流行的图表库,提供了丰富的图表类型和交互功能,适用于各种业务场景。

二、技术背景和市场需求

随着Web应用程序的复杂度不断提高,对于前端开发的需求也越来越高。组件化开发是一种有效的手段,可以将复杂的应用拆分为一系列可重复使用的组件,单独进行开发和维护。ECharts是一种广泛使用的图表库,提供了丰富的图表类型和交互功能,适用于各种业务场景。通过使用ECharts进行组件化开发,可以快速实现自定义的图表,满足市场需求。

效果图如下:

c5057cae495379d5308a0e6dff20f665.png

三、技术实现

  1. 设计思路

使用ECharts进行组件化开发的设计思路是将图表解耦为独立的组件,使得各个组件可以单独进行开发和维护。在具体实现中,可以根据业务需求对图表进行模块拆分,例如将柱形图拆分为数据获取、图表配置和界面设计等模块。

  1. 关键技术

使用ECharts进行组件化开发的关键技术包括:

(1)模块拆分:根据业务需求对图表进行模块拆分,包括数据获取、图表配置和界面设计等模块。
(2)组件封装:将各个模块封装为独立的组件,单独进行开发和维护。
(3)交互设计:根据业务需求设计图表之间的交互方式,例如点击柱形图的某个数据点时弹出详细信息等。
(4)构建系统:使用构建系统将各个组件组合在一起,生成最终的图表。

  1. 代码实现

以下是一个使用ECharts实现柱形图的示例代码:

HTML代码部分
复制代码
  1. <template>
  2. <view class="content">
  3. <!-- 可视化 -->
  4. <view style="background-color: white; border-radius: 4px; margin-top: -4px;">
  5. <!-- 柱形图 堆叠 -->
  6. <h4 style="margin-left: 12px; font-size: 16px; height: 30px; line-height: 30px;"> 柱形图 堆叠
  7. </h4>
  8. <div class="mui-content-padded">
  9. <div id="dsj_zscq" style="width: calc(100vw - 40px); height: 280px;"></div>
  10. </div>
  11. <!-- 折线图 -->
  12. <h4 style="margin-left: 12px; font-size: 16px; height: 30px; line-height: 30px;"> 折线图
  13. </h4>
  14. <div class="mui-content-padded">
  15. <div id="dsj_cxcg" style="width: calc(100vw - 40px); margin: -18px 0px; height: 280px;">
  16. </div>
  17. </div>
  18. <!-- 柱状图 + 折线图-->
  19. <h4 style="margin-left: 12px; font-size: 16px; height: 30px; line-height: 30px; margin-top: 0px;">
  20. 柱状图 + 折线图 </h4>
  21. <div class="mui-content-padded">
  22. <div id="dsj_zlhjl" style="width: calc(100vw - 40px); height: 290px;"></div>
  23. </div>
  24. <!-- 有效知识产权结构 -->
  25. <h4 style="margin-left: 12px; font-size: 16px; height: 30px; line-height: 30px; margin-top: 0px;">
  26. 饼图 </h4>
  27. <div class="mui-content-padded">
  28. <div id="dsj_zscqjg" style="width: calc(100vw - 40px); height: 306px;"></div>
  29. </div>
  30. <!-- 专利iPC结构 -->
  31. <h4 style="margin-left: 12px; font-size: 16px; height: 30px; line-height: 30px; margin-top: 0px;">
  32. 树形结构图 </h4>
  33. <div class="mui-content-padded">
  34. <div id="dsj_zlipc_content"
  35. style="margin-left: -10px; width: calc(100vw - 40px); height: auto; margin-bottom: 30px;">
  36. </div>
  37. </div>
  38. <!-- 柱状图 -->
  39. <h4 style="margin-left: 12px; font-size: 16px; height: 30px; line-height: 30px; margin-top: 0px;">
  40. 柱状图 </h4>
  41. <div class="mui-content-padded">
  42. <div id="dsj_zljz" style="width: calc(100vw - 40px); height: 280px;"></div>
  43. </div>
  44. <!-- 专利法律状态分布 -->
  45. <h4 style="margin-left: 12px; font-size: 16px; height: 30px; line-height: 30px; margin-top: 0px;">
  46. 饼图 </h4>
  47. <div class="mui-content-padded">
  48. <div id="dsj_zlfl" style="width: calc(100vw - 40px); height: 280px;"></div>
  49. </div>
  50. <!-- 专利寿命分布 -->
  51. <h4 style="margin-left: 12px; font-size: 16px; height: 30px; line-height: 30px; margin-top: 0px;">
  52. 柱状图 </h4>
  53. <div class="mui-content-padded">
  54. <div id="dsj_zlsm" style="width: calc(100vw - 40px); height: 280px;"></div>
  55. </div>
  56. <!-- 树形结构图 -->
  57. <h4 style="margin-left: 12px; font-size: 16px; height: 30px; line-height: 30px; margin-top: 0px;">
  58. 树形结构图 </h4>
  59. <div class="mui-content-padded">
  60. <div id="dsj_zllhsq" style="width: calc(100vw - 40px); height: auto; margin-bottom: 30px;">
  61. </div>
  62. </div>
  63. </view>
  64. </view>
  65. </template>
JS代码 (引入组件 填充数据)
复制代码
  1. <script>
  2. import myIndex from '../index/index.js'
  3. export default {
  4. data() {
  5. return {
  6. title: 'Hello'
  7. }
  8. },
  9. mounted() {
  10. this.refreshEchartData();
  11. },
  12. methods: {
  13. refreshEchartData() {
  14. // 返回数据需在json转换格式工具 转成Json格式
  15. let result = {
  16. "data": {
  17. "unionCompanyNum": 4,
  18. "goldList": [{
  19. "isNewRecord": true,
  20. "comId": "1",
  21. "socialCode": "123456",
  22. "fmsqYx": "1",
  23. "cfmwyxzscqsl": "1",
  24. "years": "1",
  25. "yxzscqsl": "1",
  26. "dnzlhjl": "1"
  27. }],
  28. "patentLifeList": [{
  29. "isNewRecord": true,
  30. "comId": "1",
  31. "socialCode": "123456",
  32. "percentage": "1",
  33. "quantity": "1",
  34. "scope": "1-3",
  35. "totalNum": "1"
  36. }, {
  37. "isNewRecord": true,
  38. "comId": "1",
  39. "socialCode": "123456",
  40. "percentage": "1",
  41. "quantity": "1",
  42. "scope": "3-5",
  43. "totalNum": "2"
  44. }, {
  45. "isNewRecord": true,
  46. "comId": "1",
  47. "socialCode": "123456",
  48. "percentage": "1",
  49. "quantity": "3",
  50. "scope": "5-10",
  51. "totalNum": "3"
  52. }, {
  53. "isNewRecord": true,
  54. "comId": "1",
  55. "socialCode": "123456",
  56. "percentage": "1",
  57. "quantity": "3",
  58. "scope": "10-",
  59. "totalNum": "4"
  60. }],
  61. "patentValueList": [{
  62. "isNewRecord": true,
  63. "comId": "1",
  64. "socialCode": "123456",
  65. "fmgbZs": "1",
  66. "fmsqYx": "1",
  67. "syxxYx": "1",
  68. "wgsjYx": "1",
  69. "scope": "0-5",
  70. "totalNum": "1",
  71. "percentageHighRights": "1",
  72. "percentageHigh": "1",
  73. "dspw": "1",
  74. "jslypw": "1"
  75. }, {
  76. "isNewRecord": true,
  77. "comId": "1",
  78. "socialCode": "123456",
  79. "fmgbZs": "1",
  80. "fmsqYx": "1",
  81. "syxxYx": "1",
  82. "wgsjYx": "1",
  83. "scope": "5-10",
  84. "totalNum": "1",
  85. "percentageHighRights": "1",
  86. "percentageHigh": "1",
  87. "dspw": "1",
  88. "jslypw": "1"
  89. }, {
  90. "isNewRecord": true,
  91. "comId": "1",
  92. "socialCode": "123456",
  93. "fmgbZs": "1",
  94. "fmsqYx": "2",
  95. "syxxYx": "3",
  96. "wgsjYx": "4",
  97. "scope": "90-100",
  98. "totalNum": "10"
  99. }],
  100. "legalList": [{
  101. "isNewRecord": true,
  102. "comId": "1",
  103. "socialCode": "123456",
  104. "underTrial": "1",
  105. "invalid": "1",
  106. "efficient": "1",
  107. "totalNum": "1",
  108. "percentage": "1"
  109. }],
  110. "propertyRightList": [{
  111. "isNewRecord": true,
  112. "comId": "1",
  113. "socialCode": "123456",
  114. "fmgbZs": "1",
  115. "fmgbZsP": "1",
  116. "fmsqYx": "1",
  117. "fmsqYxP": "1",
  118. "syxxYx": "1",
  119. "syxxYxP": "1",
  120. "wgsjYx": "1",
  121. "wgsjYxP": "1",
  122. "rzYx": "1",
  123. "rzYxP": "1",
  124. "maxPercentage": "1",
  125. "maxPercentageRights": "1",
  126. "dspw": "1",
  127. "jslypw": "1"
  128. }],
  129. "unionPatentNum": 13,
  130. "ipcList": [{
  131. "isNewRecord": true,
  132. "comId": "1",
  133. "socialCode": "123456",
  134. "ipcDept": "1",
  135. "ipcClass": "1",
  136. "ipcNum": "1",
  137. "ipcZbClass": "1",
  138. "ipcZb": "1",
  139. "dspw": "1",
  140. "jslypw": "1"
  141. }],
  142. "yearList": [{
  143. "isNewRecord": true,
  144. "comId": "1",
  145. "fmgbZs": "1",
  146. "fmsqYx": "1",
  147. "syxxYx": "1",
  148. "wgsjYx": "1",
  149. "rzYx": "1",
  150. "years": "2022",
  151. "dnkjcxcgkbjshl": "1",
  152. "socialCode": "123456"
  153. }, {
  154. "isNewRecord": true,
  155. "comId": "1",
  156. "years": "2023",
  157. "dnkjcxcgkbjshl": "2",
  158. "socialCode": "123456"
  159. }, {
  160. "isNewRecord": true,
  161. "comId": "1",
  162. "years": "2026",
  163. "dnkjcxcgkbjshl": "6",
  164. "socialCode": "123456"
  165. }, {
  166. "isNewRecord": true,
  167. "comId": "1",
  168. "years": "2027",
  169. "dnkjcxcgkbjshl": "7",
  170. "socialCode": "123456"
  171. }],
  172. "unionList": [{
  173. "isNewRecord": true,
  174. "comId": "1",
  175. "socialCode": "123456",
  176. "unionName": "测试5",
  177. "unionNum": "5",
  178. "unionCompany": "1"
  179. }, {
  180. "isNewRecord": true,
  181. "comId": "1",
  182. "socialCode": "123456",
  183. "unionName": "测试4",
  184. "unionNum": "4",
  185. "unionCompany": "1"
  186. }, {
  187. "isNewRecord": true,
  188. "comId": "1",
  189. "socialCode": "123456",
  190. "unionName": "测试3",
  191. "unionNum": "3",
  192. "unionCompany": "1"
  193. }, {
  194. "isNewRecord": true,
  195. "comId": "1",
  196. "socialCode": "123456",
  197. "unionName": "测试1",
  198. "unionNum": "1",
  199. "unionCompany": "1"
  200. }]
  201. },
  202. "statusCode": 200,
  203. "header": {
  204. "date": "Tue, 30 May 2023 07:08:28 GMT",
  205. "powered-by": "JeeSite V5.0.1 0",
  206. "transfer-encoding": "chunked",
  207. "content-type": "application/json"
  208. },
  209. "errMsg": "request:ok"
  210. };
  211. let resultData = result.data;
  212. if (resultData.yearList != undefined && resultData.yearList.length > 0) {
  213. console.log('执行图表1');
  214. // 填充图表1 2
  215. myIndex.fillChartOneTwo(resultData.yearList);
  216. }
  217. if (resultData.goldList != undefined && resultData.goldList.length > 0) {
  218. // 填充图表3
  219. myIndex.fillChartThree(resultData.goldList);
  220. }
  221. if (resultData.propertyRightList != undefined && resultData.propertyRightList.length > 0) {
  222. // 填充图表4
  223. myIndex.fillChartFour(resultData.propertyRightList);
  224. }
  225. if (resultData.ipcList != undefined && resultData.ipcList.length > 0) {
  226. // 填充图表5
  227. myIndex.fillChartFive(resultData.ipcList);
  228. }
  229. if (resultData.patentValueList != undefined && resultData.patentValueList.length > 0) {
  230. // 填充图表6
  231. myIndex.fillChartSix(resultData.patentValueList);
  232. }
  233. if (resultData.legalList != undefined && resultData.legalList.length > 0) {
  234. // 填充图表7 法律
  235. myIndex.fillChartSeven(resultData.legalList);
  236. }
  237. if (resultData.patentLifeList != undefined && resultData.patentLifeList.length > 0) {
  238. // 填充图表8 寿命
  239. myIndex.fillChartEight(resultData.patentLifeList);
  240. }
  241. if (resultData.unionList != undefined && resultData.unionList.length > 0) {
  242. // 填充图表9 专利联合
  243. myIndex.fillChartNine(resultData, "广汽集团");
  244. }
  245. }
  246. }
  247. }
  248. </script>
CSS
复制代码
  1. <style>
  2. .content {
  3. display: flex;
  4. flex-direction: column;
  5. align-items: center;
  6. justify-content: center;
  7. }
  8. .mui-content-padded {
  9. margin: 10px 8px;
  10. }
  11. .mui-content-padded div {
  12. font-size: 13px;
  13. }
  14. </style>
四、性能优化与应用场景

通过组件化开发,可以将图表解耦为独立的组件,单独进行开发和维护。这使得在性能优化和应用场景方面具有以下优势:

  1. 性能优化:通过将图表解耦为独立的组件,可以针对各个组件进行优化,例如优化数据获取速度、调整图表渲染效果等。这样可以提高整个应用程序的性能。
  2. 应用场景:通过将图表封装为独立的组件,可以方便地将不同图表集成到各种业务场景中,例如Web应用程序、移动应用程序等。这有助于提高应用程序的可扩展性和灵活性。

五、结论

使用ECharts进行前端组件化开发可以快速实现自定义的图表,提高开发效率和降低维护成本。通过将图表解耦为独立的组件,单独进行开发和维护,可以满足各种业务需求。未来,随着前端开发技术的不断发展,组件化开发将在更多的领域得到应用和发展。

阅读全文下载完整组件代码请关注微信公众号: 前端组件开发

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/427675
推荐阅读
相关标签
  

闽ICP备14008679号