Ich habe Probleme zu verstehen, wie Daten zwischen Komponenten in vue.js übertragen werden. Ich habe die Dokumente mehrmals durchgelesen und mir viele Fragen und Tutorials zum Thema Vue angesehen, aber ich verstehe sie immer noch nicht.
Um dies in den Kopf zu bekommen, hoffe ich auf Hilfe bei der Vervollständigung eines ziemlich einfachen Beispiels
- eine Liste der Benutzer in einer Komponente anzeigen (fertig)
- Senden Sie die Benutzerdaten an eine neue Komponente, wenn Sie auf einen Link klicken (fertig) - siehe Update unten.
- Benutzerdaten bearbeiten und an die Originalkomponente zurücksenden (noch nicht so weit)
Hier ist eine Geige, die in Schritt zwei fehlschlägt: https://jsfiddle.net/retrogradeMT/d1a8hps0/
Ich verstehe, dass ich Requisiten verwenden muss, um Daten an die neue Komponente zu übergeben, bin mir aber nicht sicher, wie ich das funktional tun soll. Wie binde ich die Daten an die neue Komponente?
HTML:
<div id="page-content">
<router-view></router-view>
</div>
<template id="userBlock" >
<ul>
<li v-for="user in users">{{user.name}} - <a v-link="{ path: '/new' }"> Show new component</a>
</li>
</ul>
</template>
<template id="newtemp" :name ="{{user.name}}">
<form>
<label>Name: </label><input v-model="name">
<input type="submit" value="Submit">
</form>
</template>
js für Hauptkomponente:
Vue.component('app-page', {
template: '#userBlock',
data: function() {
return{
users: []
}
},
ready: function () {
this.fetchUsers();
},
methods: {
fetchUsers: function(){
var users = [
{
id: 1,
name: 'tom'
},
{
id: 2,
name: 'brian'
},
{
id: 3,
name: 'sam'
},
];
this.$set('users', users);
}
}
})
JS für die zweite Komponente:
Vue.component('newtemp', {
template: '#newtemp',
props: 'name',
data: function() {
return {
name: name,
}
},
})
AKTUALISIEREN
Ok, ich habe den zweiten Schritt herausgefunden. Hier ist eine neue Geige, die den Fortschritt zeigt: https://jsfiddle.net/retrogradeMT/9pffnmjp/
Da ich einen Vue-Router verwende, verwende ich keine Requisiten, um die Daten an eine neue Komponente zu senden. Stattdessen muss ich Parameter für den V-Link festlegen und dann einen Übergangshaken verwenden, um ihn zu akzeptieren.
V-Link-Änderungen siehe benannte Routen in den Vue-Router-Dokumenten :
<a v-link="{ name: 'new', params: { name: user.name }}"> Show new component</a>
Fügen Sie dann auf der Komponente Daten zu den Routenoptionen hinzu, siehe Übergangshooks :
Vue.component('newtemp', {
template: '#newtemp',
route: {
data: function(transition) {
transition.next({
// saving the id which is passed in url
name: transition.to.params.name
});
}
},
data: function() {
return {
name:name,
}
},
})
quelle
params
ist ein Objekt. Der Namensschlüssel kannthis.user.name
in Ihrer Komponente zugewiesen werden. Erstellen Sie eine Geige, wenn Sie Hilfe benötigen, und lassen Sie es mich wissen. Überprüfen Sie dies heraus: vuejs.github.io/vue-router/en/route.htmlDer beste Weg, um Daten von einer übergeordneten Komponente an ein untergeordnetes Element zu senden, ist die Verwendung von Requisiten .
Übergabe von Daten vom Elternteil an das Kind über
props
props
(Array oder Objekt ) im Kind<child :name="variableOnParent">
Siehe Demo unten:
quelle
Vue.set
mehr hier: vuejs.org/v2/guide/reactivity.html#For-ArraysIch denke, das Problem ist hier:
Wenn Sie der Requisite ein Präfix voranstellen, zeigen
:
Sie Vue an, dass es sich um eine Variable und nicht um eine Zeichenfolge handelt. Sie brauchen also nicht die{{}}
Umgebunguser.name
. Versuchen:BEARBEITEN-----
Das Obige ist wahr, aber das größere Problem hierbei ist, dass die ursprüngliche Komponente verschwindet, wenn Sie die URL ändern und zu einer neuen Route wechseln. Damit die zweite Komponente die übergeordneten Daten bearbeitet, muss die zweite Komponente eine untergeordnete Komponente der ersten oder nur ein Teil derselben Komponente sein.
quelle
Ich habe einen Weg gefunden, übergeordnete Daten an den Komponentenbereich in Vue zu übergeben. Ich denke, es ist ein kleiner Hack, aber vielleicht hilft Ihnen das.
1) Referenzdaten in Vue Instance als externes Objekt
(data : dataObj)
2) Dann in der Datenrückgabefunktion in der
parentScope = dataObj
untergeordneten Komponente einfach zurück und voila. Jetzt können Sie Dinge wie tun{{ parentScope.prop }}
und werden wie ein Zauber arbeiten.Viel Glück!
quelle
Die oben genannten Antworten funktionieren gut, aber wenn Sie Daten zwischen zwei Geschwisterkomponenten übertragen möchten, kann auch der Ereignisbus verwendet werden. Schauen Sie sich diesen Blog an, der Ihnen helfen würde, besser zu verstehen.
Angenommen, es handelt sich um zwei Komponenten: CompA und CompB mit demselben übergeordneten und demselben main.js zum Einrichten der Haupt-Vue-App. Um Daten von CompA an CompB zu übergeben, ohne die übergeordnete Komponente einzubeziehen, haben Sie folgende Möglichkeiten.
Deklarieren Sie in der Datei main.js eine separate globale Vue-Instanz, die als Ereignisbus fungiert.
In CompA, wo das Ereignis generiert wird: Sie müssen das Ereignis an den Bus senden.
Jetzt besteht die Aufgabe darin, das ausgegebene Ereignis abzuhören, sodass Sie in CompB wie zuhören können.
Vorteile:
quelle
Ich greife mit auf die Haupteigenschaften zu
$root
.quelle
Eine globale JS-Variable (Objekt) kann verwendet werden, um Daten zwischen Komponenten zu übertragen. Beispiel: Übergeben von Daten von Ammlogin.vue an Options.vue. In Ammlogin.vue wird rspData auf die Antwort vom Server festgelegt. In Options.vue wird die Antwort vom Server über rspData verfügbar gemacht.
index.html:
Ammlogin.vue:
Options.vue:
quelle