Vue+Element implementiert Dropdown-Menü mit lokaler Suchfunktion – Beispiel

Vue+Element implementiert Dropdown-Menü mit lokaler Suchfunktion – Beispiel

brauchen:

Das Backend gibt ein Array-Objekt zurück, das auf dem Frontend zu einem Array kombiniert wird. Die Arrays werden entsprechend dem Namen zu Arrays kombiniert und der vom Backend zurückgegebene Wert wird als untergeordnetes Element in das Array eingefügt. Benutzerdefinierte Attribute werden verwendet, um Daten im Array zu sichern und zu verhindern, dass das ursprüngliche Array während der Suche geändert wird. Dadurch kann das Array nicht zurückgesetzt werden.

Bildbeschreibung hier einfügen
Bildbeschreibung hier einfügen

Hier kommt Vuex Storage zum Einsatz, da mehrere Seiten die gleiche Schnittstelle nutzen, sodass die Anfrage nicht wiederholt werden muss.
src\store\module\metadata.js

/*
 * @Autor: Ihr Name
 * @Datum: 2021-09-02 15:46:45
 * @LastEditTime: 2021-09-16 17:39:53
 * @LastEditors: Bitte LastEditors festlegen
 * @Description: Konsole-Datenzugriff-Floating-Menü* @FilePath: \vue-ui\src\store\module\metadata.js
 */
/**
 * Floating-Menüdaten zur Datenressourcenverwaltung */

importiere { Wird geladen, Nachricht } von 'element-ui'
importiere { apiManager } von '@/plugins/ajax'

let wird geladenInstance
konstanter Zustand = {
    alleListe: [],
    Navigationsliste: [],
    Name: {}
}
const Mutationen = {
    SET_NAVLIST: (Status, Liste) => {
        // Verwenden Sie Deep Copy, um Seitensuchfehler zu vermeiden state.navList = list.map(item => {
            wenn (Element.Kinder) {
                Element.backList = JSON.stringify(Element.Kinder)
            }
        })
    },
    SET_ALLLIST: (Status, Liste) => {
        Zustand.allList = Liste
    },
    SET_NAME: (Status, Objekt) => {
        Objekt.zuweisen(Status.Name, Objekt)
    }
}
const Aktionen = {
    requestMetadata({ commit, status }, { name, navList }) {
        gib ein neues Versprechen zurück (Auflösen => {
            const nameKey = Objekt.keys(Status.name)
            wenn (nameKey.indexOf(name) !== -1) {
                //Doppelte Anfragen verhindern resolve(state.name[name])
            } anders {
                loadingInstance = Wird geladen.service()
                Staat.Name[Name] = Name
                API-Manager
                    .post('/metadata/tableInfo/query')
                    .then(res => {
                        commit('SET_ALLLIST', res.data)
                        für (const i in res.data) {
                            const item = navList.find(v => v.name === i) //Gleiche den übergebenen Namen mit dem zurückgegebenen Schlüssel (Name) ab und füge ihn in if (item) { ein.
                                item.children = res.data[i] //Setze das Array unter jedem angeforderten Objekt zurück in das entsprechende Item.children item.navSearch = ''
                                item.backList = [] //Erstelle ein Backup, um Änderungen am Original-Array während der Suche zu verhindern}
                        }
                        commit('SET_NAVLIST', Navigationsliste)
                        commit('SET_NAME', { [name]: navList })
                        auflösen(navList)
                        wird geladenInstance.schließen()
                    })
                    .catch(err => {
                        lösen([])
                        wird geladenInstance.schließen()
                        Nachricht.Fehler(err)
                    })
            }
        })
    }
}

Standard exportieren {
    Namespace: wahr,
    Zustand,
    Mutationen,
    Aktionen
}

Die übergeordnete Seitenkomponente verwendet die untergeordnete Komponente
src\views\console\dataAccessManage\dataResourceTable\FileXs.vue

 <Übergangsname="Komponenten-Fade" Modus="Aus-Ein">
   <floating-menu v-show="isCollapse" :newList='navList' @getDatails='getDatails' />
