Vue verwendet E-Charts, um ein Organigramm zu zeichnen

Vue verwendet E-Charts, um ein Organigramm zu zeichnen

Gestern habe ich einen Blog über den kreisförmigen Fortschrittsbalken geschrieben (siehe: kreisförmiger Fortschrittsbalken von Vue), der schon nervig genug war. Heute bin ich auf eine funktionale Anforderung gestoßen, ein Organigramm ähnlich dem eines Unternehmens anzuzeigen. Ich muss Risiken eingehen! ! !

Diese Art von Anforderung kann durch die Verwendung von Div+CSS erreicht werden, aber es gibt keinen Animationseffekt und mein CSS3 ist sehr schlecht. Darüber hinaus wurden im Projekt bereits Diagramme wie Liniendiagramme, Kreisdiagramme und Balkendiagramme verwendet und es werden immer noch Baidus E-Charts verwendet, sodass die Anforderung dieses Organigramms auch mit Baidus E-Charts implementiert wird.

Früher habe ich Echarts verwendet, um Liniendiagramme, Balkendiagramme und Kreisdiagramme zu zeichnen. Ich bin mit der API ziemlich vertraut, aber es ist sehr schwierig, Baumdiagramme wie Organisationsstrukturen zu zeichnen. Ich habe es noch nie zuvor verwendet. Darüber hinaus ist die Anzeigewirkung des von Echarts entworfenen Baumdiagramms weit von der des Baumdiagramms von Echarts entfernt. Mein Kind, ich muss eine weitere zeitaufwändige und mühsame Recherche durchführen. Das Entwurfsdiagramm ist wie folgt:

Wie in der Abbildung gezeigt, kann ein Baumknoten zwei unterschiedliche Hintergrundfarben und zwei unterschiedliche Textfarben haben und jeder Knoten wird dennoch als abgerundetes Rechteck angezeigt. Ein Kommilitone meinte, dass echarts über eine API zum Festlegen abgerundeter Ecken verfügt. Warum also nicht einfach direkt darauf zugreifen? Was ich sagen möchte ist, dass es zwar eine solche API bietet, diese aber nicht gemäß der normalen Routine implementiert werden kann.

Aus der Abbildung können wir auch einen Effekt erkennen, der fast unmöglich zu erreichen ist. Die Ecken der Linien, die die einzelnen Knoten verbinden, sind rechte Winkel statt glatter Ecken. Außerdem bietet echarts keine API, um die Ecken als rechte Winkel festzulegen, sondern nur eine Krümmung (die API-Beschreibung ist die Krümmung der Kante des Baumdiagramms). Nach der Verwendung dieser Funktion kann dies immer noch nicht erreicht werden.

Ich habe die Informationen online überprüft und einige Leute sagten, dass Sie den Quellcode von Echarts ändern können. Ich empfehle diese Lösung nicht, da Echarts in Vue- oder React-Projekten in package.json installiert werden müssen. Wenn mehrere Personen parallel entwickeln, sind die von anderen installierten Echarts nicht die Echarts, die Sie geändert haben. Das ist das Problem.

Schließlich ist der Effekt des Zeichnens mit Echarts immer noch sehr gut. Das einzige, was nicht erkannt wurde, ist, dass die Ecken der Linien, die jeden Knoten verbinden, keine rechten Winkel sind. Wenn es eine gute Lösung gibt, hoffe ich, dass Sie mich aufklären können. Danke! Zeigen Sie das Endergebnis:

Nachdem wir so viel gesagt haben, kommen wir nun zum Code. Dieser Code basiert auf Vue. Wenn Sie ihn in React verwenden möchten, ändern Sie ihn einfach leicht.

Komponente tree.vue:

<Vorlage>
 <div :class="Klassenname" :style="{Höhe:Höhe,Breite:Breite}" />
</Vorlage>

<Skript>
E-Charts aus „E-Charts“ importieren;
erfordern("echarts/theme/macarons");
importiere { Entprellung } von "@/utils";

