Implementierung von verschiebbaren Zeilen und Spalten sowie Auswahlspaltenkomponenten basierend auf der el-table-Kapselung

Implementierung von verschiebbaren Zeilen und Spalten sowie Auswahlspaltenkomponenten basierend auf der el-table-Kapselung

Wirkung

Brauchen Sie eine Umgebung

Ansicht
elementUI
Drag & Drop-Plugin Sortable.js

Erforderliche Konfigurationseigenschaften

Beispiel

<HTable
  :columns="Spalten"
  :data="Liste"
  :setColumn="wahr"
  tableKey="Kategorienliste"
  Stil="Breite: 100%"
  Grenze
>
  // Hier können Sie Slots einfügen <template slot="create_time" slot-scope="scope">
    {{ Umfang.Spalte.Label + Umfang.Item.Prop }}
  </Vorlage>
  <template slot="Aktion" slot-scope="Umfang">
    <el-button Typ="primär" @click="handleEdit(scope.row)" Größe="klein">
      Bearbeiten</el-button>
    <el-button @click="handleDelete(scope.row)" Typ="Gefahr" Größe="klein">
      Löschen</el-button>
  </Vorlage>
</HTable>
importiere HTable aus "@/components/HTable";

Standard exportieren {
  Komponenten: { HTable },
  Daten() {
    zurückkehren {
      Liste: [],
      Spalten: [
        {
          Bezeichnung: „ID“, // Beschreibungseigenschaft: „_id“, // Der eindeutige Wert der Spalte. Muss aktiviert sein: true // Ob diese Spalte angezeigt werden soll... // Einige el-table-column-Attribute können hier geschrieben werden},
        {
          Bezeichnung: "Kategoriename",
          Requisite: "Name",
          geprüft: true
        },
        {
          Bezeichnung: „Höhere Kategorie“,
          Eigenschaft: "parent.name",
          geprüft: true
        },
        {
          Bezeichnung: "Status",
          Requisite: "Status",
          Breite: "100",
          geprüft: true
        },
        {
          Beschriftung: „Erstellungszeit“,
          Eigenschaft: "Erstellungszeit",
          slotHeaderName: "create_time", // Benutzerdefinierter Header aktiviert: true
        },
        {
          Bezeichnung: "Operation",
          Requisite: "Aktion",
          fest: "richtig",
          "Mindestbreite": "100",
          slotName: "action", // Benutzerdefinierter Zellenslot aktiviert: true,
          deaktiviert: true
        }
      ]
    };
  }
};

Geben Sie mir einen Daumen hoch, wenn es nützlich ist! Angehängter Komponentencode

<Vorlage>
  <div Klasse="HTable">
    <div Klasse="Einstellungsfeld" v-if="Spalte festlegen">
      <el-popover
        Platzierung="unten"
        Auslöser="Klick"
        popper-class="EinstellungPopper"
      >
        <el-checkbox-gruppe
          v-Modell="Spalte auswählen"
          @change="Auswahlspalte ändern"
        >
          <el-Kontrollkästchen
            v-for="Element in Spalte"
            :Schlüssel="item.prop"
            :label="Artikel.Eigenschaft"
            :deaktiviert="Element.deaktiviert"
            Stil="Anzeige:Block;Zeilenhöhe:2;Rand rechts:0;"
            >{{ Artikel.Bezeichnung }}</el-checkbox
          >
        </el-checkbox-group>
        <i class="icon el-icon-setting" slot="Referenz"></i>
      </el-popover>
    </div>
    <el-Tabelle
      v-bind="$attrs"
      :data="Tabellendaten"
      v-on="$listeners"
      :Schlüssel="JSON.stringify(checkedCol)"
    >
      <el-table-column
        v-for="(Element, Index) in geprüfter Spalte"
        :Schlüssel="item.prop"
        v-bind="Artikel"
        :index="Index"
        :Spaltenschlüssel="item.prop"
      >
        <template v-if="item.slotHeaderName" v-slot:header="scope">
          <slot :name="Artikel.slotHeaderName" v-bind="Umfang" :Artikel="Artikel"></slot>
        </Vorlage>
        <template v-if="item.slotName" v-slot:default="Bereich">
          <slot :name="item.slotName" v-bind="scope"></slot>
        </Vorlage>
      </el-Tabellenspalte>
    </el-Tabelle>
  </div>
</Vorlage>

<Skript>
importiere Sortable von „sortablejs“;
Standard exportieren {
  Name: "HTable",
  Requisiten: {
    Tabellenschlüssel: Zeichenfolge,
    Spalten: {
      Typ: Array,
      Standard() {
        zurückkehren [];
      }
    },
    Daten: {
      Typ: Array,
      Standard() {
        zurückkehren [];
      }
    },
    Spalte festlegen: {
      Typ: Boolean,
      Standard: false
    }
  },
  betrachten:
    Spalten: {
      handler(neuerWert) {
        let localVal = this.getStorageCol();
        lass hotVal = [];
        wenn (localVal) {
          hotVal = this.dataDiff(neuerWert, lokalerWert);
        } anders {
          heißerWert = [...neuerWert];
        }
        diese.col = hotVal.map(
          (Element, Index) =>
            (Element = { ...Element, Index, aktiviert: Element.aktiviert || false })
        );
        dies.checkedCol = dies.checkedColFun(diese.col);
        Dies.selectCol = dies.checkedCol.map(item => (item = item.prop));
      },
      sofort: wahr
    },
    Daten: {
      handler(neuerWert) {
        this.tableData = [...neuerWert];
      },
      sofort: wahr
    },
    Spalte: {
      handler(neuerWert) {
        this.setStorageCol(neuerWert);
      },
      tief: wahr,
      sofort: wahr
    }
  },
  Daten() {
    zurückkehren {
      Tabellendaten: [],
      Spalte: [],
      geprüfte Spalte: [],
      Spalte auswählen: []
    };
  },

  montiert() {
    document.body.ondrop = Funktion(Ereignis) {
      event.preventDefault();
      event.stopPropagation();
    };
    dies.$nextTick(() => {
      dies.rowDrop();
      diese.columnDrop();
    });
  },
  Methoden: {
    drap() {
      dies.$nextTick(() => {
        dies.rowDrop();
        diese.columnDrop();
      });
    },

    handleÄndernAuswahlSpalte() {
      diese.col.forEach(item => {
        wenn (this.selectCol.includes(item.prop)) {
          Element.geprüft = wahr;
        } anders {
          Element.geprüft = falsch;
        }
      });
      dies.checkedCol = dies.checkedColFun(diese.col);
      dies.drap();
    },

    ZeileDrop() {
      const tbody = document.querySelector(".el-table__body-wrapper tbody");
      Sortable.create(tbody, {
        am Ende: ({ neuerIndex, alterIndex }) => {
          [diese.tableData[neuerIndex], diese.tableData[alterIndex]] = [
            this.tableData[alterIndex],
            diese.tableData[neuerIndex]
          ];
          dies.drap();
          dies.$emit("dropRow", {
            drapRow: this.tableData[alterIndex],
            Zielzeile: this.tableData[neuerIndex],
            drapRowIndex: alterIndex,
            targetRowIndex: neuerIndex,
            Daten: this.tableData
          });
        }
      });
    },
    SpalteDrop() {
      const wrapperTr = document.querySelector(".el-table__header-wrapper tr");
      Sortable.create(wrapperTr, {
        Animation: 180,
        Verzögerung: 0,
        am Ende: ({ neuerIndex, alterIndex }) => {
          const oldItem = this.checkedCol[alterIndex];
          const newItem = this.checkedCol[neuerIndex];
          [diese.col[neuesElement.index].index, diese.col[altesElement.index].index] = [
            alterArtikel.index,
            neuesElement.index
          ];
          diese.col.sort((a, b) => {
            gibt a.index - b.index zurück;
          });
          dies.checkedCol = dies.checkedColFun(diese.col);
          diese.tableData = diese.tableData.slice(0, diese.tableData.length);
          dies.drap();
          dies.$emit("dropCol", {
            colItem: altesItem,
            neuerIndex: neuerIndex,
            alterIndex: alterIndex,
            Spalte: this.checkedCol
          });
        }
      });
    },
    geprüftColFun(arr) {
      gibt arr.filter zurück (Element => Element.geprüft);
    },
    setStorageCol(Daten) {
      wenn (dieser.Tabellenschlüssel && Daten && Datenlänge > 0) {
        localStorage.setItem("HTable-" + this.tableKey, JSON.stringify(data));
      }
    },
    getStorageCol() {
      let datajson = localStorage.getItem("HTable-" + this.tableKey);
      datajson zurückgeben? JSON.parse(datajson) : "";
    },
    Datendifferenz(neuerWert, lokalerWert) {
      sei nl = neuerWert.Länge;
      sei ll = localVal.length;
      wenn (nl != ll) {
        gibt neuen Wert zurück;
      } anders {
        Lassen Sie np = newVal.map(item => item.prop).sort();
        let lp = localVal.map(item => item.prop).sort();
        wenn (np.join() != lp.join()) {
          gibt neuen Wert zurück;
        } anders {
          sei nnl = [];
          für (lass i = 0; i < localVal.length; i++) {
            const item_l = localVal[i];
            für (let j = 0; j < newVal.length; j++) {
              const item_n = neuerWert[j];
              wenn (item_l.prop === item_n.prop) {
                nnl.push({
                  ...Artikel_n,
                  Index: item_l.index
                });
              }
            }
          }
          Rückgabe nnl;
        }
      }
    }
  }
};
</Skript>

