当前位置:   article > 正文

uniapp app使用echart(renderjs, 仅支持 app-vue、h5 端)并封装成组件使用_uniapp vue3 renderjs

uniapp vue3 renderjs

仅支持 app-vue、h5 端

1.先根据文档renderjs说明,并且查看示例:https://ext.dcloud.net.cn/plugin?id=1207,下载renderjs-echarts-demo压缩包

2.将renderjs-echarts-demo\static的echarts拷贝放到项目目录static中,只能放到static目录中,不然会报错echarts.init is not a function,这个回答在示例地址底部作者有回答

3.复制renderjs-echarts-demo\pages\index的index.vue代码到你自己的页面,保存即可以显示图标,经测试在h5,模拟器,手机都可以查看图标

实现效果:

ps里面有一个坑,在app上formatter自定义函数不生效问题。解决方案:在setOption之前加上formatter方法,下面有具体写法

  1. <template>
  2. <view class="content">
  3. <view :prop="option" :change:prop="echarts.updateEcharts" id="echarts" class="echarts"></view>
  4. </view>
  5. </template>
  6. <script>
  7. export default {
  8. data() {
  9. return {
  10. option: {
  11. color: ['#78b4d1', '#fcd664', '#78a999'],
  12. tooltip: { //提示组件
  13. trigger: 'axis',
  14. axisPointer: {
  15. type: 'shadow'
  16. }
  17. },
  18. legend: {
  19. data: [{
  20. name: '水',
  21. textStyle: {
  22. color: '#999999'
  23. }
  24. },{
  25. name: '电',
  26. textStyle: {
  27. color: '#999999'
  28. }
  29. },{
  30. name: '冷量',
  31. textStyle: {
  32. color: '#999999'
  33. }
  34. }],
  35. icon: 'circle', //图例icon园
  36. top: '10%',
  37. align: 'right', //图例icon位置
  38. itemWidth: '10' //图例icon大小
  39. },
  40. grid: {
  41. left: '5%',
  42. right: '10%',
  43. bottom: '5%',
  44. containLabel: true //防止标签溢出
  45. },
  46. xAxis: {
  47. type: 'value',
  48. position: 'top', //横坐标位于顶部
  49. interval: 50, //横坐标间距50
  50. splitLine: {
  51. lineStyle: {
  52. color: '#eeeeee',
  53. type: 'dashed' //轴线虚线
  54. }
  55. },
  56. axisLine: { //坐标轴轴线隐藏
  57. show: false
  58. },
  59. axisTick: { //坐标轴刻度隐藏
  60. show: false,
  61. },
  62. axisLabel: { //坐标轴刻度文字
  63. color: '#999999'
  64. }
  65. },
  66. yAxis: {
  67. type: 'category',
  68. data: [{
  69. value: 'B栋',
  70. textStyle: {
  71. fontSize: 14
  72. }
  73. },{
  74. value: 'A栋',
  75. textStyle: {
  76. fontSize: 14
  77. }
  78. }],
  79. axisLine: { //坐标轴轴线隐藏
  80. show: false
  81. },
  82. splitLine: { //坐标分割线隐藏
  83. show: false
  84. },
  85. axisTick: { //坐标轴刻度隐藏
  86. show: false
  87. }
  88. },
  89. series: [
  90. {
  91. name: '水',
  92. type: 'bar',
  93. data: [110, 90],
  94. barGap: '150%', //类目 柱间距
  95. barCategoryGap: '40%', //类目 y轴值间距
  96. label: {
  97. show: true, //显示柱值
  98. position: 'right', //位置显示在右边
  99. color: '#000',
  100. },
  101. },
  102. {
  103. name: '电',
  104. type: 'bar',
  105. data: [140, 100],
  106. barGap: '150%',
  107. barCategoryGap: '40%',
  108. label: {
  109. show: true,
  110. position: 'right',
  111. color: '#000'
  112. }
  113. },{
  114. name: '冷量',
  115. type: 'bar',
  116. data: [130, 70],
  117. barGap: '150%',
  118. barCategoryGap: '40%',
  119. label: {
  120. show: true,
  121. position: 'right',
  122. color: '#000',
  123. // formatter: () => { 不这么做的原因是app上不生效,在setOption之前加上formatter方法
  124. // }
  125. }
  126. }
  127. ]
  128. }
  129. }
  130. },
  131. methods: {
  132. }
  133. }
  134. </script>
  135. <script module="echarts" lang="renderjs">
  136. let myChart
  137. export default {
  138. mounted() {
  139. if (typeof window.echarts === 'function') {
  140. this.initEcharts()
  141. } else {
  142. // 动态引入较大类库避免影响页面展示
  143. const script = document.createElement('script')
  144. // view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
  145. script.src = 'static/echarts.js'
  146. script.onload = this.initEcharts.bind(this)
  147. document.head.appendChild(script)
  148. }
  149. },
  150. methods: {
  151. initEcharts() {
  152. myChart = echarts.init(document.getElementById('echarts'))
  153. // 这么做解决app上formatter自定义函数不生效问题。
  154. this.option.series[0].label.formatter = function formatter(data) {
  155. return data.value + 'm³'
  156. }
  157. this.option.series[1].label.formatter = function formatter(data) {
  158. return data.value + 'kwh'
  159. }
  160. this.option.series[2].label.formatter = function formatter(data) {
  161. return data.value + 'kwh'
  162. }
  163. // 观测更新的数据在 view 层可以直接访问到
  164. myChart.setOption(this.option)
  165. },
  166. updateEcharts(newValue, oldValue, ownerInstance, instance) {
  167. // 监听 service 层数据变更
  168. myChart.setOption(newValue)
  169. }
  170. }
  171. }
  172. </script>
  173. <style>
  174. .content {
  175. width: 100%;
  176. height: 100%;
  177. display: flex;
  178. flex-direction: column;
  179. align-items: center;
  180. justify-content: center;
  181. }
  182. .echarts {
  183. /* margin-top: 100px; */
  184. width: 100%;
  185. height: 100%;
  186. }
  187. </style>

