• vue2+echarts:使用后台传输的json数据去动态渲染echarts图表


    1.源码

    1.说明

    • 只提供子组件代码,totalData 是从父组件传输过来的数据,其数据格式如下:

      父组件的代码就不提供了

    2.代码

    main.js 引入echarts

    import * as echarts from 'echarts'// 在import的后面,echarts的前面加一个 * as
    Vue.prototype.$echarts = echarts
    
    • 1
    • 2

    vue子组件代码:

    • html

      <div id="totalCharts" style="width: 100%;height:300px;">div>
      
      • 1

      <div id="timesCharts" style="width: 100%;height:300px;">123div>
      
      • 1

      <div id="totalDataCharts" style="width: 100%;height:400px;" />
      
      • 1

    • js代码

      <script>
      	export default {
      	  name: 'totalPie',
      	  props: ['totalData'],
      	  data () {
      	    return {
      	      totalPayOption: {
      	        title: {
      	          text: '总支付金额数据[单位:元]',
      	          left: 'center',
      	        },
      	        tooltip: {
      	          trigger: 'item',
      	          formatter: '{a} 
      {b}: {c} ({d}%)'
      , }, legend: { orient: 'vertical', left: 10, data: ['总支付金额', '总退款金额', '总实收金额'], }, series: [ { name: '总支付金额', type: 'pie', radius: [0, '40%'], label: { show: true, position: 'inner', }, labelLine: { show: false, }, data: [], emphasis: { itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)', }, }, }, { name: '总支付金额', type: 'pie', radius: ['55%', '70%'], label: { show: false, position: 'inner', }, labelLine: { show: false, }, data: [], } ], }, totalTimesOption: { title: { text: '总支付笔数数据', left: 'center', }, tooltip: { trigger: 'item', formatter: '{a}
      {b}: {c} ({d}%)'
      , }, legend: { orient: 'vertical', left: 10, data: ['总支付笔数', '总退款笔数'], }, series: [ { name: '支付笔数', type: 'pie', radius: '70%', label: { position: 'inner', }, labelLine: { show: false, }, data: [], emphasis: { itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)', }, }, } ], }, totalOption: { tooltip: { trigger: 'axis', axisPointer: { type: 'cross', crossStyle: { color: '#999', }, }, }, title: { text: '每天支付数据汇总统计', }, legend: { bottom: 10, data: ['支付总额', '退款总额', '实收金额', '支付笔数', '退款笔数'], }, toolbox: { show: true, orient: 'vertical', left: 'right', top: 'center', feature: { dataView: { show: true, readOnly: false, }, magicType: { show: true, type: ['line', 'bar'], }, restore: { show: true, }, saveAsImage: { show: true, }, }, }, xAxis: [ { type: 'category', data: [], axisPointer: { type: 'shadow', }, } ], yAxis: [ { type: 'value', name: '金额/元', axisLabel: { formatter: '{value} 元', }, }, { type: 'value', minInterval: 1, axisLabel: { formatter: '{value} 笔', }, } ], series: [ { emphasis: { itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)', }, }, } ], }, } }, /* 监听数据变化,实时渲染图表 */ watch: { /* totalData (newValue, oldValue) { this.setTotalCharts(newValue) }, */ totalData: { handler (newValue, oldValue) { this.setTotalCharts(newValue) }, immediate: true, }, }, mounted () { this.showTotalPayCharts() this.showTotalTimesCharts() this.showTotalCharts() }, methods: { showTotalPayCharts () { // 基于准备好的dom,初始化echarts实例 const payCharts = this.$echarts.init(document.getElementById('totalCharts'))// 也可以通过$refs.newCharts的方式去获取到dom实例。 payCharts.setOption(this.totalPayOption,true) }, showTotalTimesCharts () { const timesChart = this.$echarts.init(document.getElementById('timesCharts')) timesChart.setOption(this.totalTimesOption,true) }, showTotalCharts () { const totalDataCharts = this.$echarts.init(document.querySelector('#totalDataCharts')) totalDataCharts.setOption(this.totalOption,true) }, /* 注意:echarts不会自动帮你渲染数据的,需要手动再次调用setOption函数 所以每次都要重新init(),然后再次调用setOption() */ setTotalCharts (totalData) { /* 饼图数组 */ const innerPayData = [] const outterPayData = [] const timesData = [] /* 柱状图数据 */ const series = [] const x = [] if (totalData.totals.length > 0) { // region 给饼图和柱状图的option赋值 /* 总支付金额数据饼图 */ /* 将饼图数据赋值给数组 */ for (let i = 0; i < this.totalPayOption.legend.data.length; i++) { const pieInnerData = {} const pieOutterData = {} if (this.totalPayOption.legend.data[i] === '总支付金额') { pieInnerData.value = this.totalData.totalPay pieInnerData.name = '总支付金额' } if (this.totalPayOption.legend.data[i] === '总退款金额') { pieOutterData.value = this.totalData.totalRefund pieOutterData.name = '总退款金额' } if (this.totalPayOption.legend.data[i] === '总实收金额') { pieOutterData.value = this.totalData.totalReal pieOutterData.name = '总实收金额' } innerPayData.push(pieInnerData) outterPayData.push(pieOutterData) } /* 将饼图数据数组中的值赋值给饼图的data */ this.totalPayOption.series[0].data = innerPayData this.totalPayOption.series[1].data = outterPayData /* 总支付笔数数据饼图 */ /* 将饼图数据赋值给数组 */ for (let i = 0; i < this.totalTimesOption.legend.data.length; i++) { const pieData = {} if (this.totalTimesOption.legend.data[i] === '总支付笔数') { pieData.value = this.totalData.totalTime pieData.name = '总支付笔数' } if (this.totalTimesOption.legend.data[i] === '总退款笔数') { pieData.value = this.totalData.totalRefundTime pieData.name = '总退款笔数' } timesData.push(pieData) } this.totalTimesOption.series[0].data = timesData /* 给柱状图赋值 */ for (let i = 0; i < totalData.totals.length; i++) { x.push(totalData.totals[i].day.substring(totalData.totals[i].day.length - 11, totalData.totals[i].day.length - 9)) } /* 将数组暂存于数组中 */ for (let i = 0; i < this.totalOption.legend.data.length; i++) { const serie = {} if (this.totalOption.legend.data[i] === '支付笔数' || this.totalOption.legend.data[i] === '退款笔数') { serie.name = this.totalOption.legend.data[i] serie.type = 'line' serie.yAxisIndex = 1 } else { serie.name = this.totalOption.legend.data[i] serie.type = 'bar' } const data = [] for (let j = 0; j < totalData.totals.length; j++) { if (this.totalOption.legend.data[i] === '支付笔数') { data.push(totalData.totals[j].payTime) } else if (this.totalOption.legend.data[i] === '支付总额') { data.push(totalData.totals[j].totalMoney) } else if (this.totalOption.legend.data[i] === '退款总额') { data.push(totalData.totals[j].refundMoney) } else if (this.totalOption.legend.data[i] === '实收金额') { data.push(totalData.totals[j].totalReal) } else if (this.totalOption.legend.data[i] === '退款笔数') { data.push(totalData.totals[j].refundTimes) } } serie.data = data series.push(serie) } this.totalOption.title.text = `${totalData.totals[0].day.substr(0, 4)}${totalData.totals[0].day.substr(5, 2)}月每天支付数据汇总统计` this.totalOption.series = series this.totalOption.xAxis[0].data = x // endregion // region 数据渲染 this.showTotalPayCharts() this.showTotalTimesCharts() this.showTotalCharts() // endregion } else { // region 数据置空 /* 传输的数据为空的时候一定要置空,以清除内存中的数据 */ this.totalPayOption.series[0].data = [...[]] this.totalPayOption.series[1].data = [...[]] this.totalTimesOption.series[0].data = [...[]] if (this.totalOption.series.length > 0) { for (let i = 0; i < this.totalOption.series.length; i++) { this.totalOption.series[i].data = [] } this.totalOption.xAxis[0].data = [] /* 渲染一遍柱状图数据 */ } this.showTotalPayCharts() this.showTotalTimesCharts() this.showTotalCharts() // endregion } }, }, }
      script>
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
      • 64
      • 65
      • 66
      • 67
      • 68
      • 69
      • 70
      • 71
      • 72
      • 73
      • 74
      • 75
      • 76
      • 77
      • 78
      • 79
      • 80
      • 81
      • 82
      • 83
      • 84
      • 85
      • 86
      • 87
      • 88
      • 89
      • 90
      • 91
      • 92
      • 93
      • 94
      • 95
      • 96
      • 97
      • 98
      • 99
      • 100
      • 101
      • 102
      • 103
      • 104
      • 105
      • 106
      • 107
      • 108
      • 109
      • 110
      • 111
      • 112
      • 113
      • 114
      • 115
      • 116
      • 117
      • 118
      • 119
      • 120
      • 121
      • 122
      • 123
      • 124
      • 125
      • 126
      • 127
      • 128
      • 129
      • 130
      • 131
      • 132
      • 133
      • 134
      • 135
      • 136
      • 137
      • 138
      • 139
      • 140
      • 141
      • 142
      • 143
      • 144
      • 145
      • 146
      • 147
      • 148
      • 149
      • 150
      • 151
      • 152
      • 153
      • 154
      • 155
      • 156
      • 157
      • 158
      • 159
      • 160
      • 161
      • 162
      • 163
      • 164
      • 165
      • 166
      • 167
      • 168
      • 169
      • 170
      • 171
      • 172
      • 173
      • 174
      • 175
      • 176
      • 177
      • 178
      • 179
      • 180
      • 181
      • 182
      • 183
      • 184
      • 185
      • 186
      • 187
      • 188
      • 189
      • 190
      • 191
      • 192
      • 193
      • 194
      • 195
      • 196
      • 197
      • 198
      • 199
      • 200
      • 201
      • 202
      • 203
      • 204
      • 205
      • 206
      • 207
      • 208
      • 209
      • 210
      • 211
      • 212
      • 213
      • 214
      • 215
      • 216
      • 217
      • 218
      • 219
      • 220
      • 221
      • 222
      • 223
      • 224
      • 225
      • 226
      • 227
      • 228
      • 229
      • 230
      • 231
      • 232
      • 233
      • 234
      • 235
      • 236
      • 237
      • 238
      • 239
      • 240
      • 241
      • 242
      • 243
      • 244
      • 245
      • 246
      • 247
      • 248
      • 249
      • 250
      • 251
      • 252
      • 253
      • 254
      • 255
      • 256
      • 257
      • 258
      • 259
      • 260
      • 261
      • 262
      • 263
      • 264
      • 265
      • 266
      • 267
      • 268
      • 269
      • 270
      • 271
      • 272
      • 273
      • 274
      • 275
      • 276
      • 277
      • 278
      • 279
      • 280
      • 281
      • 282
      • 283
      • 284
      • 285
      • 286
      • 287
      • 288
      • 289
      • 290
      • 291
      • 292
      • 293
      • 294
      • 295
      • 296
      • 297
      • 298
      • 299
      • 300
      • 301
      • 302
      • 303
      • 304
      • 305
      • 306
      • 307
      • 308
      • 309
      • 310
      • 311
      • 312
      • 313
      • 314
      • 315
      • 316

    2.注意

    • payCharts.setOption(this.totalPayOption, true) 这个里面的totalPayOption 才是你要改变的数据
    • 最终的呈现效果要看option里面的数据
    • 实列的作用是让你的dom元素有呈现echarts图像的能力。setoption是让echart具体长什么样子(饼图,环形图,地图等)

    3.补充

    1.数据置空

    注意: 当接收到的json对象为空的时候,可能会出现之前的数据残留,使得图表依然有数据的情况,所以,当接收到的json对象为空的时候,一定要将图表的数据置空,然后再次 setOption 渲染一遍!!!

    代码如下:

    else {
            /* 传输的数据为空的时候一定要置空,以清除内存中的数据 */
            this.totalPayOption.series[0].data = [...[]]
            this.totalPayOption.series[1].data = [...[]]
            this.totalTimesOption.series[0].data = [...[]]
            
            if (this.totalOption.series.length > 0) {
              for (let i = 0; i < this.totalOption.series.length; i++) {
                this.totalOption.series[i].data = []
              }
              this.totalOption.xAxis[0].data = []
            }
            this.showTotalPayCharts()
    	    this.showTotalTimesCharts()
    	    this.showTotalCharts()
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.数据渲染位置

    建议在一个组件中的所有echarts图表的数据都设置好了之后,再去调用setOption()进行数据渲染,防止出现有些图表渲染不了的情况

  • 相关阅读:
    BusyBox源码分析
    【Vue】eventbus 首次$on事件未绑定问题
    Angular知识点系列(5)-每天10个小知识
    一言成文大模型:大模型实践之路
    kafka分布式安装部署
    如何保护 LDAP 目录服务中的用户安全?
    Go 如何实现多态
    镜像底层原理详解和基于Docker file创建镜像
    rust_for_linux驱动完整版记录
    系统性认知网络安全
  • 原文地址:https://blog.csdn.net/m0_54355172/article/details/126957187