Vue Element UI-Komponente für benutzerdefinierte Beschreibungsliste

Vue Element UI-Komponente für benutzerdefinierte Beschreibungsliste

In diesem Artikelbeispiel wird der spezifische Code der benutzerdefinierten Beschreibungslistenkomponente der Vue Element UI zu Ihrer Information geteilt. Der spezifische Inhalt ist wie folgt

Rendern

Vorne geschrieben

Beim Schreiben von Backend-Management klicken wir häufig auf die Liste, um Details anzuzeigen und Dateninformationen anzuzeigen. Obwohl Element UI eine Tabellenkomponente hat, hat es keine Beschreibungskomponente. Bisher mussten Teammitglieder in dieser Situation ihre eigenen Stile schreiben, was mühsam zu schreiben war, und die von jeder Person geschriebenen Stile waren nicht einheitlich, was den Gesamtstil des Projekts zerstörte.
Ant Design UI verfügt beispielsweise über eine Beschreibungskomponente, die sehr komfortabel zu verwenden ist, deshalb habe ich einfach selbst eine geschrieben, indem ich el-row und el-col von Element UI kombiniert habe.

Welche Funktionen sind implementiert

1. Die Höhe jeder Zeile wird automatisch entsprechend der maximalen Höhe einer Spalte in der Zeile erweitert.
2. Spaltenbreite automatisch vervollständigen, um zu vermeiden, dass die letzte Spalte unvollständig ist
3. Unterstützt Nur-Text- und HTML-Slots
4. Unterstützt die Einstellung mehrerer Spalten pro Zeile
5. Unterstützt die Anpassung jeder Spaltenbreite
6. Unterstützt dynamisches Neuzeichnen von Daten

Komponentendesign

1. Verwenden Sie die Verschachtelung von übergeordneten und untergeordneten Komponenten. Die übergeordnete Komponente ist e-desc und die untergeordnete Komponente ist e-desc-item.
2. e-desc-item übergibt das Label der Props und den Wert des Slots und verwendet $slots.content zur Anzeige des DOM
3. Verwenden Sie el-row und el-col, um das gesamte Komponentenlayout zu implementieren

Kapseln Sie E-Desc-Komponenten ein

<Vorlage>
  <div Klasse="desc" :style="{margin}">
    <!-- Titel -->
    <h1 v-if="Titel" Klasse="desc-Titel" v-html="Titel"></h1>
    <el-row Klasse="desc-row">
      <Steckplatz/>
    </el-row>
  </div>
</Vorlage>

<Skript>
Standard exportieren {
  Name: "EDesc",
  // Wird den untergeordneten Komponenten über provide () { zur Verfügung gestellt.
    zurückkehren {
      Beschriftungsbreite: diese.Beschriftungsbreite,
      Spalte: diese.Spalte,
      Größe: diese.Größe
    }
  },
  Requisiten: {
    // Datenquelle, Daten abhören und Daten neu zeichnen: {
      Typ: Objekt,
      erforderlich: wahr,
      Standard () {
        zurückkehren {}
      }
    },
    // Titel: {
      Typ: Zeichenfolge,
      Standard: ''
    },
    // Marge: {
      Typ: Zeichenfolge,
      Standard: „0“
    },
    // Etikettenbreite labelWidth: {
      Typ: Zeichenfolge,
      Standard: „120px“
    },
    Spalte: {
      // Die Anzahl der angezeigten Elemente pro Zeilentyp: [Zahl, Zeichenfolge],
      Standard: 3
    },
    Größe: {
      // Größentyp: String,
      Standard: ''
    }
  },
  betrachten:
    Daten: {
      handler () {
        dies.$nextTick(() => {
          // Filtern Sie die Unterkomponente e-desc-item heraus
          const dataSource = this.$slots.default
          const Datenliste = []
          dataSource.fürJedes(item => {
            wenn (item.componentOptions && item.componentOptions.tag === 'e-desc-item') {
              dataList.push(Element.Komponenteninstanz)
            }
          })
          // Verbleibende Spanne
          let leftSpan = diese.Spalte
          const len ​​= dataList.length
          dataList.forEach((item, index) => {
            // Behandeln Sie die Beziehung zwischen Spalte und Spanne // Die Anzahl der verbleibenden Spalten ist kleiner als die festgelegte Anzahl von Spannen const hasLeft = leftSpan <= (item.span || 1)
            // Die nächste Spalte der aktuellen Spalte ist größer als der verbleibende Bereich
            const nextColumnSpan = (index < (länge - 1)) && (datenliste[index + 1].span >= leftSpan)
            // Die letzte Spalte der letzten Zeile const isLast = index === (len - 1)
            wenn (hasLeft || nextColumnSpan || isLast) {
            // Wenn die oben genannten Bedingungen erfüllt sind, muss span automatisch vervollständigt werden, um zu vermeiden, dass die letzte Spalte unvollständig ist item.selfSpan = leftSpan
              leftSpan = diese.Spalte
            } anders {
              leftSpan -= item.span || 1
            }
          })
        })
      },
      tief: wahr,
      sofort: wahr
    }
  }
}
</Skript>