封装组件

实现效果:一个组件,可以实现不同的图表功能

实现思路:

1.在同个页面使用多个图表,需要id名不一致

2.option配置项需改成配置项

实现过程:

1.父级传id名传给组件或者组件里生成随机数加上前缀

2.父级传option配置项传给组件

实现中出现问题:uniapp中的renderjs在app中是于逻辑层分开,无法获取逻辑层中的data或者props,所以无法给renderjs中的id无法改成配置项

解决过程思路:1.从逻辑层传入renderjs 2.既然逻辑层传入renderjs在app中无效,h5有效,那可不可以在renderjs定义变量传给逻辑层,在动态改变

解决过程分析:(主要为解决renderjs的id改成配置项的问题)

1.从逻辑层传入根据uniapp提供的dome,需要触发点击,即:change:prop,再通过ownerInstance.callMethod来调用method中的方法,但问题是,这个组件根本不用点击呀,如何在mouted中调用renderjs中的方法?翻看社区,百度,博客等,社区有给一个 this.$ownerInstance.callMethod,经测试,这个再h5有效,app无效,无法调用renderjs中的方法(不信你们可以自己试试),那咋办,社区等都找了个遍,无提供答案,那试试第二种了

2.在renderjs中定义一个随机数,然后通过this.$ownerInstance.callMethod传给逻辑层,然后动态改变,结果,h5跟app都空白。。。(有人试了可以的话,留言跟我说下,谢谢)

再出现一个解决思路:为什么renderjs中有一个this.option,为什么这个可以?

尝试:跟renderjs的this.option定义一样,那试试看定义一个跟他一模一样的会不会可以?

结果:没用,不管怎么定义,renderjs获取不到

再出现一个解决思路:那我把从新定义一个变量,在变量里面修改,再给:prop,会不会可以?

结果:可以。。。原因不明(有人知道的话,可以跟我说下,谢谢)

过程用到网址:https://ask.dcloud.net.cn/question/97817            https://ask.dcloud.net.cn/question/92340         有兴趣的可以研究下

效果

