2017-09-08 5 views
0

Ich habe eine Frage, wie Vuex-Reaktivität funktioniert. Ich habe folgendes Geschäft:Vuex-State-Change-Propagation

// state 
state: { 
    database: { 
     tables: [] 
    } 
} 

// mutator 
ADD_TABLE(state, {table}) { 
    state.database.tables.push(table); 
} 

Also, wenn die ADD_TABLE Mutation geschieht vue Komponenten und die vuex Uhr reagieren nur, wenn das Objekt direkt geändert wird und nicht auf verschachtelte Eigenschaftsänderung reagieren.

Ist dies das gewünschte Verhalten und warum, oder habe ich etwas in meinem Code brechen?

+1

könnten Sie versuchen, Hinzufügen von 'geändert werden könnte {tief: true}' als drittes Argument an Ihre watcher und schau, ob das funktioniert. –

+0

Ja, das funktioniert aber immer noch, ich habe die Beobachter für eine kurze Erklärung hier auf SO hinzugefügt. Im tatsächlichen Code ist es in den Daten/berechneten Eigenschaften gebunden, und die Komponente reagiert nicht auf die Änderung. – korun

+0

So funktionieren Beobachter in Vue. Wenn Sie eine bestimmte Eigenschaft beobachten, ist die Standardeinstellung in Vue eine flache Uhr. Sie müssen eine tiefe Uhr angeben, wenn Sie alles sehen wollen. Könnten Sie ein Beispiel für das tatsächliche Problem geben, dass die Angabe von tief nicht löst? – Bert

Antwort

0

Dies ist als Leistungsoptimierung in Vue.js gedacht, ähnlich wie PureComponents in React zum Beispiel arbeitet.

Standardmäßig wird nur oberflächlicher Vergleich durchgeführt, was bedeutet, dass nur der Verweis auf die Objekteigenschaft überprüft wird.

Änderung wird übernommen, wenn Datenbank Eigenschaft umbenannt, entfernt oder eine andere Eigenschaft zum Objekt hinzugefügt wird, die eine Änderung in der ersten Ebene des Objekts anzeigt.

Sie können dies mindern, indem Sie Eigenschaften hinzufügen, die Sie weitergeben oder optimieren.

Zum Beispiel, wenn Ihr db Objekt nur ein einziges Kind Eigenschaft haben würde, es leicht zu so etwas wie

state: { 
    databaseTables: [] 
}