ECharts實現拖拽

一、需求——如何在echarts中實現託拖拽的效果

二、解決方案

一、用Echarts的type爲graph類型畫圖,優勢:拖拽不用從新定點劃線,有自帶的連線關係,缺點:連線的樣式及特效不能很好呈現

1//注意this.viewData是從後臺獲取的數據
 mounted () {
2
      const that = this
3
      this.$nextTick(() => {
4
        let myChart = echarts.init(document.getElementById(this.scaleLine_id))
5
        var home = "image:///img/bussiness.png";  //業務
6
        var error_home = "image:///img/error-bussiness.png";  //故障業務
7
        var windows = "image:///img/windows.png";  //windows主機
8
        var error_windows = "image:///img/error-windows";  //故障windows
9
        var linux = "image:///img/linux.png";  //linux
10
        var error_linux = "image:///img/error-linux.png";  //故障linux
11
        var cluster0 = "image:///img/cluster_0.png";  //web服務器
12
        var error_cluster0 = "image:///img/error-cluster_0.png";  //故障web服務器
13
        var cluster1 = "image:///img/cluster_1.png";  //數據庫
14
        var error_cluster1 = "image:///img/error-cluster_1.png";  //故障數據庫
15
        var cluster2 = "image:///img/cluster_2.png";  //消息隊列
16
        var error_cluster2 = "image:///img/error-cluster_2.png";  //故障消息隊列
17
        var cluster3 = "image:///img/cluster_3.png";  //緩存
18
        var error_cluster3 = "image:///img/error-cluster_3.png";  //故障緩存
19
        var cluster4 = "image:///img/cluster_4.png";  //文件系統
20
        var error_cluster4 = "image:///img/error-cluster_4.png";  //故障文件系統
21
        let labelOne = {//文字1省級市級五區
22
          normal: {
23
            position: "bottom",
24
            distance:0, //離圖標多遠
25
            show: true,
26
            textStyle: {
27
              fontSize: 15,
28
              color:'#00eaff',
29
              fontFamily:'microsoftYaHei'
30
            },
31
          }
32
        };
33
        let lineColorOne = new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
34
          offset: 0,
35
          color: '#58B3CC'
36
        }, {
37
          offset: 1,
38
          color: '#F58158'
39
        }])
40
        let viewData = this.viewData
41
        let data = []
42
        var symbolSize = 20;
43
        // console.log(viewData)
44
        //處理數據格式