</Übergang>
Daten() {
      zurückkehren {
          Navigationsliste: [
              {
                  imgSrc: erfordern('./../../../../../public/images/m6.png'),
                  Name: "ftp",
                  Typname: 'FTP-Server',
                  Kinder: [],
                  gesamt: 0
              },
              {
                  imgSrc: erfordern('./../../../../../public/images/m5.png'),
                  Name: "txt",
                  Typname: 'Dateiserver',
                  Kinder: [],
                  gesamt: 0
              }
          ],
          
   },
  asynchron gemountet() {
    konstanter Parameter = {
        Name: "fileXs",
        navList: diese.navList
    }
    // Vuex anfordern
    this.navlist = warte auf this.$store.dispatch('metadata/requestMetadata', param)
},

Unterkomponenten
src\views\console\dataAccessManage\components\floatingMenu.vue

<!--
 * @Autor: Ihr Name
 * @Datum: 2021-09-02 14:01:58
 * @LastEditTime: 2021-09-16 17:43:10
 * @LastEditors: Bitte LastEditors festlegen
 * @Description: Schwebendes Menü in der Datenressourcentabelle* @FilePath: \vue-ui\src\views\console\dataAccessManage\components\floatingMenu.vue
-->
<Vorlage>
    <div Klasse="data-sheet-main__nav" v-if="sjktcList.length || newList.length">
        <div>
            <div class="nav__item" v-for="(item,index) in sjktcList" :key="'info2-' + index">
                <div Klasse = "item_name sjk_name" :Klasse = "{ sjk_active: sjkActive == index }" @click = "sjktcShow(item.type,index)">{{item.typeName}}</div>
            </div>
        </div>
        <!-- Datei -->
        <el-collapse class="nav__item" v-model="activeNames">
            <el-collapse-item class="item_name" :title="item.typName" :name="item.typName" v-for="(item,index) in newList" :key="index">
                <ul Klasse="nav__item__list">
                    <li Klasse="Liste__li">
                        <el-input v-input-val-bg v-model="item.navSearch" @input="handleNavSearch(item)" prefix-icon="el-icon-search" size="mini" placeholder="Bitte geben Sie Schlüsselwörter ein" löschbar></el-input>
                    </li>
                    <li v-for="(Schlüssel,i) in Element.Kinder" :Schlüssel="i" :Klasse="{ 'list__li--active': Schlüssel.id == dbId }" Klasse="list__li" @click="getDatails(Schlüssel,Element)">
                        <span :title="Schlüssel.name" class="list--title">{{Schlüssel.name}}</span>
                        <span class="list--count">{{key.total || 0}}</span>
                    </li>
                    <li class="no-data" v-if="!item.children.length">Keine Daten</li>
                </ul>
            </el-collapse-item>
        </el-collapse>
    </div>
</Vorlage>
<Skript>
importiere { Entprellung } von '@/utils'
Standard exportieren {
    Name: "schwebendesMenü",
    Requisiten: {
        sjktcListe: {
            Typ: Array,
            Standard: () => []
        },
        neueListe: {
            Typ: Array,
            Standard: () => []
        }
    },
    Komponenten: {},
    Daten() {
        zurückkehren {
            sjkAktiv: 0,
            navSearch: '',
            navChildData: [],
            dbId: '',
            aktiveNamen: []
        }
    },
    montiert() {
    },
    Methoden: {
        // Klicken Sie auf den Inhalt in der Liste getDatails(args, db) {
            diese.dbId = args.id
            dies.$emit('getDatails', { args, db })
        },
        // eslint-disable-next-line-Leerzeichen-vor-Funktionsklammer
        handleNavSearch:Entprellung(Funktion (Objekt) {
            this.$forceUpdate()//Fehler bei der Zuweisung von Eingabefeldern verhindern const currlist = JSON.parse(obj.backList)
            wenn (obj.navSearch == '') {
                obj.children = currlist
            } anders {
                obj.children = currlist.filter(item => {
                    returniere item.name.toLowerCase().indexOf(obj.navSearch.toLowerCase()) != -1
                })
            }
        }, 100),
        sjktcShow(Typ, i) {
            dies.sjkActive = i
            dies.$emit('sjktcShow', [Typ])
        }
    },
    betrachten:
        neueListe: {
            tief: wahr,
            handler(Liste) {
                wenn (Liste) {
                    // Standardmäßig werden die 0 Menüs unter der erweiterten Liste aktiviert für (let i = 0; i < list.length; i++) {
                        const Element = Liste[i]
                        wenn (!this.dbId && item.children.length) {
                            this.activeNames = Artikel.TypName
                            this.getDatails(item.children[0], item) //Standardabfrage für den ersten Dateninhalt}
                    }
                }
            }
        }
    }
}
</Skript>
<style lang='scss' scoped>
.Datenblatt-Hauptnavigation {
    Breite: 180px;
    Position: absolut;
    oben: 0px;
    links: -190px;
    Z-Index: 100;
    Hintergrund: #fff;
    Rand: 1px durchgezogen #6579fe;
    Polsterung oben: 10px;
    .sjk_active {
        Farbe: $theme !wichtig;
    }
    .nav__item {
        Position: relativ;
        Rand unten: 15px;

        .Artikelname {
            Breite: 100 %;
            Anzeige: Inline-Block;
            Polsterung links: 17px;
            Schriftgröße: 14px;
            Zeilenhöhe: 24px;
            Farbe: rgba(0, 0, 0, 0,85);
            /deep/.el-collapse-item__header {
                Schriftstärke: fett;
                Rahmen unten: keiner;
                Position: relativ;
                Polsterung links: 15px;
                .el-collapse-item__arrow {
                    Position: absolut;
                    links: 0;
                    transformieren: drehen (270 Grad);
                }
                .el-collapse-item__arrow.ist-aktiv {
                    transformieren: drehen (90 Grad);
                }
            }

            &:schweben {
                Cursor: Zeiger;
            }
        }
        .keine-Daten {
            Textausrichtung: zentriert;
            Farbe: #999;
            Polsterung: 10px 0;
            Breite: 100 %;
        }
        img {
            Breite: 100 %;
            Höhe: 50px;
        }
        .nav__item--total {
            Position: absolut;
            Anzeige: Block;
            Breite: 30px;
            Höhe: 30px;
            Hintergrund: #fff;
            Rand: 1px durchgezogen #ccc;
            Randradius: 50 %;
            Zeilenhöhe: 30px;
            Rand: 1px durchgezogen #71b1ec;
            Kastenschatten: 0 3px 6px #156d90;
            Textausrichtung: zentriert;
            Farbe: #fd0b0b;
            Schriftgröße: 16px; /*nein*/
            oben: 0;
            rechts: 0;
            transformieren: übersetzen(25 %, -20 %);
        }
        .nav__item__list {
            Anzeige: Flex;
            maximale Höhe: 246px;
            Überlauf-y: automatisch;
            Flex-Wrap: Umwickeln;

            .list__li {
                Breite: 100 %;
                Rand oben: 5px;
                Zeilenhöhe: 30px;
                Polsterung: 0,6px, 0,17px;
                Position: relativ;
                Cursor: Zeiger;
                Farbe: #333;
                &:schweben {
                    Farbe: $blau;
                }
                .list--title {
                    Breite: 90px;
                    Überlauf: versteckt;
                    Textüberlauf: Auslassungspunkte;
                    Leerzeichen: Nowrap;
                    schweben: links;
                    &:schweben {
                        Farbe: #409eff;
                    }
                }
                .Liste--Anzahl {
                    Farbe: #46a0fc;
                    schweben: rechts;
                }
            }
            .list__li--aktiv {
                Farbe: $blau;
            }
        }
    }
    /deep/.el-collapse {
        oberer Rand: keiner;
    }
}
.Datenblatt-Hauptliste {
    biegen: 1;
    Rand links: 20px;
    .Listenkopfzeile {
        Flex-Richtung: Spalte;

        .Befehl {
            Textausrichtung: rechts;
            A {
                Hintergrund: #6579fe;
                Schriftfamilie: PingFangSC-Regular;
                Schriftgröße: 12px;
                Zeilenhöhe: 22px;
                Farbe: #ffffff;
                Polsterung: 6px;
                Rahmenradius: 4px;
            }
        }
    }
    .handler--fixed-right {
        Polsterung: 25px 10px;
    }
    .keine Daten {
        Textausrichtung: zentriert;
        Schriftgröße: 16px;
    }
}
</Stil>

