【Code-Hintergrund】Es gibt ein Geschäftsszenario, in dem es etwa ein Dutzend Tabellen gibt, die zu einer bestimmten Kategorie gehören. Benutzer möchten verschiedene Tabellen auf derselben Seite anzeigen, indem sie verschiedene Abfrageindikatoren auswählen. Die Kopfzeilenstile dieser Tabellen sind ähnlich, aber nicht genau gleich. Wie geht das? Bisher sind alle auf Element UI basierenden Tabellenstile direkt auf der Seite fest codiert, wie der offizielle: <el-table :data="tableData" style="width: 100%"> <el-table-column prop="date" label="Datum" width="180"></el-table-column> <el-table-column prop="name" label="Tabelle" width="180"></el-table-column> <el-table-column prop="address" label="Adresse"></el-table-column> </el-Tabelle> Um das obige Problem zu lösen, besteht die einfachste und gewalttätigste Methode darin, für jede Tabelle eine separate Komponente zu schreiben und dann das Auswahlfeld zu verwenden, um Ereignisse auszulösen, die zum Rendern der Seite zwischen verschiedenen Komponentenrouten wechseln. Natürlich ist diese Methode dumm und entspricht nicht dem Grundprinzip der Codewiederverwendung. Um also faul zu sein und das Grundprinzip der Codewiederverwendung einzuhalten, begann ich darüber nachzudenken, ob es einen besseren Weg gibt, dieses Problem zu lösen. Schauen Sie sich diese <el-table> genauer an. Die Tabellendaten werden über :data gebunden und die Tabellenkopfdaten werden über das Tag <el-table-column> angezeigt. Können die Kopfdaten auch über eine Art Parameterübergabemethode mit v-for kombiniert werden, um die spezifischen Daten von <el-table-column> darzustellen? Mithilfe von Baidu haben einige Experten dies tatsächlich geschafft und die dynamische Tabelle realisiert. Der Referenzlink befindet sich unten. Ich möchte den Experten, die ihr Wissen kostenlos geteilt haben, meinen besonderen Dank aussprechen. Wissen ist unbezahlbar und das Lernen hat kein Ende. Der spezifische Implementierungscode dieses Projekts wird wie folgt aufgezeichnet und einige Codeanmerkungen wurden verbessert, um das Verständnis zu erleichtern. 【Code-Implementierung】#1# -> Die Grundlage der Code-Wiederverwendung besteht darin, dass Sie eine wiederverwendbare Komponente benötigenErstellen Sie zwei neue Komponenten im Ordner /components/Table DynamicTable.vue <Vorlage> <!-- Dynamische Anzeigetabelle --> <el-table :data="tableData" Rahmenstreifen :height="Höhe" @row-click="handleRowClick"> <!-- v-for-Schleife zum Abrufen der Header-Daten --> <template v-for="Element im Tabellenheader"> <table-column v-if="item.children && item.children.length" :key="item.id" :column-header="item" /> <el-table-column v-else :key="item.id" :label="item.label" :prop="item.prop" align="center" /> </Vorlage> </el-Tabelle> </Vorlage> <Skript> importiere TableColumn aus '@/components/Table/TableColumn' Standard exportieren { Name: "DynamischeTabelle", Komponenten: Tabellenspalte }, Requisiten: { // Tabellendaten tableData: { Typ: Array, erforderlich: true }, // Mehrstufige Tabellenkopfdaten tableHeader: { Typ: Array, erforderlich: true }, // Die Höhe der Tabelle: { Typ: Zeichenfolge, Standard: „300“ } }, Methoden: { // Zeilenklickereignis handleRowClick (Zeile, Spalte, Ereignis) { // konsole.log(Zeile) // console.log(Spalte) // console.log(Ereignis) // Benachrichtigen Sie die übergeordnete Komponente über das Zeilenklickereignis. // Zeile wird als Parameter übergeben. this.$emit('row-click', row) } } } </Skript> Tabellenspalte.vue <Vorlage> <el-table-column :label="Spaltenüberschrift.label" :prop="Spaltenüberschrift.label" ausrichten="zentrieren" > <!--columnHeader entspricht: column-header--> <template v-for="Element in Spaltenüberschrift.Kinder"> <Tabellenspalte v-if="Artikel.Kinder && Artikel.Kinder.Länge" :Schlüssel="Artikel-ID" :Spaltenüberschrift="Element" /> <el-table-column v-sonst :Schlüssel="Artikelname" :label="Artikel.label" :prop="Artikel.prop" ausrichten="zentrieren" /> </Vorlage> </el-Tabellenspalte> </Vorlage> <Skript> Standard exportieren { Name: 'Tabellenspalte', Requisiten: { Spaltenüberschrift: { Typ: Objekt, erforderlich: true } } } </Skript> <Stilbereich> </Stil> Einige wichtige Hinweise: (1) Die im Tabellenkopf übergebenen Parameter werden hauptsächlich in zwei Kategorien unterteilt: mit untergeordneten Knoten und ohne untergeordnete Knoten, wie in der folgenden Abbildung dargestellt Bitte beachten Sie, dass der untergeordnete Knoten verwendet wird, um das Rendering komplexer Header abzuschließen. Der endgültige Header-Renderingstil des obigen Beispiels sieht beispielsweise wie folgt aus: Die Frage ist also: <el-table-column> ist das Tag von <el-table>. Was ist also diese <table-column>? (2) DynamicTable.vue ruft die Komponente TableColumn.vue auf DynamicTable.vue übergibt die Header-Informationen mit untergeordneten Knoten über :column-header an TableColumn.vue. Nach dem Empfang dieser Knoteninformationen führt TableColumn.vue hauptsächlich die folgenden zwei Dinge aus: Erstens: Rendern Sie ein Label-Tag durch <el-table-column> Zweitens: Bestimmen Sie weiterhin, ob der Knoten untergeordnete Knoten hat => Wenn ein untergeordneter Knoten vorhanden ist, fahren Sie mit dem Rendern über <table-column> fort, übergeben Sie diesen untergeordneten Knoten weiterhin an die Komponente TableColumn.vue und wiederholen Sie die obigen Schritte => Wenn kein untergeordneter Knoten vorhanden ist, bedeutet dies, dass dies ein Endknoten ist und mit der Darstellung von <el-table-column> endet. #2# -> Verwenden Sie dynamische Tabellenkomponenten auf der Anzeigeseite<Vorlage> <div Klasse="Demo"> <el-Karte> <!--Abfragebereich--> <el-row :gutter="10"> <el-col :span="6"> <div Klasse="Rasterinhalt bg-lila"> <span style="margin-right: 10px">Auswahlfeld -</span> <el-Auswahl v-Modell="angegebene_Tabelle" Platzhalter="Bitte auswählen" > <el-Option v-for="Element in Optionen" :Schlüssel="Artikel.zb_code" :label="Artikel.zb_name" :Wert="Artikel.zb_code" /> </el-Auswahl> </div> </el-col> <el-col :span="6"> <div Klasse="Rasterinhalt bg-lila"> <el-button type="primary" plain @click="handleQueryClick">Abfrage</el-button> </div> </el-col> </el-row> <!--Tabellenbereich--> <dynamische-tabelle v-if="dynamischeTabellenanzeige" :table-data="Tabellendaten" :table-header="Tabellenüberschriften" :Höhe="'550px'" /> </el-Karte> </div> </Vorlage> <Skript> //Komponenten importieren importiere DynamicTable aus '@/components/Table/DynamicTable' // Tabellenkopfzeileninformationen abrufen import { getTableHeader02_1, getTableHeader02_2, getTableHeader02_3, getTableHeader02_4 } von '@/api/table-header' Standard exportieren { Name: 'Index', Komponenten: { // Komponentenregistrierung DynamicTable }, Daten () { zurückkehren { // -- Abfrage ---------------------- Optionen: [ // { zb_name: 'Indikatorname', zb_code: 'Indikatorcode' } ], angegebene_Tabelle: '', // Indexwert// -- Tabelle--------------------- dynamicTableShow: true, // DynamicTable-Komponente rendert Variablen neu // Tabellenkopfdaten tableHeaders: [], // Tabellendaten tableData: [] } }, erstellt () { // API - Holen Sie sich die Dropdown-Box-Daten des Indikators getSpecifiedTable().then(res => { diese.Optionen = res.data }) }, Methoden: { //Überprüfen, ob der Wert im Array ist isExistArr (arr, val) { gibt arr.includes(Wert) zurück }, // Tabelle neu rendern refreshTable (zb_code) { // Labelwert entsprechend dem Wert abrufen const obj = this.options.find((item) => { Rückgabewert: item.zb_code === zb_code }) Konsole.log(zb_code) console.log(Objekt.zb_name) // Setzen Sie dynamicTableShow auf false, damit die DynamicTable-Komponente dies erneut rendert. dynamicTableShow = false // Verschiedene Tabellenüberschriften entsprechend den verschiedenen Indikatoren rendern const TBArr01 = ['M01', 'M02', 'M03', 'M05'] // Tabelle Kategorie 1 const TBArr02 = ['M04', 'M07', 'M08', 'M12'] // Tabelle Kategorie 2 const TBArr03 = ['M09', 'M10', 'M11'] // Tabelle Kategorie 3 const TBArr04 = ['M06'] // Tabelle Kategorie 4 if (this.isExistArr(TBArr01, zb_code)) { this.tableHeaders = getTableHeader02_1(obj.zb_name) // Rendern des Header-Stils 1 } wenn (dies.isExistArr(TBArr02, zb_code)) { this.tableHeaders = getTableHeader02_2(obj.zb_name) // Rendern von Header-Stil 2 } wenn (this.isExistArr(TBArr03, zb_code)) { this.tableHeaders = getTableHeader02_3(obj.zb_name) // Rendern von Header-Stil 3 } wenn (this.isExistArr(TBArr04, zb_code)) { this.tableHeaders = getTableHeader02_4(obj.zb_name) // Rendern von Header-Stil 4 } // API - Tabellendaten abrufengetTableList02(zb_code).then(res => { diese.tableData = res.data }) // Das DOM wurde noch nicht aktualisiert, der Code hier wird benötigt this.$nextTick(() => { // DOM ist jetzt aktualisiert this.dynamicTableShow = true }) }, // Klick [Abfrage] Ereignis handleQueryClick () { const zb_code = diese.angegebene_Tabelle // Überprüfen Sie, dass die Abfragebedingung nicht leer sein kann, wenn (zb_code === '' || zb_code === undefined) { this.$message.warning('Der Indikator darf nicht leer sein!') } anders { konsole.log('zb_code: ' + zb_code) // Kopfzeile und Tabelle neu rendern this.refreshTable(zb_code) } } } } </Skript> Die Verwendung der dynamischen Tabellenkomponente ist relativ einfach. Das einzige, worauf Sie achten müssen, ist, dass Sie beim Rendern der Tabellenüberschrift und -daten den folgenden Code hinzufügen müssen, da die Seite sonst nicht wie erwartet gerendert wird. dies.$nextTick(() => { // DOM ist jetzt aktualisiert this.dynamicTableShow = true }) Weitere Informationen zu this.$nextTick() finden Sie auf der offiziellen Website: https://cn.vuejs.org/v2/guide/reactivity.html #3# -> So fügen Sie dynamisch Sequenzspalten/Indexspalten nach Bedarf zu dynamischen Tabellen hinzuWenn Sie im offiziellen Beispiel von Element UI der Tabelle eine Seriennummernspalte oder eine Indexspalte hinzufügen müssen, ist das ganz einfach. Deklarieren Sie einfach eine spezielle <el-table-column> in <el-table>. <el-table-column Typ="index" Breite="50"></el-table-column> Wie fügt man also einer dynamischen Tabellenkomponente eine Spalte mit Seriennummern hinzu? Und was ist, wenn Sie es entsprechend Ihrem Bedarf hinzufügen oder nicht? Lassen Sie uns zunächst DynamicTable.vue transformieren Wie im offiziellen Beispiel deklarieren wir zuerst eine <el-table-column> in <el-table> <el-table-column v-if="isIndex" type="index" width="100" label="Seriennummer" align="center" /> Beachten Sie, dass ein v-if an einen isIndex-Wert gebunden ist. Dabei handelt es sich um den Schlüsselwert, den wir an die übergeordnete Komponente übergeben müssen. Deklarieren Sie isIndex als Boolean-Typ in Props Requisiten: { // Tabellendaten tableData: { Typ: Array, erforderlich: true }, // Mehrstufige Tabellenkopfdaten tableHeader: { Typ: Array, erforderlich: true }, // Die Höhe der Tabelle: { Typ: Zeichenfolge, Standard: „300“ }, // Müssen Sie eine Spalte mit Seriennummern hinzufügen? isIndex: { Typ: Boolean } } Wenn Sie Komponenten auf der Anzeigeseite verwenden, übergeben Sie die angegebenen Parameter über :is-index <dynamische-tabelle v-if="dynamischeTabellenanzeige" :table-data="Tabellendaten" :table-header="Tabellenüberschriften" :Höhe="'550px'" :ist-index="wahr" /> Wenn die Kopfzeile derselben Seite gewechselt werden muss, ist es bei der obigen Schreibmethode einfach, beim Initialisieren der Seite eine separate Seriennummernspalte anzuzeigen, wie unten gezeigt, was sehr unansehnlich ist Ich hoffe, dass die Seriennummernspalte gleichzeitig mit anderen normalen Spalten geladen werden kann, wenn der Tabellenkopf gerendert wird. Dies kann folgendermaßen erfolgen <dynamische-tabelle v-if="dynamischeTabellenanzeige" :table-data="Tabellendaten" :table-header="Tabellenüberschriften" :Höhe="'550px'" :is-index="istIndex hinzufügen" /> Ändern Sie die ursprüngliche Konstante „true“ in die Variable isAddIndex und ändern Sie deren Wert dann in „true“, wenn die Darstellung der Kopfzeile abgeschlossen ist. this.isAddIndex = true Auf diese Weise kann die Ordinalspalte gleichzeitig mit anderen normalen Spalten gerendert werden. 【Referenzen】 https://www.jianshu.com/p/9c4ba833658f https://www.cnblogs.com/llcdxh/p/9473458.html Dies ist das Ende dieses Artikels über den Beispielcode zur Implementierung dynamischer Tabellen in Element. Weitere relevante Inhalte zu dynamischen Tabellen von Element finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
>>: MySQL extrahiert zufällig eine bestimmte Anzahl von Datensätzen
Inhaltsverzeichnis 1. Ist setState synchron? asyn...
Inhaltsverzeichnis Vorwort 1. Die Bedeutung der K...
1. Einführung in Gitlab Offizielle Gitlab-Adresse...
Ergebnisse erzielen Schritt 1. Ursprüngliche inde...
Daten sind das wichtigste Kapital eines Unternehm...
Da die Nachfrage nach Front-End-Seiten weiter ste...
In diesem Artikelbeispiel wird der spezifische Co...
In diesem Artikel wird der detaillierte Vorgang z...
Die Wirkung dieser Funktion ist ähnlich wie vue的p...
Allgemeine Formulareingabeaufforderungen belegen ...
1. Herunterladen 1. Download-Adresse der offiziel...
1. Einfache Konfiguration der dynamischen und sta...
ZeicheneffekteImplementierungscode JavaScript var...
In diesem Artikelbeispiel wird der spezifische Co...
In diesem Artikel wird der spezifische Code von V...