2016-03-10 11 views
10

Gibt es eine Möglichkeit, den Unterschied zu bekommen, den React von den DOM/Components bekommt? Ich kann mir vorstellen, Änderungen so zu speichern, wie sie geschehen, damit der Benutzer die Änderungen "rückgängig machen" kann und persönlich an der Verfügbarkeit des diff interessiert ist, das dem render zugrunde liegt (vielleicht würden sich die Komponenten geändert haben?)].Get diff auf rerender in React

EDIT: Die Undo-Funktion war nur ein Beispiel. Ich bin nur daran interessiert, ob das obige aus React extrahiert werden kann, da es angeblich ein Diff von neuem und altem Baum macht.

+0

* "Ich versuche, Änderungen so zu speichern, wie sie geschehen, damit der Benutzer die Änderungen rückgängig machen kann." * Behalten Sie stattdessen eine Momentaufnahme des Status Ihrer App/Komponente. Dann "Undo" lädt einfach den vorherigen Zustand. Mir ist wirklich nicht klar, warum du einen Unterschied vom ** DOM ** willst. –

+0

Die App/Komponente selbst ist baumartig - es wäre einfach praktisch, auf das diff zugreifen zu können, da ich es sowieso im Auge behalten möchte, die Informationen vielleicht für andere Zwecke speichern. Ich muss einen separaten Vergleich erstellen, aber wenn ich diese Informationen abrufen könnte. könnte möglicherweise nützlich sein. – Cenoc

Antwort

7

Ich versuche, Änderungen zu speichern, wie sie können, damit der Benutzer passieren ‚rückgängig machen‘ die Änderungen

Mein Vorschlag, wie dies zu tun:

Ergebnis Reagieren machen sollte nur auf der Grundlage werden Zustände. Wenn Sie zwei identische Zustände angeben, sollte DOM identisch sein. Möglicherweise sollten Kinderkomponenten zustandslos sein.

componentWillUpdate Methode wird nach Änderungen in Requisiten und Zuständen ausgeführt.

Sie können den Status nach jeder Statusänderung kopieren und speichern.

Und wenn der Benutzer Änderungen rückgängig macht, dann den alten gespeicherten Zustand als aktuellen Status setzen.

Und DOM sollte identisch mit dem vorherigen Zustand sein.

+3

Vereinbart, mit React ist es Ihr Ziel, dass Sie das DOM nicht verändern müssen oder sich um den DOM-Status sorgen müssen, sondern Sie behandeln den Zustand Ihrer Daten und das DOM wird deterministisch daraus gemacht. – tt9

+0

@ krzysztof-sztompka Während ich dem zustimme, frage ich aus der Sicht, ob Sie sich für das virtuelle DOM interessieren. Ich stelle mir vor, dass das Diff aus Komponenten und nicht aus tatsächlichen DOM-Elementen bestehen würde. – Cenoc

+0

Ich verstehe Ihre Sichtweise, aber in meiner Antwort habe ich versucht, Ihnen bei diesem Problem auf reaktive Weise zu helfen. Bei der Arbeit mit Reagieren sollten wir virtuell reagieren. Ich weiß nicht, ob das überhaupt möglich ist, um virtuelles Dom zu manipulieren. –

0

Verwenden Sie Redux in Kombination mit redux-undo, wenn Sie die Funktionalität rückgängig machen/wiederherstellen möchten.

0

Um Ihre Frage zu beantworten: Wahrscheinlich, aber man sollte es nicht so

Stellen tun, wenn Sie die diff des DOM hatte, dann würden Sie das DOM analysieren müssen und herauszufinden, welche dom ändert sich auf verschiedene Teile von Requisiten und Zustand.

Das ist chaotisch.

var SomeComponent = React.createClass({ 
    onChange: function(newData){ 
    currentState = _.clone(this.state.currentState) 
    previousChanges = this.state.previousChanges.concat([currentState]) 

    this.setState({ 
     currentState: newData, 
     previousChanges: previousChanges 
    }) 
    }, 

    undo: function(){ 
    previousChanges = _.clone(this.state.previousChanges) 
    currentState = previousChanges.pop() // removes last item and returns it 

    this.setState({ 
     currentState: currentState, 
     previousChanges: previousChanges 
    })  
    }, 
    render: function(){ 
    <div> 
     <SomeAwesomeThing 
     currentState={this.state.currentState} 
     onChange={this.onChange} 
     onUndo={this.undo} 
     /> 
    </div> 
    } 
}) 

Sie haben grundsätzlich einen Zeiger auf die aktuellen Daten zu halten, und auf eine Liste von Änderungen, wobei jede Änderung leicht rückgängig gemacht werden kann.