Verschiedene Implementierungsmethoden von Vue zum Ändern von übergeordneten Komponenteneigenschaften durch untergeordnete Komponenten

Verschiedene Implementierungsmethoden von Vue zum Ändern von übergeordneten Komponenteneigenschaften durch untergeordnete Komponenten

Vorwort

Bei der tatsächlichen Projektentwicklung gibt es häufig Szenarien, in denen die übergeordnete Komponente zuerst Werte an die untergeordnete Komponente übergibt und die untergeordnete Komponente dann die Szene rendert und anzeigt. Im Folgenden fasse ich einige der Methoden zusammen, die ich bei meiner aktuellen Arbeit kennengelernt und verwendet habe. Sie können als Referenz für Implementierungsmethoden und -ideen angesehen werden. Wenn Sie Missverständnisse oder andere Methoden haben, hinterlassen Sie bitte eine Nachricht im Kommentarbereich, um Anleitungen zu erhalten ~

Gängige Methoden

Es wird empfohlen, die Regel zur unidirektionalen Prop-Übertragung zu befolgen. Sowohl Basisdatentypen als auch Referenzdatentypen sind zulässig.

1. Ändern Sie die Eigenschaft, indem Sie auf das Emit-Ereignis der untergeordneten Komponente durch die übergeordnete Komponente hören.

Prinzip:

  • Binden Sie das Wertattribut des Eingabetags in der untergeordneten Komponente und weisen Sie den Wert in der Eigenschaft zu. Da der Wert anstelle des V-Modells verwendet wird, wirkt sich das Ändern des Eingabewerts nicht auf die Eigenschaft aus.
  • Binden Sie dann das Eingabeereignis an die Eingabe. Jede Eingabe löst das Eingabeereignis aus. Im Ereignis wird this.$emit('der Ereignisname, auf den das übergeordnete Element hören möchte', der geänderte Wert) verwendet, um den Wert nach oben weiterzugeben.
  • Die übergeordnete Komponente verwendet „on“, um auf das gerade von der untergeordneten Komponente ausgelöste Emit-Ereignis zu hören, und aktualisiert den vom Ereignis an die Daten der übergeordneten Komponente übergebenen Wert.
  • Nachdem der Wert in den Daten der übergeordneten Komponente aktualisiert wurde, aktualisiert die untergeordnete Komponente, da er über die Eigenschaft an die untergeordnete Komponente übergeben wird, auch synchron den Eigenschaftswert und rendert die Ansichtsebene.

emittieren

Der Code der übergeordneten Komponente lautet wie folgt:

<Vorlage>
  <div style="Hintergrundfarbe: himmelblau;">
    <h3>Ändern Sie die Eigenschaft, indem Sie auf die Ereignisse der untergeordneten Komponente durch die übergeordnete Komponente hören.</h3>
    <div>übergeordnetes Objekt:{{ obj }}</div>
    <div>übergeordnete Nachricht:{{ msg }}</div>
    <!-- Wenn die übergeordnete Komponente die untergeordnete Komponente aufruft, überwacht sie das von der untergeordneten Komponente ausgelöste Emit-Ereignis über „on“, um den Wert zu empfangen und den Benutzer zu aktualisieren-->
    <emitKind
      :obj="obj"
      :msg="Nachricht"
      @update-obj="AktualisierungsObj"
      @update-msg="Aktualisierungsnachricht"
    />
  </div>
</Vorlage>

<Skript>
importiere emitChild aus './components/emitChild'

Standard exportieren {
  Name: "emitUpdate",
  Komponenten:
    emittieren
  },
  Daten () {
    zurückkehren {
      Objekt: {
        Name: 'zhangsan',
        Alter: 18
      },
      Nachricht: 'Hallo'
    }
  },
  Methoden: {
    // Auf Ereignisse achten, die von untergeordneten Komponenten ausgelöst werden, und Objekt in Daten aktualisieren
    updateObj (Schlüssel, neuerWert) {
      this.obj[Schlüssel] = neuerWert
    },
    // Auf Ereignisse achten, die von untergeordneten Komponenten ausgelöst werden, und Nachrichten in den Daten aktualisieren
    updateMsg (neuerWert) {
      this.msg = neuerWert
    }
  }
}
</Skript>