45
        for(let i = 0;i<viewData.element.length;i++){
46
          data.push(viewData.element[i].value)
47
          if(viewData.element[i].type === 20){
48
            if(viewData.element[i].status === 1){
49
              viewData.element[i].symbol =  home
50
              viewData.element[i].symbolSize = 40
51
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
52
              viewData.element[i].draggable = 'true'
53
              viewData.element[i].fixed = 'true'
54
              viewData.element[i].label = labelOne
55
            }else{
56
              viewData.element[i].symbol =  error_home
57
              viewData.element[i].symbolSize = 40
58
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
59
              viewData.element[i].draggable = 'true'
60
              viewData.element[i].fixed = 'true'
61
              viewData.element[i].label = labelOne
6263
            }
64
          }else if(viewData.element[i].type === 10){
65
            if(viewData.element[i].status === 1){
66
              viewData.element[i].symbol =  windows
67
              viewData.element[i].symbolSize = 40
68
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
69
              viewData.element[i].draggable = 'false'
70
              viewData.element[i].fixed = 'true'
71
              viewData.element[i].label = labelOne
72
            }else{
73
              viewData.element[i].symbol =  error_windows
74
              viewData.element[i].symbolSize = 40
75
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
76
              viewData.element[i].draggable = 'false'
77
              viewData.element[i].fixed = 'true'
78
              viewData.element[i].label = labelOne
7980
            }
8182
          }else if(viewData.element[i].type === 11){
83
            if(viewData.element[i].status === 1){
84
              viewData.element[i].symbol =  linux
85
              viewData.element[i].symbolSize = 40
86
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
87
              viewData.element[i].draggable = 'false'
88
              viewData.element[i].fixed = 'true'
89
              viewData.element[i].label = labelOne
90
            }else{
91
              viewData.element[i].symbol =  error_linux
92
              viewData.element[i].symbolSize = 40
93
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
94
              viewData.element[i].draggable = 'false'
95
              viewData.element[i].fixed = 'true'
96
              viewData.element[i].label = labelOne
9798
            }
99100
          }else if(viewData.element[i].type === 0){
101
            if(viewData.element[i].status === 1){
102
              viewData.element[i].symbol =  cluster0
103
              viewData.element[i].symbolSize = 40
104
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
105
              viewData.element[i].draggable = 'false'
106
              viewData.element[i].fixed = 'true'
107
              viewData.element[i].label = labelOne
108
            }else{
109
              viewData.element[i].symbol =  error_cluster0
110
              viewData.element[i].symbolSize = 40
111
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
112
              viewData.element[i].draggable = 'false'
113
              viewData.element[i].fixed = 'true'
114
              viewData.element[i].label = labelOne
115116
            }
117118
          }else if(viewData.element[i].type === 1) {
119
            if(viewData.element[i].status === 1){
120
              viewData.element[i].symbol =  cluster1
121
              viewData.element[i].symbolSize = 40
122
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
123
              viewData.element[i].draggable = 'false'
124
              viewData.element[i].fixed = 'true'
125
              viewData.element[i].label = labelOne
126
            }else{
127
              viewData.element[i].symbol =  error_cluster1
128
              viewData.element[i].symbolSize = 40
129
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
130
              viewData.element[i].draggable = 'false'
131
              viewData.element[i].fixed = 'true'
132
              viewData.element[i].label = labelOne
133134
            }
135136
          }else if(viewData.element[i].type === 2) {
137
            if(viewData.element[i].status === 1){
138
              viewData.element[i].symbol =  cluster2
139
              viewData.element[i].symbolSize = 40
140
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
141
              viewData.element[i].draggable = 'false'
142
              viewData.element[i].fixed = 'true'
143
              viewData.element[i].label = labelOne
144
            }else{
145
              viewData.element[i].symbol =  error_cluster2
146
              viewData.element[i].symbolSize = 40
147
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
148
              viewData.element[i].draggable = 'false'
149
              viewData.element[i].fixed = 'true'
150
              viewData.element[i].label = labelOne
151152
            }
153154
          }else if(viewData.element[i].type === 3) {
155
            if(viewData.element[i].status === 1){
156
              viewData.element[i].symbol =  cluster3
157
              viewData.element[i].symbolSize = 40
158
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
159
              viewData.element[i].draggable = 'false'
160
              viewData.element[i].fixed = 'true'
161
              viewData.element[i].label = labelOne
162
            }else{
163
              viewData.element[i].symbol =  error_cluster3
164
              viewData.element[i].symbolSize = 40
165
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
166
              viewData.element[i].draggable = 'false'
167
              viewData.element[i].fixed = 'true'
168
              viewData.element[i].label = labelOne
169170
            }
171172
          }else if(viewData.element[i].type === 4){
173
            if(viewData.element[i].status === 1){
174
              viewData.element[i].symbol =  cluster4
175
              viewData.element[i].symbolSize = 40
176
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
177
              viewData.element[i].draggable = 'false'
178
              viewData.element[i].fixed = 'true'
179
              viewData.element[i].label = labelOne
180
            }else{
181
              viewData.element[i].symbol =  error_cluster4
182
              viewData.element[i].symbolSize = 40
183
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
184
              viewData.element[i].draggable = 'false'
185
              viewData.element[i].fixed = 'true'
186
              viewData.element[i].label = labelOne
187188
            }
189190
          }
191
        }
192
        var linkss = viewData.line.map((item,i)=>{
193
          return {
194
            source:item.fromName.id,
195
            target:item.toName.id,
196197
          }
198
        })
199
        console.log(linkss)
200
        const option = {
201
          grid: {
202
            left: '6%',
203
            top: '1%',
204
            bottom:'5%',
205
          },
206
          textStyle: {
207
            color: '#f00',
208
            fontSize: 16,
209
            fontWeight: 600,
210
          },
211
          // tooltip: {
212
          //   // 表示不使用默認的『顯示』『隱藏』觸發規則。
213
          //   triggerOn: 'none',
214
          //   formatter: function (params) {
215
          //     return 'X: ' + params.data[0].toFixed(2) + '<br>Y: ' + params.data[1].toFixed(2);
216
          //   }
217
          // },
218
          backgroundColor:"#013954",
219
         // backgroundColor:"#fff",
220
          animationDuration: 1500,
221
          animationEasingUpdate: 'quinticInOut',
222
          xAxis: {
223
            show: false,
224
            type: 'value',
225
            axisLine: {onZero: false}
226
          },
227
          yAxis: {
228
            show: false,
229
            type: 'value',
230
            axisLine: {onZero: false}
231
          },
232
          series: [
233
            {
234
            id:'a',
235
            type: 'graph',
236
            coordinateSystem: 'cartesian2d',
237
            legendHoverLink: false,
238
            hoverAnimation: true,
239
            nodeScaleRatio: false,
240
            roam: false,
241
            color: {
242
              type: 'linear',
243
              x: 0,
244
              y: 0,
245
              x2: 0,
246
              y2: 1,
247
              colorStops: [{
248
                offset: 0, color: 'red' // 0% 處的顏色
249
              }, {
250
                offset: 1, color: 'blue' // 100% 處的顏色
251
              }],
252
              global: false // 缺省爲 false
253
            },
254
            edges:linkss,
255
            data: viewData.element,
256
          },
257
            ]
258
        };
