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

So konfigurieren Sie gängige Software unter Linux

Wenn Sie einen neuen Linux-Server bekommen, müsse...

CSS3 verwendet var()- und calc()-Funktionen, um Animationseffekte zu erzielen

Wissenspunkte in der Vorschau anzeigen. Animation...

Probleme und Lösungen bei der Installation von Mininet auf Ubuntu 16.04.4LTS

Mininet Mininet ist eine leichtgewichtige, softwa...

Details zu Linux-Dateideskriptoren, Dateizeigern und Inodes

Inhaltsverzeichnis Linux - Dateideskriptor, Datei...

Zusammenfassung der unbekannten Verwendung von "!" in Linux

Vorwort Tatsächlich gibt es für das bescheidene „...

Einführung in den Aufbau eines DNS-Servers unter centos7

Inhaltsverzeichnis 1. Projektumgebung: 2: DNS-Ser...

Vollständige MySQL-Lernhinweise

Inhaltsverzeichnis MyISAM und InnoDB Gründe für L...

Beispielcode zur Implementierung eines Radardiagramms mit vue+antv

1. Abhängigkeit herunterladen npm installiere @an...

Webdesign-Tutorial (2): Über Nachahmung und Plagiat

<br />Im vorherigen Artikel habe ich die Sch...

Detaillierte Erklärung des MySQL-Sicherungsprozesses mit Xtrabackup

Inhaltsverzeichnis 01 Hintergrund 02 Einleitung 0...

Was bei der Migration von MySQL auf 8.0 zu beachten ist (Zusammenfassung)

Passwortmodus PDO::__construct(): Der Server hat ...

JavaScript zum Erzielen eines Texterweiterungs- und -reduzierungseffekts

Die Implementierung des Erweiterns und Reduzieren...

Zusammenfassung der 7 Protokolltypen in MySQL

In MySQL gibt es folgende Protokolldateien: 1: Pr...