Der Unterkomponentencode lautet wie folgt:

<Vorlage>
  <div Stil="Hintergrundfarbe: pink;">
    <div>
      <span>Namen ändern:</span>
      <!-- Hier ist der Bindungswert ein Wert, da die Eingabe hauptsächlich zum Anzeigen von Prop-Daten verwendet wird und die eigentliche Änderung nicht in der Unterkomponente erfolgt. Die Unterkomponente wird nur als Änderungsauslöserquelle verwendet-->
      <!-- Eingabeereignis als Eintrittspunkt der Triggerquelle binden -->
      <Eingabetyp="Text" :Wert="Objekt.Name" @Eingabe="UpdateObj($Event, 'Name')">
    </div>
    <div>
      <span>Alter ändern:</span>
      <input type="text" :value="obj.age" @input="updateObj($event, 'age')">
    </div>
    <div>
      <span>Nachricht ändern:</span>
      <Eingabetyp="Text" :Wert="Nachricht" @Eingabe="UpdateNachricht($Event.Ziel.Wert)">
    </div>
  </div>
</Vorlage>

<Skript>
Standard exportieren {
  Name: "emitUpdateChild",
  Requisiten: {
    Objekt: {
      Typ: Objekt,
      Standard: () => {}
    },
    Nachricht: {
      Typ: Zeichenfolge,
      Standard: ''
    }
  },
  Methoden: {
    // Benachrichtigen Sie die übergeordnete Komponente, um das Objekt zu aktualisieren
    updateObj ($Ereignis, Schlüssel) {
      // Empfange den Eingabewert und das entsprechende Attribut in obj, das aktualisiert werden muss, und gib es dann an die übergeordnete Komponente zurück. // Die übergeordnete Komponente kann erkennen, welchen Attributwert in obj die untergeordnete Komponente aktualisieren muss. $emit('update-obj', key, $event.target.value)
    },
    // Benachrichtigen Sie die übergeordnete Komponente, um die Nachricht zu aktualisieren
    updateMsg (neuerWert) {
      dies.$emit('update-msg', neuerWert)
    }
  }
}
</Skript>

2. Ändern Sie die Eigenschaft durch den Synchronisationsmodifikator der übergeordneten Komponente + das Emit-Ereignis der untergeordneten Komponente

Prinzip:

  • Binden Sie das Wertattribut des Eingabetags in der untergeordneten Komponente und weisen Sie den Wert in der Eigenschaft zu. Da der Wert anstelle des V-Modells verwendet wird, wirkt sich das Ändern des Eingabewerts nicht auf die Eigenschaft aus.
  • Binden Sie dann das Eingabeereignis an die Eingabe. Jede Eingabe löst das Eingabeereignis aus. Im Ereignis wird this.$emit('der Ereignisname, auf den das übergeordnete Element hören möchte', der geänderte Wert) verwendet, um den Wert nach oben weiterzugeben.
  • Wenn die übergeordnete Komponente die untergeordnete Komponente aufruft, um Eigenschaften zu übergeben, fügen Sie nach der Eigenschaft .sync hinzu, um den vom Ereignis an die Daten der übergeordneten Komponente übergebenen Wert zu aktualisieren, da die Synchronisierung tatsächlich dem Ausführen des Codes @Listener entspricht. Name des untergeordneten ausgelösten Ereignisses = „Eigenschaftsname in übergeordneten Daten = von Emit übergebener Wert (d. h. $event)“.
  • Nachdem der Wert in den Daten der übergeordneten Komponente aktualisiert wurde, aktualisiert die untergeordnete Komponente, da er über die Eigenschaft an die untergeordnete Komponente übergeben wird, auch synchron den Eigenschaftswert und rendert die Ansichtsebene.