259
        //折線點本來並無拖拽功能,須要咱們爲它加上:使用 graphic 組件,在每一個點上面,覆蓋一個隱藏的可拖拽的圓點
260
        myChart.setOption(option,true);
261
        // onPointDragging(0)//初始化
262
        console.log(myChart.getOption())
263
        myChart.setOption({
264
          graphic: echarts.util.map(data, function (dataItem, dataIndex) {
265
            return {
266
              // 'circle' 表示這個 graphic element 的類型是圓點。
267
              type: 'circle',
268
              shape: {
269
                // 圓點的半徑。
270
                r: symbolSize
271
              },
272
              position: myChart.convertToPixel('grid', dataItem),
273
              invisible: true,
274
              // 這個屬性讓圓點能夠被拖拽。
275
              draggable: true,
276
              // 把 z 值設得比較大,表示這個圓點在最上方,能覆蓋住已有的折線圖的圓點。
277
              z: 100,
278
              ondrag: echarts.util.curry(onPointDragging, dataIndex),
279
              // 在 mouseover 的時候顯示,在 mouseout 的時候隱藏。
280
              onmousemove: echarts.util.curry(showTooltip, dataIndex),
281
              onmouseout: echarts.util.curry(hideTooltip, dataIndex),
282
            };
283
          })
284
        });
285
        // 此函數中會根據拖拽後的新位置,改變 data 中的值,並用新的 data 值,重繪折線圖,從而使折線圖同步於被拖拽的隱藏圓點。
286
        function onPointDragging(dataIndex) {
287
          // 這裏的 data 就是本文最初的代碼塊中聲明的 data,在這裏會被更新。
288
          // 這裏的 this 就是被拖拽的圓點。this.position 就是圓點當前的位置。
289
          data[dataIndex] = myChart.convertFromPixel('grid', this.position);
290
          let initIndex =  that.viewData.element[dataIndex].value
291
          viewData.element[dataIndex].value = data[dataIndex]
292
          console.log( that, data[dataIndex])
293
          //元素位置改變後從新劃線
294
          // for(let i = 0;i < viewData.line.length;i ++){
295
          //   if(viewData.line[i].fromName === viewData.element[dataIndex].id){
296
          //     viewData.line[i].coords[0] = data[dataIndex]
297
          //   }else if(viewData.line[i].toName === viewData.element[dataIndex].id){
298
          //     viewData.line[i].coords[1] = data[dataIndex]
299
          //   }
300
          // }
301
          // 用更新後的 data,重繪折線圖。
302
          myChart.setOption(option);
303
        }
304
        function showTooltip(dataIndex) {
305
          myChart.dispatchAction({
306
            type: 'showTip',
307
            seriesIndex: 0,
308
            dataIndex: dataIndex
309
          });
310
        }
311
        function hideTooltip(dataIndex) {
312
          myChart.dispatchAction({
313
            type: 'hideTip'
314
          });
315
        }
316
        // 最後,爲了使 dom 尺寸改變時,圖中的元素能自適應得變化
317
        window.addEventListener('resize', function () {
318
          // 對每一個拖拽圓點從新計算位置,並用 setOption 更新。
319
          myChart.setOption({
320
            graphic: echarts.util.map(data, function (item, dataIndex) {
321
              return {
322
                position: myChart.convertToPixel('grid', item)
323
              };
324
            })
325
          });
326
        });
327
        //監聽點擊事件
328
        myChart.on('click', function (params) {
329
          console.log(params)
330
          if(params.seriesType === "graph"){
331
            that.$emit('selectAsset',params.data.id)
332
          }
333
          //TODO
334335
        });
336
        // //添加右件菜單
337
        // myChart.on("mousedown",function(e){
338
        //   if(e.event.event.button===2){
339
        //     //e中有當前節點信息
340
        //     showMenu(e,[
341
        //       {
342
        //         "name": "菜單1",
343
        //         "fn": function() {
344
        //           alert("觸發-菜單1" + e.data);
345
        //           console.log(e);
346
        //         }
347
        //       }, {
348
        //         "name": "菜單2",
349
        //         "fn": function() {
350
        //           alert("觸發-菜單2" + e.data);
351
        //         }
352
        //       }
353
        //     ]);
354
        //   }
355
        // })
356
        //
357
        // var style_ul = "padding:0px;margin:0px;border: 1px solid #ccc;background-color: #fff;position: absolute;left: 0px;top: 0px;z-index: 2;display: none;";
