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

Datenstruktur - Baum (III): Mehrweg-Suchbaum B-Baum, B+ Baum

Mehrweg-Suchbaum Höhe eines vollständigen Binärba...

Beispielcode zur Implementierung des Bildschubladeneffekts mit CSS3

Wie üblich posten wir zuerst den Bildeffekt: Das ...

Vue kapselt die öffentliche Funktionsmethode zum Exportieren von Excel-Daten

vue+element UI kapselt eine öffentliche Funktion ...

Fassen Sie die häufigsten Anwendungsprobleme von XHTML-Code zusammen

<br />Ich habe festgestellt, dass viele Leut...

Einführung in die Verwendung des MySQL pt-slave-restart-Tools

Inhaltsverzeichnis Beim Einrichten einer MySQL-Ma...

So installieren und konfigurieren Sie Redis in CentOS7

Einführung Es ist nicht nötig, Redis im Detail vo...

Tutorial zur Installation von MySQL 5.6 auf CentOS 6.5

1. Laden Sie das RPM-Paket für Linux herunter htt...

Die am häufigsten verwendeten HTML-Tags zum Erstellen von Webseiten

1. Optimierung häufig verwendeter HTML-Tags HTML ...

Detaillierte Erläuterung der MySQL Master-Slave-Datenbankkonstruktionsmethode

Dieser Artikel beschreibt, wie man eine MySQL Mas...

Videojs+Swiper realisiert Taobao-Produktdetailkarussell

In diesem Artikel wird der spezifische Code von v...

So erstellen Webdesigner Bilder für Retina-Displays

Besonderer Hinweis: Dieser Artikel wurde basieren...

JS-Funktionsaufruf, Anwenden und Binden einer superdetaillierten Methode

Inhaltsverzeichnis JS-Funktionsaufruf, Apply- und...