Dies ist das Ende dieses Artikels über vue+element zur Implementierung eines Dropdown-Menüs mit lokaler Suchfunktion. Weitere relevante Suchinhalte für Dropdown-Menüs von vue element finden Sie in den vorherigen Artikeln von 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:
  • Vue3+Element+Ts implementiert grundlegende Such-Resets und andere Funktionen des Formulars
  • Vue + elementui realisiert Mehrfachauswahl- und Suchfunktionen der Dropdown-Tabelle
  • Vue elementui implementiert den Beispielcode der öffentlichen Komponentenkapselung der Suchleiste
  • Vue + Element realisiert die Hervorhebungsfunktion für Suchbegriffe
  • Vue-Elementgruppierung + Mehrfachauswahl + durchsuchbares Select-Selektor-Implementierungsbeispiel
  • So verwenden Sie Vue + Element, um Tabellenpaging und Front-End-Suche zu implementieren
  • Beispielcode für die Anzeigevorlage für die Remotesuche und Änderungsvorschläge der Vue Element-UI-Eingabe
  • VUE+Elemententwicklung Hintergrundverwaltung Suchfunktion

<<:  Detaillierte Erläuterung des MySQL-Redo-Logs (Redo-Log) und des Rollback-Logs (Undo-Log)

>>:  Verwendung des Linux-Befehls ipcs