358
        // var style_li = "list-style:none;padding: 5px; cursor: pointer; padding: 5px 20px;margin:0px;";
359
        // var style_li_hover = style_li + "background-color: #00A0E9; color: #fff;";
360
        //
361
        // //右鍵菜單容器
362
        // var menubox = $("<div class='echartboxMenu' style='" + style_ul + "'><div style='text-align:center;background:#ccc'></div><ul style='margin:0px;padding:0px;'></ul></div>")
363
        //   .appendTo($(document.body));
364
        //
365
        // //移除瀏覽器右鍵菜單
366
        // myChart.getDom().oncontextmenu = menubox[0].oncontextmenu = function(){
367
        //   return false;
368
        // }
369
        //
370
        // //點擊其餘位置隱藏菜單
371
        // $(document).click(function() {
372
        //   menubox.hide()
373
        // });
374
        //
375
        // //顯示菜單
376
        // var showMenu = function(e,menus){
377
        //   $("div", menubox).text(e.name);
378
        //   var menulistbox = $("ul", menubox).empty();
379
        //   $(menus).each(function(i, item) {
380
        //     var li = $("<li style='" + style_li + "'>" + item.name + "</li>")
381
        //       .mouseenter(function() {
382
        //         $(this).attr("style", style_li_hover);
383
        //       })
384
        //       .mouseleave(function() {
385
        //         $(this).attr("style", style_li);
386
        //       })
387
        //       .click(function() {
388
        //         item["fn"].call(this);
389
        //         menubox.hide();
390
        //       });
391
        //     menulistbox.append(li);
392
        //   });
393
        //   menubox.css({
394
        //     "left": event.x,
395
        //     "top": event.y
396
        //   }).show();
397
        // }
398399
        /*窗口自適應,關鍵代碼*/
400
        setTimeout(function (){
401
          window.onresize = function () {
402
            myChart.resize();
403
          }
404
        },200)
405
        // window.addEventListener('resize', function () {
406
        //     myChart.resize();
407
        // });
408
      })
409
    },
​
​

二、元素用graph類型的畫圖,連線關係用type爲line的關係描述,優勢:連線的樣式多樣化,便於動態渲染。缺點:初始化的時候不顯示線條

​
​

1
 series: [
2
            {
3
            id:'a',
4
            type: 'graph',
5
            coordinateSystem: 'cartesian2d',
6
            legendHoverLink: false,
7
            hoverAnimation: true,
8
            nodeScaleRatio: false,
9
            roam: false,
10
            lineStyle: {//去掉自帶的那條線,不要刪
11
              normal: {
12
                width: 0,
13
                shadowColor: 'none',
14
                color: 'transparent'
15
              },
16
            },
17
            data: viewData.element,
18
          },
19
            {
20
              type: 'lines', //大數據到塊1,2,...n
21
              coordinateSystem: 'cartesian2d',
22
              z: 1,
23
              // showAllSymbol:true,
24
              effect: {
25
                show: true,
26
                smooth: true,
27
                trailLength: 0,
28
                symbol: "arrow",
29
                color: '#ffc776',
30
                symbolSize: 8,
31
                period: 6,
32
                loop: true,
33
              },
34
              lineStyle: {
35
                normal: {
36
                  curveness: 0,
37
                  color: lineColorOne,
38
                  width: 1,
39
                }
40
              },
41
              data:viewData.line,
42
            }
43
            ]
44
            
45
             // 此函數中會根據拖拽後的新位置,改變 data 中的值,並用新的 data 值,重繪折線圖,從而使折線圖同步於被拖拽的隱藏圓點。
46
        function onPointDragging(dataIndex) {
47
          // 這裏的 data 就是本文最初的代碼塊中聲明的 data,在這裏會被更新。
48
          // 這裏的 this 就是被拖拽的圓點。this.position 就是圓點當前的位置。
49
          data[dataIndex] = myChart.convertFromPixel('grid', this.position);
50
          let initIndex =  that.viewData.element[dataIndex].value
51
          viewData.element[dataIndex].value = data[dataIndex]
52
          console.log( that, data[dataIndex])
53
          //元素位置改變後從新劃線(關鍵代碼)
54
          for(let i = 0;i < viewData.line.length;i ++){
55
            if(viewData.line[i].fromName === viewData.element[dataIndex].id){
56
              viewData.line[i].coords[0] = data[dataIndex]
57
            }else if(viewData.line[i].toName === viewData.element[dataIndex].id){
58
              viewData.line[i].coords[1] = data[dataIndex]
59
            }
60
          }
61
          // 用更新後的 data,重繪折線圖。
62
          myChart.setOption(option);
63
        }
64
​
​
​

 

一、需求——如何在echarts中實現託拖拽的效果

 

image.png                            
   

 

 

二、解決方案

