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

Miniprogramm zur Implementierung des Slider-Effekts

In diesem Artikelbeispiel wird der spezifische Co...

Grundlegender JSON-Betriebsleitfaden in MySQL 5.7

Vorwort Aufgrund der Projektanforderungen werden ...

Einführung in das Enctype-Attribut des Form-Tags und seine Anwendungsbeispiele

Enctype: Gibt den Kodierungstyp an, der vom Browse...

Konfigurationsmethode für das Nginx-Anforderungslimit

Nginx ist ein leistungsstarker, leistungsstarker ...

Beispiel für die MySQL-Volltext-Fuzzy-Suche nach der Methode MATCH AGAINST

MySQL 4.x und höher bieten Unterstützung für die ...

Eine kurze Analyse der Verwendung der Zero-Copy-Technologie in Linux

In diesem Artikel werden mehrere wichtige Zero-Co...

Ändern Sie den Stil des HTML-Textkörpers in JS

Inhaltsverzeichnis 1. Ursprüngliche Definition 2....

So vergessen Sie das Root-Passwort in Mysql8.0.13 unter Windows 10

1. Stoppen Sie zuerst den MySQL-Dienst Öffnen Sie...