Artikel empfehlen

Sperrt Mysql ALTER TABLE die Tabelle beim Hinzufügen von Feldern?

Inhaltsverzeichnis Vor MySQL 5.6 Nach MySQL 5.6 Z...

Lösung für FEHLER 1054 (42S22) beim Ändern des Passworts in MySQL 5.7

Ich habe MySQL 5.7 neu installiert. Beim Anmelden...

Acht Möglichkeiten zur Implementierung von Kommunikation in Vue

Inhaltsverzeichnis 1. Komponentenkommunikation 1....

Detaillierte Erklärung von PID und Socket in MySQL

Inhaltsverzeichnis 1. Einführung in die PID-Datei...

So erstellen Sie ein neues Image basierend auf einem vorhandenen Image in Docker

Das Erstellen neuer Images aus vorhandenen Images...

Einfache Anwendungsbeispiele für benutzerdefinierte MySQL-Funktionen

Dieser Artikel veranschaulicht anhand von Beispie...

Ein grafisches Tutorial zur Installation von MySQL unter Windows

Zusammenfassung: Dieser Artikel erläutert hauptsä...

Vue.js Leistungsoptimierung N Tipps (es lohnt sich, sie zu sammeln)

Inhaltsverzeichnis Funktionskomponenten Aufteilun...

Native JS realisiert einheitliche Bewegungen verschiedener Sportarten

In diesem Artikel wird eine einheitliche Bewegung...

js implementiert einen einfachen Rechner

Verwenden Sie natives JS, um einen einfachen Rech...

Prinzip und Implementierung der parallelen Replikation von MySQL5.7

Jeder, der ein wenig über Datenoperationen und -w...

Mysql NULL verursachte die Grube

Verwenden von NULL in Vergleichsoperatoren mysql&...

Dreißig HTML-Codierungsrichtlinien für Anfänger

1. HTML-Tags immer schließen Im Quellcode der vor...