组件

  1. <template>
  2. <view class="content">
  3. <view :prop="echartInfo" :change:prop="echarts.updateEcharts" :id="echartInfo.id" :class="echartInfo.id" style="width: 100%;height: 100%"></view>
  4. </view>
  5. </template>
  6. <script>
  7. export default {
  8. props: {
  9. echartInfo: {
  10. type: Object,
  11. default: () => {}
  12. }
  13. }
  14. }
  15. </script>
  16. <script module="echarts" lang="renderjs">
  17. let myChart
  18. export default {
  19. mounted() {
  20. if (typeof window.echarts === 'function') {
  21. this.initEcharts()
  22. } else {
  23. // 动态引入较大类库避免影响页面展示
  24. const script = document.createElement('script')
  25. // view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
  26. script.src = 'static/echarts.js'
  27. script.onload = this.initEcharts.bind(this)
  28. document.head.appendChild(script)
  29. }
  30. },
  31. methods: {
  32. initEcharts() {
  33. let option = this.echartInfo.option
  34. let id = this.echartInfo.id
  35. myChart = echarts.init(document.getElementById(id))
  36. // 观测更新的数据在 view 层可以直接访问到
  37. myChart.setOption(option)
  38. },
  39. updateEcharts(newValue, oldValue, ownerInstance, instance) {
  40. // 监听 service 层数据变更
  41. myChart.setOption(newValue)
  42. }
  43. }
  44. }
  45. </script>
  46. <style>
  47. .content {
  48. width: 100%;
  49. height: 100%;
  50. display: flex;
  51. flex-direction: column;
  52. align-items: center;
  53. justify-content: center;
  54. }
  55. </style>

