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 fragen Sie JSON in der Datenbank in MySQL 5.6 und darunter ab
Inhaltsverzeichnis Hörer beobachten Format Richte...
Kürzlich stellte mir ein Freund eine Frage: Beim ...
Installieren Sie zunächst den OpenSSH-Server im D...
Vorwort Der Quellcode umfasst insgesamt nur mehr ...
In diesem Artikel wird die Methode zum Teilen von...
Zweck: Ermöglichen Sie die gleichzeitige lokale S...
Sie müssen „gt_“ vor den Dateinamen aller TXT-Dat...
Inhaltsverzeichnis Ereignisgesteuert und Publish-...
MTR steht für Mini-Transaktion. Wie der Name scho...
Die Frontend-Entwicklungsabteilung wächst, die Mi...
Bei der Verwendung von Docker-Compose für die Ber...
Wie installiere ich MySQL 5.7 in Ubuntu 16.04? In...
wangEditor ist ein webbasierter Rich-Text-Editor,...
Vorwort Bei der Installation des Systems haben wi...
Was soll ich tun, wenn MySQL keine Verbindung zum...