一、用Echarts的type爲graph類型畫圖,優勢:拖拽不用從新定點劃線,有自帶的連線關係,缺點:連線的樣式及特效不能很好呈現

關鍵代碼:css

 

代碼塊
Plain Text
 
 
 
1
 mounted () {
2
      const that = this
3
      this.$nextTick(() => {
4
        let myChart = echarts.init(document.getElementById(this.scaleLine_id))
5
        var home = "image:///img/bussiness.png";  //業務
6
        var error_home = "image:///img/error-bussiness.png";  //故障業務
7
        var windows = "image:///img/windows.png";  //windows主機
8
        var error_windows = "image:///img/error-windows";  //故障windows
9
        var linux = "image:///img/linux.png";  //linux
10
        var error_linux = "image:///img/error-linux.png";  //故障linux
11
        var cluster0 = "image:///img/cluster_0.png";  //web服務器
12
        var error_cluster0 = "image:///img/error-cluster_0.png";  //故障web服務器
13
        var cluster1 = "image:///img/cluster_1.png";  //數據庫
14
        var error_cluster1 = "image:///img/error-cluster_1.png";  //故障數據庫
15
        var cluster2 = "image:///img/cluster_2.png";  //消息隊列
16
        var error_cluster2 = "image:///img/error-cluster_2.png";  //故障消息隊列
17
        var cluster3 = "image:///img/cluster_3.png";  //緩存
18
        var error_cluster3 = "image:///img/error-cluster_3.png";  //故障緩存
19
        var cluster4 = "image:///img/cluster_4.png";  //文件系統
20
        var error_cluster4 = "image:///img/error-cluster_4.png";  //故障文件系統
21
        let labelOne = {//文字1省級市級五區
22
          normal: {
23
            position: "bottom",
24
            distance:0,//離圖標多遠
25
            show: true,
26
            textStyle: {
27
              fontSize: 15,
28
              color:'#00eaff',
29
              fontFamily:'microsoftYaHei'
30
            },
31
          }
32
        };
33
        let lineColorOne = new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
34
          offset: 0,
35
          color: '#58B3CC'
36
        }, {
37
          offset: 1,
38
          color: '#F58158'
39
        }])
40
        let viewData = this.viewData
41
        let data = []
42
        var symbolSize = 20;
43
        // console.log(viewData)
44
        //處理數據格式
