Probleme und Lösungen bei der Verwendung des V-Modells zum bidirektionalen Binden der Werte von übergeordneten und untergeordneten Komponenten in Vue

Probleme und Lösungen bei der Verwendung des V-Modells zum bidirektionalen Binden der Werte von übergeordneten und untergeordneten Komponenten in Vue

Szenario

Heute stieß ich bei der Verwendung v-model für die bidirektionale Datenbindung von Komponenten auf ein seltsames Problem. Die Webseite selbst lief normal, aber der Browser zeigte ständig Warnmeldungen an.

[Vue warn]: Vermeiden Sie es, eine Eigenschaft direkt zu verändern, da der Wert bei jeder erneuten Darstellung der übergeordneten Komponente überschrieben wird. Verwenden Sie stattdessen eine Daten- oder berechnete Eigenschaft basierend auf dem Wert der Eigenschaft. Zu verändernde Eigenschaft: „Wert“

Diese Warnung wird durch eine benutzerdefinierte Komponente RxSelect verursacht

Vue.component("RxSelect", {
 Modell: {
 Requisite: "Wert",
 Ereignis: „Änderung“,
 },
 Requisiten: {
 Wert: [Zahl, Zeichenfolge],
 Karte: Karte,
 },
 Vorlage: `
  <Auswählen
   v-Modell="Wert"
   @change="$emit('ändern', Wert)"
  >
   <Option
   v-für="[k,v] in Karte"
   :Wert="k"
   :Schlüssel="k"
   >{{v}}</option>
  </Auswählen>
  `,
});

Der von uns verwendete Code scheint in Ordnung zu sein?

<Haupt-ID="App">
 Das aktuell ausgewählte Geschlecht ist: {{map.get(sex)}}
 <div>
 <rx-select :map="Karte" v-model="Geschlecht" />
 </div>
</main>

JavaScript-Code

neuer Vue({
 el: "#app",
 Daten: {
 Karte: neue Karte().set(1, "Vertraulich").set(2, "Männlich").set(3, "Weiblich"),
 Geschlecht: "",
 },
});

Nach dem Testen läuft das Programm selbst normal, es gibt kein Problem mit der Werteübertragung zwischen übergeordneten und untergeordneten Komponenten und die bidirektionale Datenbindung wird wirksam, aber der Browser meldet weiterhin einen Fehler.

Versuchen Sie zu lösen

Wir haben einen Weg gefunden

  1. Für Variablen, die eine bidirektionale Bindung erfordern, deklarieren Sie eine Variable innerValue in den data und initialisieren Sie sie auf den value
  2. Verwenden Sie v-model bei select , um diese Variable innerValue zu binden
  3. Überwachen Sie value und ändern Sie den Wert von innerValue , wenn sich value in der übergeordneten Komponente ändert.
  4. Überwachen Sie Änderungen im innerValue und verwenden Sie this.$emit('change', val) um der übergeordneten Komponente mitzuteilen, dass value aktualisiert werden muss, wenn er sich ändert.
Vue.component("RxSelect", {
 Modell: {
 Requisite: "Wert",
 Ereignis: „Änderung“,
 },
 Requisiten: {
 Wert: [Zahl, Zeichenfolge],
 Karte: Karte,
 },
 Daten() {
 zurückkehren {
  innererWert: dieser.Wert,
 };
 },
 betrachten:
 Wert(val) {
  dieser.innerValue = Wert;
 },
 innererWert(Wert) {
  dies.$emit("ändern", val);
 },
 },
 Vorlage: `
 <v-Modell auswählen="innererWert">
 <Option
  v-for="[k,v] in Karte"
  :Wert="k"
  :Schlüssel="k"
 >{{v}}</option>
 </Auswählen>
 `,
});

Der Verwendungscode ist genau derselbe, aber der Code der Komponente RxSelect ist viel länger. . .

lösen

Eleganter geht das mit computed Eigenschaften und deren get/set , dabei ist die Menge des zusätzlichen Codes akzeptabel.

