Ich möchte also Requisiten an eine Vue-Komponente übergeben, aber ich erwarte, dass sich diese Requisiten in Zukunft innerhalb dieser Komponente ändern, z. B. wenn ich diese Vue-Komponente mithilfe von AJAX von innen aktualisiere. Sie dienen also nur zur Initialisierung der Komponente.
Mein cars-list
Vue-Komponentenelement, an das ich Requisiten mit anfänglichen Eigenschaften übergebe single-car
:
// cars-list.vue
<script>
export default {
data: function() {
return {
cars: [
{
color: 'red',
maxSpeed: 200,
},
{
color: 'blue',
maxSpeed: 195,
},
]
}
},
}
</script>
<template>
<div>
<template v-for="car in cars">
<single-car :initial-properties="car"></single-car>
</template>
</div>
</template>
So wie ich es jetzt single-car
mache, ordne ich es in meiner Komponente this.initialProperties
meinem this.data.properties
On- created()
Initialisierungs-Hook zu. Und es funktioniert und ist reaktiv.
// single-car.vue
<script>
export default {
data: function() {
return {
properties: {},
}
},
created: function(){
this.data.properties = this.initialProperties;
},
}
</script>
<template>
<div>Car is in {{properties.color}} and has a max speed of {{properties.maxSpeed}}</div>
</template>
Aber mein Problem dabei ist, dass ich nicht weiß, ob das der richtige Weg ist? Wird es mir nicht Probleme auf der Straße bereiten? Oder gibt es einen besseren Weg, dies zu tun?
quelle
data
isttwo-way
verpflichtet, aber man kann nicht passieren ,data
um Komponenten, Sie passierenprops
, aber man kann nicht die empfangene ändernprops
noch wandeln dasprops
zudata
. Dann was? Eine Sache, die ich gelernt habe, ist, dass Sieprops
Ereignisse weitergeben und auslösen sollten . Das heißt, wenn die Komponente denprops
Empfang ändern möchte , sollte sie ein Ereignis aufrufen und "neu gerendert" werden. Aber dann bleibt dir eineone-way
Bindung genau wie bei React und ich sehe die Verwendung fürdata
dann nicht. Ziemlich verwirrend.Antworten:
Dank dieser https://github.com/vuejs/vuejs.org/pull/567 kenne ich die Antwort jetzt.
Methode 1
Übergeben Sie die erste Requisite direkt an die Daten. Wie das Beispiel in aktualisierten Dokumenten:
Beachten Sie jedoch, dass jede Änderung an dieser Requisite zu einer Änderung des Status der übergeordneten Komponente führt, wenn die übergebene Requisite ein Objekt oder Array ist, das im Status der übergeordneten Komponente verwendet wird.
Warnung : Diese Methode wird nicht empfohlen. Dadurch werden Ihre Komponenten unvorhersehbar. Wenn Sie übergeordnete Daten aus untergeordneten Komponenten festlegen müssen, verwenden Sie entweder die Statusverwaltung wie Vuex oder "v-model". https://vuejs.org/v2/guide/components.html#Using-v-model-on-Components
Methode 2
Wenn Ihre ursprüngliche Requisite ein Objekt oder Array ist und Sie nicht möchten, dass Änderungen im untergeordneten Status in den übergeordneten Status übertragen werden, verwenden Sie einfach z. B.
Vue.util.extend
[1], um eine Kopie der Requisiten zu erstellen, anstatt sie direkt auf untergeordnete Daten zu verweisen, wie folgt:Methode 3
Sie können auch den Spread-Operator verwenden, um die Requisiten zu klonen. Weitere Details in der Igor-Antwort: https://stackoverflow.com/a/51911118/3143704
Beachten Sie jedoch, dass Spread-Operatoren in älteren Browsern nicht unterstützt werden. Für eine bessere Kompatibilität müssen Sie den Code z
babel
. B. mithilfe von transpilieren .Fußnoten
[1] Beachten Sie, dass dies ein internes Vue-Dienstprogramm ist und sich mit neuen Versionen ändern kann. Möglicherweise möchten Sie andere Methoden verwenden, um diese Requisite zu kopieren. Weitere Informationen finden Sie unter " Wie klone ich ein JavaScript-Objekt korrekt? ".
Meine Geige, wo ich sie getestet habe: https://jsfiddle.net/sm4kx7p9/3/
quelle
{ ok: 1, notOk: { meh: 2 } }
Wenn auf interne Daten mit einer der vorherigen Klonierungsmethoden gesetzt, würde die Requisite immer noch geändertnotOk.meh
initial
, um sie in meinem Comp verwenden zu können. Es wäre viel sauberer, wenn wir einfach eine Requisitedata
an einen beliebigen Comp weitergeben und die lokalisierten Daten ohne all dieseninitialPropName
Wahnsinn automatisch weitergeben könnten .prop --> comp.data
der Verwendung von Vue-Stash für alle Daten zu ändern (oder Vuex würde auch funktionieren). Aber jetzt pralle ich meine Daten einfachwindow
wie früher vom Objekt ab, bevor die "modernen" JS-Frameworks mir ihre Meinung auferlegten. Es stellt sich also die Frage: Wozu dient die Eigenschaft comp.data überhaupt?In Begleitung der Antwort von @ dominik-serafin:
Wenn Sie ein Objekt übergeben, können Sie es einfach mit dem Spread-Operator (ES6-Syntax) klonen:
Am wichtigsten ist es jedoch, sich daran zu erinnern, opt zu verwenden. 2 für den Fall, dass Sie einen berechneten Wert oder mehr einen asynchronen Wert übergeben. Andernfalls wird der lokale Wert nicht aktualisiert.
Demo:
https://jsfiddle.net/nomikos3/eywraw8t/281070/
quelle
recordLocal: [...this.record]
(in meinem Fall ist der Datensatz ein Array) hat bei mir nicht funktioniert - nach dem Laden und Überprüfen der vue-Komponente,record
enthält die Elemente undrecordLocal
war ein leeres Array.computed
Ich glaube, Sie machen es richtig, weil es das ist, was in den Dokumenten angegeben ist.
https://vuejs.org/guide/components.html#One-Way-Data-Flow
quelle
window
Objekt abzuprallen .