45
        for(let i = 0;i<viewData.element.length;i++){
46
          data.push(viewData.element[i].value)
47
          if(viewData.element[i].type === 20){
48
            if(viewData.element[i].status === 1){
49
              viewData.element[i].symbol =  home
50
              viewData.element[i].symbolSize = 40
51
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
52
              viewData.element[i].draggable = 'true'
53
              viewData.element[i].fixed = 'true'
54
              viewData.element[i].label = labelOne
55
            }else{
56
              viewData.element[i].symbol =  error_home
57
              viewData.element[i].symbolSize = 40
58
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
59
              viewData.element[i].draggable = 'true'
60
              viewData.element[i].fixed = 'true'
61
              viewData.element[i].label = labelOne
62
63
            }
64
          }else if(viewData.element[i].type === 10){
65
            if(viewData.element[i].status === 1){
66
              viewData.element[i].symbol =  windows
67
              viewData.element[i].symbolSize = 40
68
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
69
              viewData.element[i].draggable = 'false'
70
              viewData.element[i].fixed = 'true'
71
              viewData.element[i].label = labelOne
72
            }else{
73
              viewData.element[i].symbol =  error_windows
74
              viewData.element[i].symbolSize = 40
75
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
76
              viewData.element[i].draggable = 'false'
77
              viewData.element[i].fixed = 'true'
78
              viewData.element[i].label = labelOne
79
80
            }
81
82
          }else if(viewData.element[i].type === 11){
83
            if(viewData.element[i].status === 1){
84
              viewData.element[i].symbol =  linux
85
              viewData.element[i].symbolSize = 40
86
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
87
              viewData.element[i].draggable = 'false'
88
              viewData.element[i].fixed = 'true'
89
              viewData.element[i].label = labelOne
90
            }else{
91
              viewData.element[i].symbol =  error_linux
92
              viewData.element[i].symbolSize = 40
93
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
94
              viewData.element[i].draggable = 'false'
95
              viewData.element[i].fixed = 'true'
96
              viewData.element[i].label = labelOne
97
98
            }
99
100
          }else if(viewData.element[i].type === 0){
101
            if(viewData.element[i].status === 1){
102
              viewData.element[i].symbol =  cluster0
103
              viewData.element[i].symbolSize = 40
104
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
105
              viewData.element[i].draggable = 'false'
106
              viewData.element[i].fixed = 'true'
107
              viewData.element[i].label = labelOne
108
            }else{
109
              viewData.element[i].symbol =  error_cluster0
110
              viewData.element[i].symbolSize = 40
111
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
112
              viewData.element[i].draggable = 'false'
113
              viewData.element[i].fixed = 'true'
114
              viewData.element[i].label = labelOne
115
116
            }
117
118
          }else if(viewData.element[i].type === 1) {
119
            if(viewData.element[i].status === 1){
120
              viewData.element[i].symbol =  cluster1
121
              viewData.element[i].symbolSize = 40
122
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
123
              viewData.element[i].draggable = 'false'
124
              viewData.element[i].fixed = 'true'
125
              viewData.element[i].label = labelOne
126
            }else{
127
              viewData.element[i].symbol =  error_cluster1
128
              viewData.element[i].symbolSize = 40
129
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
130
              viewData.element[i].draggable = 'false'
131
              viewData.element[i].fixed = 'true'
132
              viewData.element[i].label = labelOne
133
134
            }
135
136
          }else if(viewData.element[i].type === 2) {
137
            if(viewData.element[i].status === 1){
138
              viewData.element[i].symbol =  cluster2
139
              viewData.element[i].symbolSize = 40
140
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
141
              viewData.element[i].draggable = 'false'
142
              viewData.element[i].fixed = 'true'
143
              viewData.element[i].label = labelOne
144
            }else{
145
              viewData.element[i].symbol =  error_cluster2
146
              viewData.element[i].symbolSize = 40
147
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
148
              viewData.element[i].draggable = 'false'
149
              viewData.element[i].fixed = 'true'
150
              viewData.element[i].label = labelOne
151
152
            }
153
154
          }else if(viewData.element[i].type === 3) {
155
            if(viewData.element[i].status === 1){
156
              viewData.element[i].symbol =  cluster3
157
              viewData.element[i].symbolSize = 40
158
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
159
              viewData.element[i].draggable = 'false'
160
              viewData.element[i].fixed = 'true'
161
              viewData.element[i].label = labelOne
162
            }else{
163
              viewData.element[i].symbol =  error_cluster3
164
              viewData.element[i].symbolSize = 40
165
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
166
              viewData.element[i].draggable = 'false'
167
              viewData.element[i].fixed = 'true'
168
              viewData.element[i].label = labelOne
169
170
            }
171
172
          }else if(viewData.element[i].type === 4){
173
            if(viewData.element[i].status === 1){
174
              viewData.element[i].symbol =  cluster4
175
              viewData.element[i].symbolSize = 40
176
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
177
              viewData.element[i].draggable = 'false'
178
              viewData.element[i].fixed = 'true'
179
              viewData.element[i].label = labelOne
180
            }else{
181
              viewData.element[i].symbol =  error_cluster4
182
              viewData.element[i].symbolSize = 40
183
              viewData.element[i].itemStyle = {"normal":{"color":"#F58158"}}
184
              viewData.element[i].draggable = 'false'
185
              viewData.element[i].fixed = 'true'
186
              viewData.element[i].label = labelOne
187
188
            }
189
190
          }
191
        }
192
        var linkss = viewData.line.map((item,i)=>{
193
          return {
194
            source:item.fromName.id,
195
            target:item.toName.id,
196
197
          }
198
        })
199
        console.log(linkss)
200
        const option = {
201
          grid: {
202
            left: '6%',
203
            top: '1%',
204
            bottom:'5%',
205
          },
206
          textStyle: {
207
            color: '#f00',
208
            fontSize: 16,
209
            fontWeight: 600,
210
          },
211
          // tooltip: {
212
          //   // 表示不使用默認的『顯示』『隱藏』觸發規則。
213
          //   triggerOn: 'none',
214
          //   formatter: function (params) {
215
          //     return 'X: ' + params.data[0].toFixed(2) + '<br>Y: ' + params.data[1].toFixed(2);
216
          //   }
217
          // },
218
          backgroundColor:"#013954",
219
         // backgroundColor:"#fff",
220
          animationDuration: 1500,
221
          animationEasingUpdate: 'quinticInOut',
222
          xAxis: {
223
            show: false,
224
            type: 'value',
225
            axisLine: {onZero: false}
226
          },
227
          yAxis: {
228
            show: false,
229
            type: 'value',
230
            axisLine: {onZero: false}
231
          },
232
          series: [
233
            {
234
            id:'a',
235
            type: 'graph',
236
            coordinateSystem: 'cartesian2d',
237
            legendHoverLink: false,
238
            hoverAnimation: true,
239
            nodeScaleRatio: false,
240
            roam: false,
241
            color: {
242
              type: 'linear',
243
              x: 0,
244
              y: 0,
245
              x2: 0,
246
              y2: 1,
247
              colorStops: [{
248
                offset: 0, color: 'red' // 0% 處的顏色
249
              }, {
250
                offset: 1, color: 'blue' // 100% 處的顏色
251
              }],
252
              global: false // 缺省爲 false
253
            },
254
            edges:linkss,
255
            data: viewData.element,
256
          },
257
            ]
258
        };