Vue.component("RxSelect", {
 Modell: {
 Requisite: "Wert",
 Ereignis: „Änderung“,
 },
 Requisiten: {
 Wert: [Zahl, Zeichenfolge],
 Karte: Karte,
 },
 berechnet: {
 innererWert: {
  erhalten() {
  gib diesen Wert zurück;
  },
  setze(Wert) {
  dies.$emit("ändern", val);
  },
 },
 },
 Vorlage: `
 <v-Modell auswählen="innererWert">
 <Option
  v-für="[k,v] in Karte"
  :Wert="k"
  :Schlüssel="k"
 >{{v}}</option>
 </Auswählen>
 `,
});

Oben sind die Details der Probleme und Lösungen aufgeführt, die auftreten, wenn Vue v-model verwendet, um die Werte von übergeordneten und untergeordneten Komponenten bidirektional zu binden. Weitere Informationen dazu, wie Vue v-model verwendet, um die Werte von übergeordneten und untergeordneten Komponenten bidirektional zu binden, finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Beispielcode einer benutzerdefinierten Vue-Komponente zur Implementierung bidirektionaler V-Model-Bindungsdaten
  • Die Verwendung des V-Modells in Vue3-Komponenten und ausführliche Erklärung
  • Detaillierte Erklärung des Unterschieds zwischen der v-model-Direktive und dem .sync-Modifikator in Vue
  • Eine kurze Diskussion über das Prinzip des bidirektionalen Ereignisbindungs-V-Modells von Vue
  • Vue verwendet v-model, um den gesamten Prozess der El-Paginierungskomponenten zu kapseln
  • Grundlegende Implementierungsmethode für die komponentenübergreifende Bindung mithilfe des V-Modells in Vue
  • Lösung für das Eingabefeld des Vue-Formulars, das Fokus- und Unschärfeereignisse nicht unterstützt
  • Detaillierte Verwendung der Formular-Eingabekomponente von Vue unter Verwendung benutzerdefinierter Ereignisse [Datumskomponente und Währungskomponente]
  • Beispielcode für die Eingabebindung eines Vue-Formulars
  • Anomalie bei der Formatierung der chinesischen Eingabemethode der Vue-Formulareingabe
  • Vue-Formulareingabebindung V-Modell

<<:  MySQL verwendet Trigger, um das Zeilenlimit der Tabelle in der Datenbank zu lösen. Detaillierte Erklärung und Beispiele

>>:  Detaillierte Erläuterung der drei Möglichkeiten zum Konfigurieren virtueller Nginx-Hosts (basierend auf Ports)

Artikel empfehlen

MySQL-Lernprogramm Clustered Index

Das Clustering ist eigentlich relativ zur InnoDB-...

25 Tools zur Verbesserung der Website-Benutzerfreundlichkeit und Conversion-Raten

Bei einer Website bezieht sich die Benutzerfreundl...

Analyse der Informationsarchitektur von Facebook

<br />Original: http://uicom.net/blog/?p=762...

Grundkenntnisse zu MySQL – Lernhinweise

Datenbank anzeigen show databases; Erstellen eine...

So zeigen Sie eine PDF-Datei mit pdfjs in vue in der Vorschau an

Inhaltsverzeichnis Vorwort denken Analysieren und...

Node verwendet das Modul async_hooks zur Anforderungsverfolgung

Das Modul async_hooks ist eine experimentelle API...

CSS3 verwendet Transform, um eine bewegliche 2D-Uhr zu erstellen

Nachdem wir den transform Kurs abgeschlossen habe...

Node.js gibt je nach Anforderungspfad unterschiedliche Daten zurück.

Inhaltsverzeichnis 1. Lernen Sie, je nach Anforde...

Beispiele für die Verwendung von MySQL-Abdeckungsindizes

Was ist ein Deckungsindex? Das Erstellen eines In...

Der einfachste Weg, das MySQL-Root-Passwort zurückzusetzen

Meine MySQL-Version ist MySQL V5.7.9, bitte verwe...

Prinzipielle Beispiele für die vier Netzwerktypen von Docker

Vier Netzwerktypen: Keine: Konfigurieren Sie kein...

So deinstallieren Sie MySQL vollständig unter CentOS

Dieser Artikel dokumentiert die vollständige Dein...