<style lang="less" scoped>
.HTable {
  Position: relativ;
  .EinstellungsBox {
    Breite: 36px;
    Höhe: 36px;
    Rahmenradius: 2px;
    Rand: 1px durchgezogen #ebeef5;
    Rahmen unten: 0;
    Rand links: automatisch;
    Position: relativ;
    .Symbol {
      Position: absolut;
      oben: 0;
      links: 0;
      Z-Index: 1;
      Breite: 36px;
      Höhe: 36px;
      Textausrichtung: zentriert;
      Schriftgröße: 20px;
      Zeilenhöhe: 36px;
      Farbe: #909399;
      Cursor: Zeiger;
    }
  }
}
</Stil>
<style lang="less">
.EinstellungPopper {
  Mindestbreite: 100px !wichtig;
}
</Stil>

Dies ist das Ende dieses Artikels über die Implementierung von verschiebbaren Zeilen und Spalten und Auswahlspaltenkomponenten basierend auf der El-Table-Kapselung. Weitere relevante El-Table-Zeilen und -Spalten finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die folgenden verwandten Artikel weiter. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung der drei Möglichkeiten zum Umbrechen von Text in der El-Table-Kopfzeile
  • el-table in vue realisiert automatischen Deckeneffekt (unterstützt feste)
  • Vue+el-table realisiert das Zusammenführen von Zellen
  • vue realisiert die Anpassung der Spaltenbreite von el-table perfekt
  • Sekundäre Kapselung des Elements el-table table (mit Tischhöhenanpassung)
  • vue verwendet sortable, um die Drag & Drop-Sortierfunktion von el-table zu implementieren
  • 4 Möglichkeiten, den el-table-Stil von Element in Vue zu ändern
  • vue+element ruft den Index einer Zeile in el-table ab und bearbeitet das Array-Objekt entsprechend dem Index
  • vue el-table implementiert benutzerdefinierte Tabellenkopfzeilen
  • Vue el-table realisiert Inline-Bearbeitungsfunktion