259
        //折線點本來並無拖拽功能,須要咱們爲它加上:使用 graphic 組件,在每一個點上面,覆蓋一個隱藏的可拖拽的圓點
260
        myChart.setOption(option,true);
261
        // onPointDragging(0)//初始化
262
        console.log(myChart.getOption())
263
        myChart.setOption({
264
          graphic: echarts.util.map(data, function (dataItem, dataIndex) {
265
            return {
266
              // 'circle' 表示這個 graphic element 的類型是圓點。
267
              type: 'circle',
268
              shape: {
269
                // 圓點的半徑。
270
                r: symbolSize
271
              },
272
              position: myChart.convertToPixel('grid', dataItem),
273
              invisible: true,
274
              // 這個屬性讓圓點能夠被拖拽。
275
              draggable: true,
276
              // 把 z 值設得比較大,表示這個圓點在最上方,能覆蓋住已有的折線圖的圓點。
277
              z: 100,
278
              ondrag: echarts.util.curry(onPointDragging, dataIndex),
279
              // 在 mouseover 的時候顯示,在 mouseout 的時候隱藏。
280
              onmousemove: echarts.util.curry(showTooltip, dataIndex),
281
              onmouseout: echarts.util.curry(hideTooltip, dataIndex),
282
            };
283
          })
284
        });
285
        // 此函數中會根據拖拽後的新位置,改變 data 中的值,並用新的 data 值,重繪折線圖,從而使折線圖同步於被拖拽的隱藏圓點。
286
        function onPointDragging(dataIndex) {
287
          // 這裏的 data 就是本文最初的代碼塊中聲明的 data,在這裏會被更新。
288
          // 這裏的 this 就是被拖拽的圓點。this.position 就是圓點當前的位置。
289
          data[dataIndex] = myChart.convertFromPixel('grid', this.position);
290
          let initIndex =  that.viewData.element[dataIndex].value
291
          viewData.element[dataIndex].value = data[dataIndex]
292
          console.log( that, data[dataIndex])
293
          //元素位置改變後從新劃線
294
          // for(let i = 0;i < viewData.line.length;i ++){
295
          //   if(viewData.line[i].fromName === viewData.element[dataIndex].id){
296
          //     viewData.line[i].coords[0] = data[dataIndex]
297
          //   }else if(viewData.line[i].toName === viewData.element[dataIndex].id){
298
          //     viewData.line[i].coords[1] = data[dataIndex]
299
          //   }
300
          // }
301
          // 用更新後的 data,重繪折線圖。
302
          myChart.setOption(option);
303
        }
304
        function showTooltip(dataIndex) {
305
          myChart.dispatchAction({
306
            type: 'showTip',
307
            seriesIndex: 0,
308
            dataIndex: dataIndex
309
          });
310
        }
311
        function hideTooltip(dataIndex) {
312
          myChart.dispatchAction({
313
            type: 'hideTip'
314
          });
315
        }
316
        // 最後,爲了使 dom 尺寸改變時,圖中的元素能自適應得變化
317
        window.addEventListener('resize', function () {
318
          // 對每一個拖拽圓點從新計算位置,並用 setOption 更新。
319
          myChart.setOption({
320
            graphic: echarts.util.map(data, function (item, dataIndex) {
321
              return {
322
                position: myChart.convertToPixel('grid', item)
323
              };
324
            })
325
          });
326
        });
327
        //監聽點擊事件
328
        myChart.on('click', function (params) {
329
          console.log(params)
330
          if(params.seriesType === "graph"){
331
            that.$emit('selectAsset',params.data.id)
332
          }
333
          //TODO
334
335
        });
336
        // //添加右件菜單
337
        // myChart.on("mousedown",function(e){
338
        //   if(e.event.event.button===2){
339
        //     //e中有當前節點信息
340
        //     showMenu(e,[
341
        //       {
342
        //         "name": "菜單1",
343
        //         "fn": function() {
344
        //           alert("觸發-菜單1" + e.data);
345
        //           console.log(e);
346
        //         }
347
        //       }, {
348
        //         "name": "菜單2",
349
        //         "fn": function() {
350
        //           alert("觸發-菜單2" + e.data);
351
        //         }
352
        //       }
353
        //     ]);
354
        //   }
355
        // })
356
        //
357
        // var style_ul = "padding:0px;margin:0px;border: 1px solid #ccc;background-color: #fff;position: absolute;left: 0px;top: 0px;z-index: 2;display: none;";