Standard exportieren {
 Requisiten: {
  Klassenname: {
   Typ: Zeichenfolge,
   Standard: „Diagramm“
  },
  Breite: {
   Typ: Zeichenfolge,
   Standard: „100 %“
  },
  Höhe:
   Typ: Zeichenfolge,
   Standard: „500px“
  },
  Diagrammdaten: {
   Typ: Objekt,
   erforderlich: true
  }
 },
 Daten() {
  zurückkehren {
   Diagramm: null,
  };
 },
 betrachten:
  Diagrammdaten: {
   tief: wahr,
   handler(Wert) {
    this.setOptions(Wert);
   }
  }
 },
 montiert() {
  dies.initChart();
  //Muss es selbstadaptiv sein? - Anti-Shake-Funktion hinzufügen this.__resizeHandler = debounce(() => {
   wenn (dieses.diagramm) {
    dies.chart.resize();
   }
  }, 100);
  window.addEventListener("Größe ändern", this.__resizeHandler);

  // Auf Änderungen in der Seitenleiste achten, um eine adaptive Skalierung zu erreichen const sidebarElm = document.getElementsByClassName("sidebar-container")[0];
  sidebarElm.addEventListener("Übergangsende", this.sidebarResizeHandler);
 },
 vorZerstören() {
  wenn (!dieses.diagramm) {
   zurückkehren;
  }
  window.removeEventListener("Größe ändern", this.__resizeHandler);
  dies.chart.dispose();
  dieses.diagramm = null;

  const sidebarElm = document.getElementsByClassName("sidebar-container")[0];
  sidebarElm.removeEventListener("Übergangsende", this.sidebarResizeHandler);
 },
 Methoden: {
  initChart() {
   dieses.chart = echarts.init(dieses.$el, "macarons");
   dies.setOptions(diese.chartData);
  
   const nodes = this.chart._chartsViews[0]._data._graphicEls;
   sei alleNode = 0;
   für(let index = 0; index < nodes.length; index++) {
    const node = Knoten[Index];
    if (Knoten === undefiniert) {
     weitermachen
    }
    alleNode++;
   }
   
   const Höhe = Fenster.innere Höhe;
   const width = Fenster.innereBreite – 1000;
   const aktuelleHeight = 85 * alle Knoten;
   const aktuelleBreite = 220 * alle Knoten;
   const neueHeight = Math.max(aktuelleHeight, Höhe);
   const neueBreite = Math.max(aktuelleBreite, Breite);
   const tree_ele = dies.$el;
   // tree_ele.style.height = newHeight + 'px'; //Anzupassende Höhe festlegen tree_ele.style.width = newWidth + 'px'; //Anzupassende Breite festlegen this.chart.resize();

   this.chart.on('click', this.chartData.clickCallback); //Knoten-Klick-Ereignis},
  setOptions(Daten) {
   dieses.chart.setOption({
    //Bereitstellung von Tools zum Anzeigen, Wiederherstellen und Herunterladen von Daten// toolbox: {
    // anzeigen: wahr,
    // Besonderheit : {
    // Markierung: {show: true},
    // Datenansicht: {Anzeigen: true, Nur lesen: false},
    // wiederherstellen: {show: true},
    // AlsBild speichern : {show: true}
    // }
    // },
    Serie: [
     {
      Name: "Einheitliche Kreditansicht",
      Typ: "Baum",
      orient: "TB", //vertikal oder horizontal TB steht für vertikal LR steht für horizontal top: '10%',
      initialTreeDepth: 10, //Die anfängliche Erweiterungsebene (Tiefe) des Baumdiagramms
      expandAndCollapse: false, //Untergeordnete Knoten beim Klicken auf einen Knoten nicht ausblenden, Standard: true
      Symbolgröße: [135, 65],
      Artikelstil: {
       Farbe: 'transparent',
       Rahmenbreite: 0,
      },
      Linienstil:
       Farbe: '#D5D5D5',
       Breite: 1,
       Kurvenzahl: 1,
      },
      Daten: [Daten]
     }
    ]
   });
  },
  sidebarResizeHandler(e) {
   wenn (e.propertyName === "Breite") {
    dies.__resizeHandler();
   }
  }
 }
};
</Skript>

Verwenden der tree.vue-Methode:

<Vorlage>
  <Baum: Diagrammdaten = "Baumdaten" />
</Vorlage>

<Skript>
Baum aus „./tree“ importieren;