<style scoped lang="scss">
  .desc{
    .desc-Titel {
      Rand unten: 10px;
      Farbe: #333;
      Schriftstärke: 700;
      Schriftgröße: 16px;
      Zeilenhöhe: 1,5715;
    }
    .desc-Zeile{
      Anzeige: Flex;
      Flex-Wrap: Umwickeln;
      Rahmenradius: 2px;
      Rand: 1px durchgezogen #EBEEF5;
      Rahmen unten: 0;
      Rand rechts: 0;
      Breite: 100 %;
    }
  }
</Stil>

Kapseln Sie die e-desc-item-Komponente ein

<Vorlage>
  <el-col :span="computedSpan" class="desc-item">
    <div Klasse="desc-item-content" :Klasse="Größe">
      <label class="desc-item-label" :style="{width: labelWidth}" v-html="label"></label>
      <div Klasse="desc-item-value" v-if="$slots">
        <!-- Klartext -->
        <slot v-if="$slots.default && $slots.default[0].text"/>
        <!-- HTML -->
        <slot name="Inhalt" v-else-if="$slots.content"/>
        <span v-else>Keine Daten</span>
      </div>
    </div>
  </el-col>
</Vorlage>

<Skript>
Standard exportieren {
  Name: 'EDescItem',
  einfügen: ['Beschriftungsbreite', 'Spalte', 'Größe'],
  Requisiten: {
    Spanne: {
      Typ: [Zahl, Zeichenfolge],
      erforderlich: false,
      Standard: 0
    },
    Etikett: {
      Typ: Zeichenfolge,
      erforderlich: false,
      Standard: ''
    }
  },
  Daten () {
    zurückkehren {
      // Der eigene Span der Unterkomponente
      selbstSpan: 0
    }
  },
  berechnet: {
    berechneteSpanne() {
      // Der eigene Span der untergeordneten Komponente wird von der übergeordneten Komponente verwendet, um den Span zu berechnen und zu ändern
      wenn (this.selfSpan) {
        return 24 / diese.Spalte * diese.selfSpan
      } sonst wenn (diese.span) {
      // Spanne, die von Requisiten übergeben wird
        returniere 24 / diese.Spalte * diese.Spanne
      } anders {
      // Wenn die Spanne nicht überschritten wird, nimm die Spalte
        returniere 24 / diese.Spalte
      }
    }
  }
}
</Skript>

<style scoped lang="scss">
  .desc-Element {
    Rahmen rechts: 1px durchgezogen #EBEEF5;
    Rahmen unten: 1px durchgezogen #EBEEF5;
    .desc-Artikel-Inhalt {
      Anzeige: Flex;
      Inhalt ausrichten: Flex-Start;
      Elemente ausrichten: zentrieren;
      Farbe: rgba(0,0,0,.65);
      Schriftgröße: 14px;
      Zeilenhöhe: 1,5;
      Breite: 100 %;
      Hintergrundfarbe: #fafafa;
      Höhe: 100%;
      .desc-Elementbezeichnung{
        Rahmen rechts: 1px durchgezogen #EBEEF5;
        Anzeige: Inline-Block;
        Polsterung: 12px 16px;
        Flex-Wachstum: 0;
        Flex-Schrumpfen: 0;
        Farbe: rgba(0, 0, 0, 0,6);
        Schriftstärke: 400;
        Schriftgröße: 14px;
        Zeilenhöhe: 1,5;
        Höhe: 100%;
        Anzeige: Flex;
        Elemente ausrichten: zentrieren;
      }
      .desc-Artikel-Wert{
        Hintergrund: #fff;
        Polsterung: 12px 16px;
        Flex-Wachstum: 1;
        Überlauf: versteckt;
        Wörtertrennung: alles trennen;
        Höhe: 100%;
        Anzeige: Flex;
        Elemente ausrichten: zentrieren;
        Farbe: #444;
        Spanne{
          Farbe: #aaa;
        }
      }
      &.klein {
        .desc-Artikelbezeichnung,
        .desc-Artikel-Wert {
          Polsterung: 10px 14px;
        }
      }
    }
  }
</Stil>

Anwendung

