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 Erläuterung der Grundkenntnisse zur Front-End-Komponentenbildung

Inhaltsverzeichnis Grundlegende Konzepte von Komp...

Detaillierte Erklärung zur Verwendung der Linux-Umleitung

Ich glaube, dass jeder manchmal Daten kopieren un...

Docker-Einstellung für den Windows-Speicherpfadvorgang

Wenn Sie Docker unter Windows 10 installieren und...

Beispielcode zur Implementierung eines einfachen ListViews-Effekts in HTML

HTML zum Erreichen eines einfachen ListViews-Effe...

Lösung für BT Baota Panel php7.3 und php7.4 unterstützen ZipArchive nicht

Die Lösung für das Problem, dass die PHP7.3-Versi...

Lösung für den internen Serverfehler Nginx 500

Als ich heute Nginx verwendete, trat ein 500-Fehl...

Implementierung des gemeinsamen Grid-Layouts

Keine Lücken auf beiden Seiten, Lücken zwischen j...

So erstellen Sie eine Ansicht in MySQL

Grundlegende Syntax Sie können eine Ansicht mit d...

Zusammenfassung und Beispiele der Kommunikationsmethoden für Vue3-Komponenten

Die Kommunikationsmodi der Vue3-Komponenten sind ...

Implementierung einer zirkulären Scroll-Listenfunktion basierend auf Vue

Hinweis: Sie müssen dem übergeordneten Container ...

Tipps zum Erstellen von Webseiten für Mobiltelefone

Angesichts der Tatsache, dass mittlerweile viele M...

Webdesign-TabIndex-Element

TabIndex dient zum Drücken der Tabulatortaste, um ...