synchronisieren

Der Code der übergeordneten Komponente lautet wie folgt:

<Vorlage>
  <div style="Hintergrundfarbe: himmelblau;">
    <h3>Eigenschaft ändern durch Synchronisierungsmodifikator der übergeordneten Komponente + Emission-Ereignis der untergeordneten Komponente</h3>
    <div>übergeordnetes Objekt:{{ obj }}</div>
    <div>übergeordnete Nachricht:{{ msg }}</div>
    <!-- Wenn die übergeordnete Komponente die untergeordnete Komponente aufruft, um Eigenschaften zu übergeben, fügen Sie nach der Eigenschaft einfach .sync hinzu -->
    <syncChild :obj.sync="obj" :msg.sync="msg" />
    <!--
      sync ist eigentlich gleichbedeutend mit der Ausführung des durch @listener ausgelösten Ereignisnamens = "Eigenschaftsname in übergeordneten Daten = von emit übergebener Wert (d. h. $event)"
      Dieser Codeabschnitt -->
    <!-- Die Wirkung entspricht dem folgenden Code, es ist also nicht erforderlich, Methoden zum Ändern von Daten in den Methoden der übergeordneten Komponente zu definieren-->
    <!--
      <syncChild
        :obj="obj"
        :msg="Nachricht"
        @update-obj="obj = $Ereignis"
        @update-msg="msg = $Ereignis"
      />
    -->
  </div>
</Vorlage>

<Skript>
importiere syncChild aus „./components/syncChild“

Standard exportieren {
  Name: "syncUpdate",
  Komponenten:
    synchronisierenUntergeordnetes
  },
  Daten () {
    zurückkehren {
      Objekt: {
        Name: 'zhangsan',
        Alter: 18
      },
      Nachricht: 'Hallo'
    }
  }
}
</Skript>

Der Unterkomponentencode lautet wie folgt:

<Vorlage>
  <div Stil="Hintergrundfarbe: pink;">
    <div>
      <span>Namen ändern:</span>
      <!-- Hier ist der Bindungswert ein Wert, da die Eingabe hauptsächlich zum Anzeigen von Prop-Daten verwendet wird und die eigentliche Änderung nicht in der Unterkomponente erfolgt. Die Unterkomponente wird nur als Änderungsauslöserquelle verwendet-->
      <!-- Eingabeereignis als Eintrittspunkt der Triggerquelle binden -->
      <Eingabetyp="Text" :Wert="Unterobjekt.Name" @Eingabe="UpdateObj($Event, 'Name')">
    </div>
    <div>
      <span>Alter ändern:</span>
      <input Typ="Text" :Wert="KindObj.Alter" @input="UpdateObj($Event, 'Alter')">
    </div>
    <div>
      <span>Nachricht ändern:</span>
      <Eingabetyp="Text" :Wert="Nachricht" @Eingabe="UpdateNachricht($Event.Ziel.Wert)">
    </div>
  </div>
</Vorlage>

<Skript>
// Hier stellen wir die Deep-Copy-Methode cloneDeep der Lodash-Toolbibliothek vor // Offizielle Dokumentadresse https://www.lodashjs.com/
importiere { cloneDeep } von 'lodash'

Standard exportieren {
  Name: "emitUpdateChild",
  Requisiten: {
    Objekt: {
      Typ: Objekt,
      Standard: () => {}
    },
    Nachricht: {
      Typ: Zeichenfolge,
      Standard: ''
    }
  },
  Daten () {
    zurückkehren {
      // Hier wird das Objekt der Requisite per Deep Copy kopiert, hauptsächlich für:
      // 1. Unterscheide zwei Objekte (Referenztypen) anhand unterschiedlicher Speicheradressen // 2. Behalte alle Werte im Objekt, um das Rendern/Ändern/Zurückgeben von untergeordneten Komponenten zu erleichtern childObj: cloneDeep(this.obj)
    }
  },
  Methoden: {
    // Benachrichtigen Sie die übergeordnete Komponente, um das Objekt zu aktualisieren
    updateObj ($Ereignis, Schlüssel) {
      // Erhalte den Eingabewert und das entsprechende Attribut in childObj, das aktualisiert werden muss // Aktualisiere dann childOBj und gib es an die übergeordnete Komponente zurück // Die übergeordnete Komponente kann das erhaltene childObj direkt in das Datenobjekt this.childObj[key] = $event.target.value aktualisieren
      dies.$emit('update:obj', dies.childObj)
    },
    // Benachrichtigen Sie die übergeordnete Komponente, um die Nachricht zu aktualisieren
    updateMsg (neuerWert) {
      dies.$emit('update:msg', neuerWert)
    }
  }
}
</Skript>