Standard exportieren {
 Daten() {
  zurückkehren {
   Baumdaten: {
    Etikett: {
     Hintergrundfarbe: '#F4F4F4',
     Rahmenradius: [0, 0, 5, 5],
     Formatierer: [
      '{erster|umfassender Kreditrahmen}',
      '{second|(CR20190912000013)\nGenehmigter Betrag: 100\nWährung: RMB}',
     ].join('\n'),
     reich:
      Erste: {
       Hintergrundfarbe: '#078E34',
       Farbe: '#fff',
       ausrichten: "zentriert",
       Breite: 135,
       Höhe: 30,
       Rahmenradius: [5, 5, 0, 0],
      },
      zweite: {
       Farbe: '#888',
       ausrichten: "zentriert",
       Zeilenhöhe: 17,
      },
     }
    },
    Kinder: [
     {
      Etikett: {
       Formatierer: [
        '{erstes|Kanalkontingent}',
       ].join('\n'),
       reich:
        Erste: {
         Hintergrundfarbe: '#3AC082',
         Farbe: '#fff',
         ausrichten: "zentriert",
         Breite: 135,
         Höhe: 65,
         Grenzradius: 5,
        },
       }
      },
      Kinder: [{
       Etikett: {
        Formatierer: [
         '{erster|Factoring-Betrag}',
        ].join('\n'),
        reich:
         Erste: {
          Hintergrundfarbe: '#3AC082',
          Farbe: '#fff',
          ausrichten: "zentriert",
          Breite: 135,
          Höhe: 65,
          Grenzradius: 5,
         },
        }
       },
       Kinder: [{
        Etikett: {
         Hintergrundfarbe: '#F4F4F4',
         Rahmenradius: [0, 0, 5, 5],
         Formatierer: [
          '{erste|umgekehrte Faktorisierung}',
          '{second|(CR20190912000013)\nGenehmigter Betrag: 100\nWährung: RMB}',
         ].join('\n'),
         reich:
          Erste: {
           Hintergrundfarbe: '#078E34',
           Farbe: '#fff',
           ausrichten: "zentriert",
           Breite: 135,
           Höhe: 30,
           Rahmenradius: [5, 5, 0, 0],
          },
          zweite: {
           Farbe: '#888',
           ausrichten: "zentriert",
           Zeilenhöhe: 17,
          },
         }
        },
       }]
      }]
     },
     {
      Etikett: {
       Formatierer: [
        '{erste|Garantie/(Le) Gruppe/Andere Beträge}',
       ].join('\n'),
       reich:
        Erste: {
         Hintergrundfarbe: '#3AC082',
         Farbe: '#fff',
         ausrichten: "zentriert",
         Breite: 135,
         Höhe: 65,
         Grenzradius: 5,
        },
       }
      },
      Kinder: [{
       Etikett: {
        Formatierer: [
         '{erster|Factoring-Betrag}',
        ].join('\n'),
        reich:
         Erste: {
          Hintergrundfarbe: '#3AC082',
          Farbe: '#fff',
          ausrichten: "zentriert",
          Breite: 135,
          Höhe: 65,
          Grenzradius: 5,
         },
        }
       },
       Kinder: [{
        Etikett: {
         Hintergrundfarbe: '#F4F4F4',
         Rahmenradius: [0, 0, 5, 5],
         Formatierer: [
          '{erste|Vorwärtsfaktorisierung}',
          '{second|(CR20190912000013)\nGenehmigter Betrag: 100\nWährung: RMB}',
         ].join('\n'),
         reich:
          Erste: {
           Hintergrundfarbe: '#B8D87E',
           Farbe: '#fff',
           ausrichten: "zentriert",
           Breite: 135,
           Höhe: 30,
           Rahmenradius: [5, 5, 0, 0],
          },
          zweite: {
           Farbe: '#888',
           ausrichten: "zentriert",
           Zeilenhöhe: 17,
          },
         }
        },
       }]
      },
      {
       Etikett: {
        Formatierer: [
         '{erster|Leasingbetrag}',
        ].join('\n'),
        reich:
         Erste: {
          Hintergrundfarbe: '#3AC082',
          Farbe: '#fff',
          ausrichten: "zentriert",
          Breite: 135,
          Höhe: 65,
          Grenzradius: 5,
         },
        }
       },
       Kinder: [
        {
         Etikett: {
          Hintergrundfarbe: '#F4F4F4',
          Rahmenradius: [0, 0, 5, 5],
          Formatierer: [
           '{erste|Fahrzeugmiete}',
           '{second|(CR20190912000013)\nGenehmigter Betrag: 100\nWährung: RMB}',
          ].join('\n'),
          reich:
           Erste: {
            Hintergrundfarbe: '#FF6C6A',
            Farbe: '#fff',
            ausrichten: "zentriert",
            Breite: 135,
            Höhe: 30,
            Rahmenradius: [5, 5, 0, 0],
           },
           zweite: {
            Farbe: '#888',
            ausrichten: "zentriert",
            Zeilenhöhe: 17,
           },
          }
         },
        },
       ]
      }]
     }
    ]
   }
  }
 },
 Komponenten:
  Baum,
 }
};
</Skript>