<<:  【HTML-Element】So betten Sie Bilder ein

>>:  Einige Kenntnisse über die absolute und relative Positionierung von Seitenelementen

Artikel empfehlen

Vollständiger Code zur Implementierung der Vue-Backtop-Komponente

Wirkung: Code: <Vorlage> <div Klasse=&qu...

Der gesamte Prozess der Konfiguration von Hive-Metadaten für MySQL

Gehen Sie im Hive-Installationsverzeichnis in das...

So konfigurieren Sie mehrere Tomcats mit Nginx-Lastausgleich unter Linux

Die Methoden zur Installation von Nginx und mehre...

Anwendungsverschachtelung von HTML-ul-ungeordneten Tabellen

Anwendungsschachtelung ungeordneter Listen Code ko...

CentOS-Methode zum Ändern der Standard-SSH-Portnummer – Beispiel

Die Standard-SSH-Portnummer von Linux-Servern ist...

So generieren Sie PDFs und laden sie im Vue-Frontend herunter

Inhaltsverzeichnis 1. Installation und Einführung...

Analysieren Sie, wie Sie automatisch Vue-Komponentendokumentation generieren

Inhaltsverzeichnis 1. Aktuelle Situation 2. Commu...

Details zu den Überwachungseigenschaften der Uhr in Vue

Inhaltsverzeichnis 1.watch überwacht Änderungen i...

Details zum MySQL-Index-Pushdown

Inhaltsverzeichnis 1. Prinzip des ganz linken Prä...

Wie stelle ich Tomcat als automatisch gestarteten Dienst ein? Der schnellste Weg

Stellen Sie Tomcat so ein, dass der Dienst automa...

JavaScript zum Erzielen eines Fensteranzeigeeffekts

In diesem Artikel wird der spezifische JavaScript...