Tipps

Es zielt hauptsächlich auf Referenzdatentypen ab und umgeht den Prop-Erkennungsmechanismus von Vue. Es hängt davon ab, ob die Projektspezifikationen dieses Schreiben zulassen.

3. Ändern Sie die Requisite über die Daten

Voraussetzung: Es können nur Referenzdatentypen implementiert werden

Prinzip:

  • Weisen Sie die von der übergeordneten Komponente übergebene Eigenschaft direkt den Daten der untergeordneten Komponente zu. Zu diesem Zeitpunkt zeigen die Variablen auf beiden Seiten der Eigenschaft und der Daten auf dieselbe Speicheradresse, sodass das Ändern der Daten dem Ändern der Eigenschaft entspricht.
  • Vue2 erlaubt keine direkte Änderung von Requisiten, aber derzeit ändern wir Daten statt Requisiten, sodass Vue keinen Fehler ausgibt, was dem Umgehen des Erkennungsmechanismus von Vue entspricht, der keine Änderung von Requisiten zulässt.

Daten

Der Code der übergeordneten Komponente lautet wie folgt:

<Vorlage>
  <div style="Hintergrundfarbe: himmelblau;">
    <h3>Ändern Sie die Eigenschaft, indem Sie sie den Daten zuweisen</h3>
    <div>übergeordnetes Objekt:{{ obj }}</div>
    <div>übergeordnete Nachricht:{{ msg }}</div>
    <dataChild :obj="obj" :msg.sync="msg" />
  </div>
</Vorlage>

<Skript>
importiere dataChild aus „./components/dataChild“

Standard exportieren {
  Name: "dataUpdate",
  Komponenten:
    Datenuntergeordnetes Datenelement
  },
  Daten () {
    zurückkehren {
      Objekt: {
        Name: 'zhangsan',
        Alter: 18
      },
      Nachricht: 'Hallo'
    }
  }
}
</Skript>

Der Unterkomponentencode lautet wie folgt:

<Vorlage>
  <div Stil="Hintergrundfarbe: pink;">
    <div>
      <span>Namen ändern:</span>
      <!-- Da wir hier die Eigenschaft direkt den Daten zuweisen, können wir die bidirektionale Bindung des V-Modells direkt zum Ändern der Daten verwenden-->
      <Eingabetyp="Text" v-Modell="Datenobjekt.Name">
    </div>
    <div>
      <span>Alter ändern:</span>
      <Eingabetyp="Text" v-Modell="DatenObj.Alter">
    </div>
    <div>
      <span>Nachricht ändern:</span>
      <!-- Hier ist eine weitere Möglichkeit, grundlegende Datentypen zu ändern, die durch Watch-Listener implementiert werden kann-->
      <Eingabetyp="Text" v-Modell="Datennachricht">
    </div>
  </div>
</Vorlage>