358
        // var style_li = "list-style:none;padding: 5px; cursor: pointer; padding: 5px 20px;margin:0px;";
359
        // var style_li_hover = style_li + "background-color: #00A0E9; color: #fff;";
360
        //
361
        // //右鍵菜單容器
362
        // var menubox = $("<div class='echartboxMenu' style='" + style_ul + "'><div style='text-align:center;background:#ccc'></div><ul style='margin:0px;padding:0px;'></ul></div>")
363
        //   .appendTo($(document.body));
364
        //
365
        // //移除瀏覽器右鍵菜單
366
        // myChart.getDom().oncontextmenu = menubox[0].oncontextmenu = function(){
367
        //   return false;
368
        // }
369
        //
370
        // //點擊其餘位置隱藏菜單
371
        // $(document).click(function() {
372
        //   menubox.hide()
373
        // });
374
        //
375
        // //顯示菜單
376
        // var showMenu = function(e,menus){
377
        //   $("div", menubox).text(e.name);
378
        //   var menulistbox = $("ul", menubox).empty();
379
        //   $(menus).each(function(i, item) {
380
        //     var li = $("<li style='" + style_li + "'>" + item.name + "</li>")
381
        //       .mouseenter(function() {
382
        //         $(this).attr("style", style_li_hover);
383
        //       })
384
        //       .mouseleave(function() {
385
        //         $(this).attr("style", style_li);
386
        //       })
387
        //       .click(function() {
388
        //         item["fn"].call(this);
389
        //         menubox.hide();
390
        //       });
391
        //     menulistbox.append(li);
392
        //   });
393
        //   menubox.css({
394
        //     "left": event.x,
395
        //     "top": event.y
396
        //   }).show();
397
        // }
398
399
        /*窗口自適應,關鍵代碼*/
400
        setTimeout(function (){
401
          window.onresize = function () {
402
            myChart.resize();
403
          }
404
        },200)
405
        // window.addEventListener('resize', function () {
406
        //     myChart.resize();
407
        // });
408
      })
409
    },
 
 

 

二、元素用graph類型的畫圖,連線關係用type爲line的關係描述,優勢:連線的樣式多樣化,便於動態渲染。缺點:初始化的時候不顯示線條

在以上的代碼部分修改node

 

代碼塊
Plain Text
 
 
 
1
 series: [
2
            {
3
            id:'a',
4
            type: 'graph',
5
            coordinateSystem: 'cartesian2d',
6
            legendHoverLink: false,
7
            hoverAnimation: true,
8
            nodeScaleRatio: false,
9
            roam: false,
10
            lineStyle: {//去掉自帶的那條線,不要刪
11
              normal: {
12
                width: 0,
13
                shadowColor: 'none',
14
                color: 'transparent'
15
              },
16
            },
17
            data: viewData.element,
18
          },
19
            {
20
              type: 'lines', //大數據到塊1,2,...n
21
              coordinateSystem: 'cartesian2d',
22
              z: 1,
23
              // showAllSymbol:true,
24
              effect: {
25
                show: true,
26
                smooth: true,
27
                trailLength: 0,
28
                symbol: "arrow",
29
                color: '#ffc776',
30
                symbolSize: 8,
31
                period: 6,
32
                loop: true,
33
              },
34
              lineStyle: {
35
                normal: {
36
                  curveness: 0,
37
                  color: lineColorOne,
38
                  width: 1,
39
                }
40
              },
41
              data:viewData.line,
42
            }
43
            ]
44
 
            
45
             // 此函數中會根據拖拽後的新位置,改變 data 中的值,並用新的 data 值,重繪折線圖,從而使折線圖同步於被拖拽的隱藏圓點。
46
        function onPointDragging(dataIndex) {
47
          // 這裏的 data 就是本文最初的代碼塊中聲明的 data,在這裏會被更新。
48
          // 這裏的 this 就是被拖拽的圓點。this.position 就是圓點當前的位置。
49
          data[dataIndex] = myChart.convertFromPixel('grid', this.position);
50
          let initIndex =  that.viewData.element[dataIndex].value
51
          viewData.element[dataIndex].value = data[dataIndex]
52
          console.log( that, data[dataIndex])
53
          //元素位置改變後從新劃線(關鍵代碼)
54
          for(let i = 0;i < viewData.line.length;i ++){
55
            if(viewData.line[i].fromName === viewData.element[dataIndex].id){
56
              viewData.line[i].coords[0] = data[dataIndex]
57
            }else if(viewData.line[i].toName === viewData.element[dataIndex].id){
58
              viewData.line[i].coords[1] = data[dataIndex]
59
            }
60
          }
61
          // 用更新後的 data,重繪折線圖。
62
          myChart.setOption(option);
63
        }
64
 
 
相關文章
相關標籤/搜索