页面

  1. <template>
  2. <div class="minitor-container">
  3. <div class="minitor">
  4. <echart :echartInfo="echartInfo"></echart>
  5. <echart :echartInfo="echartInfo2"></echart>
  6. </div>
  7. </div>
  8. </template>
  9. <script>
  10. import echart from '@/components/echart'
  11. export default {
  12. components: {
  13. echart
  14. },
  15. data() {
  16. return {
  17. echartInfo: {
  18. id: 'echart1',
  19. option: {
  20. color: ['#78b4d1', '#fcd664', '#78a999'],
  21. tooltip: { //提示组件
  22. trigger: 'axis',
  23. axisPointer: {
  24. type: 'shadow'
  25. }
  26. },
  27. legend: {
  28. data: [{
  29. name: '水',
  30. textStyle: {
  31. color: '#999999'
  32. }
  33. },{
  34. name: '电',
  35. textStyle: {
  36. color: '#999999'
  37. }
  38. },{
  39. name: '冷量',
  40. textStyle: {
  41. color: '#999999'
  42. }
  43. }],
  44. icon: 'circle', //图例icon园
  45. top: '10%',
  46. align: 'right', //图例icon位置
  47. itemWidth: '10' //图例icon大小
  48. },
  49. grid: {
  50. left: '5%',
  51. right: '10%',
  52. bottom: '5%',
  53. containLabel: true //防止标签溢出
  54. },
  55. xAxis: {
  56. type: 'value',
  57. position: 'top', //横坐标位于顶部
  58. interval: 50, //横坐标间距50
  59. splitLine: {
  60. lineStyle: {
  61. color: '#eeeeee',
  62. type: 'dashed' //轴线虚线
  63. }
  64. },
  65. axisLine: { //坐标轴轴线隐藏
  66. show: false
  67. },
  68. axisTick: { //坐标轴刻度隐藏
  69. show: false,
  70. },
  71. axisLabel: { //坐标轴刻度文字
  72. color: '#999999'
  73. }
  74. },
  75. yAxis: {
  76. type: 'category',
  77. data: [{
  78. value: 'A栋',
  79. textStyle: {
  80. fontSize: 14
  81. }
  82. },{
  83. value: 'B栋',
  84. textStyle: {
  85. fontSize: 14
  86. }
  87. }],
  88. axisLine: { //坐标轴轴线隐藏
  89. show: false
  90. },
  91. splitLine: { //坐标分割线隐藏
  92. show: false
  93. },
  94. axisTick: { //坐标轴刻度隐藏
  95. show: false
  96. },
  97. inverse: true
  98. },
  99. series: [
  100. {
  101. name: '水',
  102. type: 'bar',
  103. data: [110, 90],
  104. barGap: '150%', //类目 柱间距
  105. barCategoryGap: '40%', //类目 y轴值间距
  106. label: {
  107. show: true, //显示柱值
  108. position: 'right', //位置显示在右边
  109. color: '#000',
  110. formatter:"{c}m³"
  111. }
  112. },
  113. {
  114. name: '电',
  115. type: 'bar',
  116. data: [140, 100],
  117. barGap: '150%',
  118. barCategoryGap: '40%',
  119. label: {
  120. show: true,
  121. position: 'right',
  122. color: '#000',
  123. formatter:"{c}m³"
  124. }
  125. },{
  126. name: '冷量',
  127. type: 'bar',
  128. data: [130, 70],
  129. barGap: '150%',
  130. barCategoryGap: '40%',
  131. label: {
  132. show: true,
  133. position: 'right',
  134. color: '#000',
  135. // unit: 'm³'
  136. formatter:"{c}m³"
  137. }
  138. }
  139. ]
  140. },
  141. },
  142. echartInfo2: {
  143. id: 'echart_2',
  144. option: {
  145. // color: ['#5eb0f1'],
  146. tooltip: {
  147. trigger: 'axis',
  148. axisPointer: {
  149. type: 'shadow'
  150. }
  151. },
  152. grid: {
  153. left: '5%',
  154. right: '10%',
  155. top: '10%',
  156. containLabel: true
  157. },
  158. xAxis: {
  159. type: 'value',
  160. axisLine: {
  161. show: false
  162. },
  163. axisLabel: {
  164. show: false
  165. },
  166. axisTick: {
  167. show: false
  168. },
  169. splitLine: {
  170. show: false
  171. }
  172. },
  173. yAxis: [{
  174. type: 'category',
  175. data: ['视频监控', '视频监控', '视频监控', '视频监控', '视频监控', '视频监控'],
  176. axisLine: {
  177. show: false
  178. },
  179. axisTick: {
  180. show: false
  181. },
  182. splitLine: {
  183. show: false
  184. },
  185. inverse:true
  186. },{
  187. type: 'category',
  188. data: ['100','80','50','80','50','80'],
  189. axisLine: {
  190. show: false
  191. },
  192. axisTick: {
  193. show: false
  194. },
  195. splitLine: {
  196. show: false
  197. },
  198. inverse:true
  199. }],
  200. series: [{
  201. type: 'bar',
  202. yAxisIndex: 0,
  203. data: ['100','80','50','80','50','80'],
  204. barWidth: 6,
  205. itemStyle: {
  206. normal: {
  207. color: '#5eb0f1',
  208. }
  209. },
  210. label:{
  211. show: false,
  212. // position:"right",
  213. // formatter:"{c}%"
  214. }
  215. }, {
  216. type: 'bar',
  217. silent: true,
  218. yAxisIndex: 1,
  219. barWidth: 6,
  220. itemStyle: {
  221. normal: {
  222. color: 'rgba(180, 180, 180, 0.2)',
  223. }
  224. },
  225. data: ['100', '100', '100', '100', '100', '100']
  226. }]
  227. }
  228. }
  229. }
  230. }
  231. }
  232. </script>
  233. <style lang="scss" scoped>
  234. .minitor-container{
  235. height: 100%;
  236. background-color: #fff;
  237. .minitor{
  238. height: 400rpx
  239. }
  240. }
  241. </style>

ps:因为uniapp上的demo的echart.js不是最新的,很多新的echart配置不能用,需要去下载最新的echart.js替换即可,地址:

https://echarts.apache.org/zh/changelog.html#v5-0-1

https://github.com/apache/echarts/tree/5.0.1/dist

 

第二种app使用echarts方法,那就是写html,用iframe嵌入,很明显小程序也是不支持的,h5和app都可以,不过多个图表得写多个html。。

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

闽ICP备14008679号