Es sieht nicht nach viel Code aus, aber um ihn zu implementieren, muss ich die Echarts-API und die Online-Informationen überprüfen. Da außerdem der Text an einem Knoten im Rendering umbrochen werden kann, die Textfarbe unterschiedlich ist und einige Knoten zwei Hintergrundfarben haben und der Stil und der an jedem Knoten angezeigte Text nicht festgelegt sind, stehen wir möglicherweise immer noch vor dem mühsamen Problem, die von der Schnittstelle zurückgegebenen Daten in die gewünschten Daten umzuwandeln. Genau wie das Format der an den Baumknoten übergebenen TreeData ist dies ziemlich mühsam. Wenn der Stil jedes Knotens gleich ist, ist es viel einfacher, wie beispielsweise ein Beispiel für ein Baumdiagramm auf der offiziellen Website: https://www.echartsjs.com/examples/zh/editor.html?c=tree-vertical

Ab der Version v4.7.0 von echarts wird der Konfigurationselementreihe eine API hinzugefügt: edgeShape:‘polyline‘, die erkennen kann, dass die Ecken der Linien, die jeden Knoten im Baumdiagramm verbinden, rechte Winkel sind.

Oben sind die Details der Verwendung von Echarts durch Vue zum Zeichnen eines Organigramms aufgeführt. Weitere Informationen zum Zeichnen von Organigrammen durch Vue finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • So führen Sie Bootstrap, ElementUI und Echarts in ein Vue-Projekt ein
  • Verwendung von E-Charts in Vue und dessen kollaborative Bindungsoperation mit Elementui-Select
  • Die VUE+elementui-Komponente zeichnet ein Miniatur-Echarts-Diagramm in die Tabellenzelle
  • Detaillierte Erläuterung des Problems zwischen Popup-Fenstern mithilfe von Element-UI und E-Charts in Vue
  • VUE2.0+Element-UI+Echarts verpackte Komponenteninstanz
  • Zusammenfassung einiger Probleme, die bei der Integration von E-Charts mit vue.js aufgetreten sind
  • vue+echarts realisiert den Flusseffekt der China-Karte (detaillierte Schritte)
  • Beispiel für die Verwendung von E-Charts in Vue
  • Schritte zum Einkapseln von E-Charts in ein Vue-Projekt
  • Vue Element Front-End-Anwendungsentwicklung Echarts Diagramm

<<:  Detaillierte Erklärung zur Installation von CentOS7 mit der in Win10 integrierten virtuellen Maschine Hyper-V

>>:  So fragen Sie JSON in der Datenbank in MySQL 5.6 und darunter ab

Artikel empfehlen

Ein Artikel zeigt Ihnen, wie Sie den Watch-Listener von Vue verwenden

Inhaltsverzeichnis Hörer beobachten Format Richte...

Aktivieren Sie den SSHD-Vorgang im Docker

Installieren Sie zunächst den OpenSSH-Server im D...

Mehr als 100 Zeilen Code zur Implementierung von React Drag Hooks

Vorwort Der Quellcode umfasst insgesamt nur mehr ...

Dateifreigabe zwischen Ubuntu und Windows unter VMware

In diesem Artikel wird die Methode zum Teilen von...

So implementieren Sie Datenpersistenz mit dem Vuex-Drittanbieterpaket

Zweck: Ermöglichen Sie die gleichzeitige lokale S...

So fügen Sie in Linux stapelweise Dateipräfixe hinzu

Sie müssen „gt_“ vor den Dateinamen aller TXT-Dat...

Eine kurze Diskussion über ereignisgesteuerte Entwicklung in JS und Nodejs

Inhaltsverzeichnis Ereignisgesteuert und Publish-...

Das Konzept von MTR in MySQL

MTR steht für Mini-Transaktion. Wie der Name scho...

Web-Frontend-Entwicklung CSS-bezogene Teamzusammenarbeit

Die Frontend-Entwicklungsabteilung wächst, die Mi...

Probleme bei der Verwendung der Rich-Text-Bearbeitung mit Wangeditor in Vue

wangEditor ist ein webbasierter Rich-Text-Editor,...