<Skript>
Standard exportieren {
  Name: "dataChild",
  Requisiten: {
    Objekt: {
      Typ: Objekt,
      Standard: () => {}
    },
    Nachricht: {
      Typ: Zeichenfolge,
      Standard: ''
    }
  },
  Daten () {
    zurückkehren {
      // Wenn der Referenzdatentyp direkt zugewiesen wird, handelt es sich um eine oberflächliche Kopie. Nur die Speicheradresse wird kopiert. Wenn Sie eine ändern, wirkt sich dies auf das andere Datenobjekt aus: this.obj.
      // Wenn grundlegende Datentypen direkt zugewiesen werden, werden die Werte kopiert und das Ändern eines Werts wirkt sich nicht auf den anderen aus dataMsg: this.msg
    }
  },
  betrachten:
    // Hier hören wir die aus den Daten kopierte dataMsg ab und führen bei einer Änderung „emitt“ aus, um die übergeordnete Komponente zu benachrichtigen, dass dataMsg (newVal) aktualisiert werden soll {
      dies.$emit('update:msg', neuerWert)
    }
  }
}
</Skript>

4. Ändern Sie die Eigenschaft durch berechnete Eigenschaft

Voraussetzung: Es können nur Referenzdatentypen implementiert werden

Prinzip:

  • In der untergeordneten Komponente wird die von der übergeordneten Komponente übergebene Eigenschaft direkt über die berechnete Eigenschaft „computed“ abgehört. Zu diesem Zeitpunkt zeigen die Variablen auf beiden Seiten der berechneten Eigenschaft „computed“ und der Eigenschaft auf dieselbe Speicheradresse, sodass das Ändern der berechneten Eigenschaft „computed“ dem Ändern der Eigenschaft entspricht.
  • Vue2 erlaubt keine direkte Änderung von Requisiten, aber derzeit ändern wir die berechnete Eigenschaft statt der Requisite, sodass Vue keinen Fehler ausgibt. Dies entspricht der Umgehung des Erkennungsmechanismus von Vue, der keine Änderung von Requisiten zulässt.

berechnet

Der Code der übergeordneten Komponente lautet wie folgt:

<Vorlage>
  <div style="Hintergrundfarbe: himmelblau;">
    <h3>Eigenschaften durch rechnergestützte Eigenschaftsüberwachung ändern</h3>
    <div>übergeordnetes Objekt:{{ obj }}</div>
    <div>übergeordnete Nachricht:{{ msg }}</div>
    <computedChild :obj="obj" :msg.sync="msg" />
  </div>
</Vorlage>

<Skript>
importiere computedChild aus './components/computedChild'

Standard exportieren {
  Name: "berechnetesUpdate",
  Komponenten:
    berechnetes Kind
  },
  Daten () {
    zurückkehren {
      Objekt: {
        Name: 'zhangsan',
        Alter: 18
      },
      Nachricht: 'Hallo'
    }
  }
}
</Skript>

Der Unterkomponentencode lautet wie folgt:

<Vorlage>
  <div Stil="Hintergrundfarbe: pink;">
    <div>
      <span>Namen ändern:</span>
      <!-- Da wir hier direkt über die berechnete Eigenschaft auf die Eigenschaft hören, können wir die bidirektionale Bindung des V-Modells direkt verwenden, um die Daten zu ändern-->
      <Eingabetyp="Text" v-Modell="berechnetesObjekt.name">
    </div>
    <div>
      <span>Alter ändern:</span>
      <Eingabetyp="Text" v-Modell="berechnetesObj.Alter">
    </div>
    <div>
      <span>Nachricht ändern:</span>
      <!-- Hier ist eine weitere Möglichkeit, grundlegende Datentypen zu ändern, die über den Setter der berechneten Eigenschaft erreicht werden kann-->
      <Eingabetyp="Text" v-Modell="berechneteMsg">
    </div>
  </div>
</Vorlage>

