Das Eingeben von Ausdrücken in das Eingabefeld ist ein gängiges Szenario in Middle-Office-Projekten. Normalerweise wird eine Dropdown-Liste angezeigt, wenn ein bestimmtes Zeichen (z. B. $) eingegeben wird. Der Benutzer klickt auf die Variable in der Dropdown-Liste und gibt dann weitere Operatoren in das Eingabefeld ein, um einen Ausdruck zu bilden. Der Effekt ist wie unten dargestellt: Im vorherigen Projekt wurde React + TypeScrpt verwendet, um die React-Version des variablen Ausdrucksselektors zu implementieren. In diesem Artikel stellen wir vor, wie man einen variablen Ausdrucksselektor mit Vue implementiert. Dieser variable Ausdruck erzielt die folgenden Effekte:
Definieren der HTML-StrukturDa der vorhandene Selektor nicht den gewünschten Effekt erzielen kann, müssen wir selbst einen Selektor implementieren. Verwenden Sie das Eingabetag als Eingabefeld unseres Auswahlselektors und das ul-li-Tag als Dropdown-Liste des Auswahlselektors. Die grundlegende HTML-Struktur ist wie folgt: <div Klasse="AusdrucksContainer"> <Eingabe /> <div v-if="sichtbar" class="AusdrucksListBox"> <ul Klasse="AusdruckUlBox"> <li></li> </ul> </div> </div> Eingabe-Tag-BindungsattributeWenn Sie in Vue Referenzinformationen für ein Element oder eine Unterkomponente registrieren möchten, müssen Sie das Ref-Attribut hinzufügen. Die mit ref registrierten Referenzinformationen werden im Refs-Objekt der übergeordneten Komponente registriert. Das zu bedienende Element oder die Unterkomponente kann über das Refs-Objekt gefunden werden. Daher fügen wir dem Input-Tag das Ref-Attribut hinzu. <input ref="EingabeRef" /> Zusätzlich zum Hinzufügen des Ref-Attributs zum Eingabetag müssen Sie auch Ereignisse an das Eingabetag binden. In Vue verwenden Sie normalerweise v-on (Abkürzung: @), um Ereignisse zu binden. Wir binden Unschärfe-, Tastendruck- und Eingabeereignisse an das Eingabetag. <Eingabe ref="EingabeRef" v-Modell="Ausdruckswert" Klasse = "Ant-Eingabe" :readOnly="Nur lesen ? true : false" autoComplete="aus" :Platzhalter="Platzhalter" @blur="EingabeBeiBlurHandle" @keydown="Eingabe bei Tastendruck" @change="beiÄnderungsHandle" @input="beiInputHandle" /> Der Input-Tag wartet auf Keydown-EreignisseBinden Sie das Keydown-Ereignis an das Eingabe-Tag und achten Sie auf die zu diesem Zeitpunkt gedrückten Tastaturtasten. Wenn gleichzeitig Umschalt + $ gedrückt wird, wird eine Dropdown-Liste angezeigt, der aktuelle Wert im Eingabefeld wird gespeichert und das Eingabe-Tag wird auf nicht bearbeitbar gesetzt, sodass nur Inhalt aus der Dropdown-Liste ausgewählt werden kann. Die an keydown gebundene Ereignisbehandlungsfunktion lautet wie folgt: // Eingabefeld Keydown-Ereignis inputOnKeyDownHandle(e) { // Drücken Sie gleichzeitig die Tasten Umschalt + $, wenn (e.keyCode === 52 && e.shiftKey) { // Den Wert des Eingabefelds abrufen const expressValue = e.target.value; dies.setInputValue(expressValue); // Aktuelle Cursorposition abrufen const position = getPositionForInput(this.$refs.inputRef); // Die Startposition des aktuellen Cursors const cursorIndex = position.start; // Setzt die Cursorposition auf die Bereichseigenschaft der Eingabe // updateRange(this.$refs.inputRef); // Startposition des Cursors speichern this.saveCursorIndex({ start: cursorIndex }); // Legen Sie fest, dass das Dropdown-Auswahlfeld angezeigt werden soll. this.setSelectedBoxVisible(true); // Legen Sie fest, dass das Eingabetag nicht bearbeitet werden kann und nur die Auswahl aus der Dropdown-Liste zulässig ist. this.setInputIsReadonly(true); } }, Li-Tag-BindungsattributeDer Auswahlselektor wird mithilfe des ul-li-Tags implementiert. Wenn wir eine Dropdown-Option auswählen, müssen wir mit dem li-Tag arbeiten. Daher müssen wir dem li-Tag ein ref-Attribut sowie Klick- und Tastendruckereignisse hinzufügen und die data-*-Attribute von HTML5 verwenden, um den Optionswert zu speichern. <ul ref="ulRef" Klasse="AusdruckUlBox"> <li v-for="(Element, Index) in Optionen" ref="liRef" :Schlüssel="Artikel.Feld" :Datensatz="Artikel" :data-index="Index" :Datenwert="Artikel.Feld" tabindex="0" @click="liKlickHandle" @keydown="liKeyDownHandle" > {{ Artikelname }} </li> </ul> li-Tag bekommt Fokus
In dem von uns implementierten Auswahlselektor müssen wir zum Wechseln der Optionswerte die Auf- und Ab-Tasten auf der Tastatur verwenden. Daher müssen wir dem Tag „li“ das Attribut „tabindex“ hinzufügen, damit „li“ die Ereignisse „onfocus“ und „onblur“ auslösen kann. <li tabindex="0"></li> Globaler Tastaturereignis-ListenerDas globale Überwachen von Tastaturereignissen bedeutet eigentlich, die Ereignisse an das Dokument zu binden. Wir hören im erstellten Lebenszyklus-Hook auf Tastaturereignisse. Wenn die aktuell gedrückte Taste die Auf- oder Ab-Taste ist, können die Dropdown-Optionen mithilfe der Auf- oder Ab-Taste umgeschaltet werden. erstellt() { const _this = dies; dokument.onkeydown = Funktion () { const Schlüssel = Fenster.Ereignis.Schlüsselcode; // Tasten hoch und runterif (key === 38 || key === 40) { _this.upAndDownKeySwitch(Schlüssel); } //Linke und rechte Tasten, sonst wenn (Taste === 39 || Taste === 37) { // _this.leftAndRightKeySwitch(Schlüssel); } }; }, Die Verarbeitungslogik zum Umschalten der Dropdown-Auswahloptionen über die Auf- und Ab-Tasten auf der Tastatur lautet wie folgt: // Auswahl der Auf- und Ab-Tasten auf der Tastatur Ausdruck upAndDownKeySwitch(Taste) { const liNodes = this.$refs.liRef; const liLength = liNodes.length; // Dw Pfeiltaste if (liNodes && liLength && key === 40) { Konstante Anzahl = this.arrowCount.dwArrow === liLength - 1 ? 0 : diese.arrowCount.dwArrow + 1; //Setze Padding um das Problem zu lösen, dass das erste li nicht im sichtbaren Bereich angezeigt werden kann, wenn es den Fokus erhält if (liLength > 1) { wenn (Anzahl === 0) { dies.$refs.ulRef.style.padding = "40px 0 10px 0"; } anders { dies.$refs.ulRef.style.padding = "10px 0"; } } // Das aktuelle li-Element erhält den Fokus liLength && liNodes[count].focus(); // Setze den ScrollTop von ul so, dass das aktuell fokussierte li-Element im sichtbaren Bereich angezeigt wird, if (count === liLength - 1) { //Lösen Sie das Problem, dass das letzte li-Element nicht im sichtbaren Bereich angezeigt werden kann. this.$refs.ulRef.scrollTop = count * 40; } anders { dies.$refs.ulRef.scrollTop = Anzahl * 10; } // Speichert den Zählstatus im Inhaltsstatus der Komponente this.arrowCount = { upArrow: count, dwArrow: count }; } // Pfeiltaste nach oben if (liNodes && liLength && key === 38) { Konstante Anzahl = dieser.arrowCount.upArrow <= 0 ?liLänge - 1 : dieser.arrowCount.upArrow - 1; //Setze Padding um das Problem zu lösen, dass das erste li nicht im sichtbaren Bereich angezeigt werden kann, wenn es den Fokus erhält if (liLength > 1) { wenn (Anzahl === liLength - 1) { dies.$refs.ulRef.style.padding = "10px 0 40px 0"; } anders { dies.$refs.ulRef.style.padding = "10px 0"; } } // Das aktuelle li-Element erhält den Fokus liNodes[count].focus(); //Setzen Sie das ScrollTop von ul, sodass das aktuell fokussierte li-Element im sichtbaren Bereich angezeigt wird. this.$refs.ulRef.scrollTop = count * 60; // Speichert den Zählstatus im Inhaltsstatus der Komponente this.arrowCount = { upArrow: count, dwArrow: count }; } }, Legen Sie den Wert des Eingabe-Tags festWenn der Cursor an eine beliebige Position der eingegebenen Zeichen bewegt wird und eine Dropdown-Option ausgewählt ist, wird der Optionswert standardmäßig am Ende der eingegebenen Zeichen eingefügt. Wir möchten, dass der Optionswert an der aktuellen Cursorposition eingefügt wird. Daher müssen wir die Cursorposition berechnen und den Optionswert an der richtigen Position hinzufügen. Hierzu sind entsprechende Kenntnisse über Cursorposition und Textauswahl erforderlich. Weitere Informationen finden Sie unter Auswahl. /** * Text einfügen * @param ctrl Eingabeelementobjekt (Eingabe, Textbereich usw.) * @param inputValue der Wert des Eingabefeldes*/ Exportfunktion insertAtCursor(Strg, Eingabewert) { // IE-Unterstützung wenn (Dokument.Auswahl) { Strg.Fokus(); // Dokument.Auswahl.createRange() // Gibt ein TextRange-Objekt basierend auf der aktuellen Textauswahl oder ein ControlRange-Objekt basierend auf der Steuerelementauswahl zurück const sel = document.selection.createRange(); // Text auf das aktuelle TextRange-Objekt setzen sel.text = inputValue; } sonst wenn (ctrl.selectionStart || ctrl.selectionStart === 0) { // selectionStart Die Startposition des Textauswahlbereichs // selectionEnd Die Endposition des Textauswahlbereichs // MOZILLA und andere const startPos = ctrl.selectionStart; const endPos = ctrl.selectionEnd; // Wert an Cursorposition einfügen ctrl.value = // Der Wert vor der Cursorposition ctrl.value.substring(0, startPos) + //Der einzufügende Wert inputValue + //Der Wert nach der Cursorposition ctrl.value.substring(endPos, ctrl.value.length); // Cursorposition zurücksetzen // Nach dem Einfügen des Wertes sollte die Cursorposition am Ende des Strings sein // Der blinkende Cursor auf der Seite ist eigentlich eine spezielle Auswahl mit einer Breite von 0. Vereinfacht ausgedrückt kreuzen sich die linke und rechte Grenze der Auswahl und bilden den Cursor ctrl.selectionStart = startPos + inputValue.length; ctrl.selectionEnd = StartPos + Eingabewert.Länge; } anders { Strg.Wert += Eingabewert; } // Das Eingabeelementobjekt (Eingabe, Textbereich) erhält den Fokus zurück. Zu diesem Zeitpunkt sollte die Cursorposition am Ende der Eingabezeichen sein ctrl.focus(); } Vollständige Effektvorschau Oben sind die Details, wie Vue den variablen Ausdrucksselektor implementiert. Weitere Informationen zur Implementierung von variablen Ausdrucksselektoren durch Vue finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: Optimierungsmethoden, wenn MySQL zu viel CPU beansprucht (unbedingt lesen)
>>: Docker-Tutorial: Container verwenden (einfaches Beispiel)
Das in diesem Beispiel entwickelte kaskadierende ...
Inhaltsverzeichnis Grundlegende Konzepte von Komp...
Ich glaube, dass jeder manchmal Daten kopieren un...
Wenn Sie Docker unter Windows 10 installieren und...
HTML zum Erreichen eines einfachen ListViews-Effe...
Die Lösung für das Problem, dass die PHP7.3-Versi...
Als ich heute Nginx verwendete, trat ein 500-Fehl...
Keine Lücken auf beiden Seiten, Lücken zwischen j...
Grundlegende Syntax Sie können eine Ansicht mit d...
Die Kommunikationsmodi der Vue3-Komponenten sind ...
Hinweis: Sie müssen dem übergeordneten Container ...
Angesichts der Tatsache, dass mittlerweile viele M...
Designprinzipien für die Open-Source-Datenbankarc...
TabIndex dient zum Drücken der Tabulatortaste, um ...
Egal ob Sie Webdesigner oder UI-Designer sind, di...