So implementieren Sie einen variablen Ausdrucksselektor in Vue

So implementieren Sie einen variablen Ausdrucksselektor in Vue

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:

  1. Wenn Sie bestimmte Zeichen in das Eingabefeld eingeben, wird eine Dropdown-Liste angezeigt.
  2. Sie können die Dropdown-Optionen umschalten, indem Sie die Auf- und Ab-Tasten auf der Tastatur drücken. Klicken Sie mit der Maus auf die Dropdown-Optionen oder drücken Sie die Eingabetaste. Der ausgewählte Inhalt wird dann im Eingabefeld angezeigt.
  3. Bewegen Sie den Cursor an eine beliebige Position der eingegebenen Zeichen, wählen Sie den Inhalt in der Dropdown-Liste aus und der ausgewählte Inhalt wird an der aktuellen Cursorposition angezeigt.
  4. Wenn die Dropdown-Liste angezeigt wird, aber kein Inhalt ausgewählt ist, wird die Eingabe im Eingabefeld unterbunden. Erst nachdem der Inhalt ausgewählt wurde, kann im Eingabefeld weiterhin Inhalt eingegeben werden.
  5. Anzeige des Eingabefeldverlaufs deaktivieren;

Definieren der HTML-Struktur

Da 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-Bindungsattribute

Wenn 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-Ereignisse

Binden 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-Bindungsattribute

Der 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

Gewöhnliche Div/Span/Li- und andere Elementknoten können den Fokus nicht direkt erhalten. Wenn Sie das Onfocus-Ereignis und das Onblur-Ereignis von Elementknoten wie div/span/li auslösen müssen, müssen Sie ihnen das Tabindex-Attribut hinzufügen. Das Tabindex-Attribut gibt tatsächlich die Position an, an die sich der Cursor bewegt, wenn auf dem Computer die Tabulatortaste angeklickt wird. Wenn auf dem Computer die Tabulatortaste angeklickt wird, erhält die Registerkarte umso schneller den Fokus, je kleiner der Tabindex-Attributwert ist (das Minimum ist 0).

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-Listener

Das 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 fest

Wenn 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:
  • Detaillierte Erklärung zur Verwendung der Vue-Komponente zur Datums- und Uhrzeitauswahl
  • Eine kurze Diskussion über die Fallstricke von Vue bei der Verwendung von Cascader Cascade Selector Data Echo
  • Vue implementiert Multi-Label-Selektor
  • Vue-Beispielcode zur Implementierung eines Zeitselektors mit Vant
  • Verwendung des mehrspaltigen Selektors im mpvue WeChat-Applet zur Auswahl von Provinzen und Städten
  • Beispielcode des Vue-Symbolselektors

<<:  Optimierungsmethoden, wenn MySQL zu viel CPU beansprucht (unbedingt lesen)

>>:  Docker-Tutorial: Container verwenden (einfaches Beispiel)

Artikel empfehlen

Detaillierte Erklärung des Sticky Position-Attributs in CSS

Beim Entwickeln mobiler Apps stoßen Sie häufig au...

So berechnen Sie mit Linux den von zeitgesteuerten Dateien belegten Speicherplatz

Öffnen Sie den Editor für geplante Aufgaben. Cent...

Verstehen von MySQL-Deadlock-Routinen durch eindeutige Index-S-Sperre und X-Sperre

In „MySQL-Deadlock-Probleme anhand des Quellcodes...

Eine Zusammenfassung der Gründe, warum MySQL keinen Datumsfeldindex verwendet

Inhaltsverzeichnis Hintergrund erkunden Zusammenf...

Beispielcode zur Realisierung des Ladeeffekts der B-Station mit CSS+SVG

Schwierigkeit Erstellung von zwei Masken für SVG-...

So steuern Sie die Startreihenfolge von Docker Compose-Diensten

Zusammenfassung Docker-Compose kann problemlos me...

Detailliertes Beispiel für die Datenmigration bei einem IOS-Datenbank-Upgrade

Detailliertes Beispiel für die Datenmigration bei...

Detaillierte Erklärung der allgemeinen For-Schleife in JavaScript-Anweisungen

Es gibt viele Schleifenanweisungen in JavaScript,...

Einführung in den vollständigen Namen und die Funktion von HTML-Tags

Alphabetisch DTD: Gibt an, in welcher XHTML 1.0 D...

Detaillierte Schritte zur vollständigen Deinstallation von MySQL 5.7

Dieser Artikel fasst hauptsächlich verschiedene P...

Javascript zum Wechseln von Bildern per Mausklick

In diesem Artikelbeispiel wird der spezifische Ja...

Bootstrap3.0-Studiennotizentabelle bezogen auf

In diesem Artikel werden hauptsächlich Tabellen e...

Detaillierte Erklärung zur Verwendung von Vue-Mixin

Inhaltsverzeichnis Verwendung von Vue-Mixin Daten...