<Vorlage>
  <e-desc: Daten = "Info" Rand = "0 12px" Beschriftungsbreite = "100px">
    <e-desc-item label="Name">{{info.name}}</e-desc-item>
    <e-desc-item label="Alter">{{ info.age }} Jahre alt</e-desc-item>
    <e-desc-item label="Geschlecht">{{ info.sex }}</e-desc-item>
    <e-desc-item label="Schule">{{ info.school }}</e-desc-item>
    <e-desc-item label="Professionell">{{ info.major }}</e-desc-item>
    <e-desc-item label="Hobby">{{ info.hobby }}</e-desc-item>
    <e-desc-item label="Mobiltelefonnummer">{{ info.phone }}</e-desc-item>
    <e-desc-item label="Kontakt">{{ info.wx }}</e-desc-item>
    <e-desc-item label="QQ">{{ info.qq }}</e-desc-item>
    <e-desc-item label="Adresse">{{ info.address }}</e-desc-item>
    <e-desc-item label="Selbstbeschreibung" :span='2'>{{ info.intro }}</e-desc-item>
    <e-desc-item label="Vorgang" :span='3'>
      <Vorlagenslot="Inhalt">
        <el-button size="small" type="primary">Ändern</el-button>
        <el-button size="small" type="danger">Löschen</el-button>
      </Vorlage>
    </e-desc-item>
  </e-desc>
</Vorlage>

<Skript>
importiere EDesc aus './e-desc'
EDescItem aus „./e-desc-item“ importieren
Standard exportieren {
  Komponenten:
    EDesc, EDescItem
  },
  Daten () {
    zurückkehren {
      Info:
        Name: 'Jerry',
        Alter: 26,
        Geschlecht: 'männlich',
        Schule: 'Sichuan University',
        Hauptfach: 'Professioneller Programmierer',
        Adresse: „Chengdu, Provinz Sichuan“,
        Hobby: 'Steine ​​bewegen, Front-End, Geld verdienen',
        Telefon: 18888888888,
        wx: 'Nice2cu_Hu',
        QQ: 332983810,
        Intro: „Ich bin Maler und ich kann gut malen.“ Ich möchte das neue Haus streichen, um es schöner zu machen. Nachdem er das Dach gestrichen hatte, strich er die Wand, wobei der Pinsel fleißig umherflog. Oh meine kleine Nase, sie hat sich verändert. Ich bin Maler und verfüge über ausgeprägte malerische Fähigkeiten. Ich möchte das neue Haus streichen, um es schöner zu machen. Nachdem er das Dach gestrichen hatte, strich er die Wand, wobei der Pinsel fleißig umherflog. Oh meine kleine Nase, sie hat sich verändert. '
      }
    }
  }
}
</Skript>

Parameter Beschreibung

An diesem Punkt ist der Code fertig. Wenn es Unklarheiten oder Fehler gibt, hinterlassen Sie mir bitte eine Nachricht, um mich darüber zu informieren.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Implementierung des Element-UI-Layouts (Zeilen- und Spaltenkomponenten)
  • Element-UI-Tutorial zur Verwendung des el-row-Spaltenlayouts
  • Detaillierte Erklärung der Layoutkomponente „el-row“ und „el-col“ des Elements

<<:  Detaillierte Schritte zur Dateisteuerungsverwaltung für Linux-Konten

>>:  Tutorial zur Verwendung von Profilen in MySQL

Artikel empfehlen

Implementierungsbeispiel für den Linux-Befehl „tac“

1. Befehlseinführung Der Befehl tac (umgekehrte R...

Verwenden Sie Vue3 zur Datenbindung und Anzeigelistendaten

Inhaltsverzeichnis 1. Vergleich mit Vue2 1. Neue ...

Beispiel zum Hochladen eines Docker-Images in ein privates Repository

Das Image kann problemlos direkt in das öffentlic...

Webdesign-Tutorial (8): Webseitenhierarchie und Raumgestaltung

<br />Vorheriger Artikel: Webdesign-Tutorial...

So verwenden Sie Cursor-Trigger in MySQL

Cursor Die von der Auswahlabfrage zurückgegebenen...

Join-Operation in MySQL

Arten von Verknüpfungen 1. Innerer Join: Die Feld...

Einführung in JavaScript-Array-Deduplizierungs- und -Flatteningfunktionen

Inhaltsverzeichnis 1. Array-Abflachung (auch als ...

So exportieren Sie die MySQL-Tabellenstruktur nach Excel

Die Voraussetzungen sind wie folgt Exportieren Si...

calc(), um einen Vollbild-Hintergrundinhalt mit fester Breite zu erreichen

In den letzten Jahren gab es im Webdesign einen T...

Probleme bei der Ausführungsreihenfolge von AND und OR in SQL-Anweisungen

Frage Beim Schreiben von Datenbank-SQL ist mir ge...