<Skript>
Standard exportieren {
  Name: "berechnetesKind",
  Requisiten: {
    Objekt: {
      Typ: Objekt,
      Standard: () => {}
    },
    Nachricht: {
      Typ: Zeichenfolge,
      Standard: ''
    }
  },
  berechnet: {
    berechnetesObjekt() {
      // Hier wird der Referenzdatentyp obj direkt zurückgegeben. Zu diesem Zeitpunkt entspricht computedObj obj
      // Es handelt sich also um eine oberflächliche Kopie, nur die Speicheradresse wird kopiert und das Ändern einer Adresse wirkt sich auf die andere aus. returniere this.obj
    },
    berechneteMsg: {
      erhalten () {
        // Bei jeder Aktualisierung der Eigenschaft wird die Getter-Methode der berechneten Eigenschaft ausgelöst, um den neuesten Wert abzurufen. // Bei der direkten Rückgabe des Basisdatentyps wird der Wert kopiert. Eine Änderung des einen wirkt sich nicht auf den anderen aus. return this.msg
      },
      setze (neuerWert) {
        // Hier verwenden wir die Setter-Methode der berechneten Eigenschaft, um die Emission auszulösen, wenn der Wert geändert wird, um die übergeordnete Komponente zu benachrichtigen, dass der Wert aktualisiert werden soll. this.$emit('update:msg', newVal)
      }
    }
  }
}
</Skript>

Damit ist dieser Artikel über verschiedene Möglichkeiten zur Implementierung von Vue zur Änderung der Eigenschaft einer übergeordneten Komponente durch eine untergeordnete Komponente abgeschlossen. Weitere relevante Inhalte zu Vue-untergeordneten Komponenten, die die Eigenschaft einer übergeordneten Komponente ändern, finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung des Falls, in dem eine untergeordnete Vue-Komponente die Methode der übergeordneten Komponente aufruft
  • Vue-Elternkomponente ruft Funktionsimplementierung der Unterkomponente auf
  • Mehrere Möglichkeiten zum Übergeben von Daten von übergeordneten Komponenten an untergeordnete Komponenten in Vue
  • Detaillierte Erklärung des Ereignisses zum Auslösen von untergeordneten Komponenten durch Klicken auf Schaltflächen in übergeordneten Komponenten in Vue
  • Beispiel für die Übergabe von Werten zwischen untergeordneten Vue-Komponenten und übergeordneten Komponenten
  • Die übergeordnete Vue-Komponente überwacht den Lebenszyklus der untergeordneten Komponente
  • Wie erhält eine übergeordnete Vue-Komponente Variablen in einer untergeordneten Komponente?
  • Detaillierte Analyse der untergeordneten und übergeordneten Vue-Komponenten

<<:  Pessimistisches Sperren und optimistisches Sperren in MySQL

>>:  Lösung für das Ausgehen der Auto-Increment-ID (Primärschlüssel) von MySQL

Artikel empfehlen

Details der MySQL-Berechnungsfunktion

Inhaltsverzeichnis 2. Feldverkettung 2. Geben Sie...

Erläuterung der MySQL-Indexoptimierung

Bei unserer täglichen Arbeit führen wir manchmal ...

So verwenden Sie Navicat zum Exportieren und Importieren einer MySQL-Datenbank

MySql ist eine Datenquelle, die wir häufig verwen...

base target="" gibt das Ziel des Basislinks zum Öffnen des Frames an

<base target=_blank> ändert den Zielrahmen d...

Eine einfache Methode zum Zusammenführen und Entfernen doppelter MySQL-Tabellen

Szenario: Die gecrawlten Daten erzeugen eine Date...

Erste Erfahrungen mit der Texterstellung mit Javascript Three.js

Inhaltsverzeichnis Wirkung Beginnen Sie mit der T...

Methode und Optimierungsprinzip für langsame MySQL-Abfragen

1. Zum Vergleich der Datumsgröße muss das an XML ...

So vereinfachen Sie Redux mit Redux Toolkit

Inhaltsverzeichnis Probleme, die Redux Toolkit lö...

CSS-Randüberlappungen und wie man sie verhindert

Die vertikal benachbarten Kanten zweier oder mehr...

So verwenden Sie den CocosCreator-Objektpool

Inhaltsverzeichnis Vorwort: Spezifische Operation...

Zusammenfassung der Wissenspunkte zum CSS-Frontend (unbedingt lesen)

1. Das Konzept von CSS: (Cascading Style Sheet) V...