2015-08-20 13 views
9

ich die ziemlich typisch reagieren-Router haben App ein:Wie Zustand über anhalten reagieren Router Übergänge

var App = React.createClass({ 
    render: function() { 
     return (< RouteHandler />); 
    } 
}); 

var routes = (
    <Route handler = { App }> 
     < Route name = "Todo" path = "todo/:id" handler = {Todo}/> 
     < DefaultRoute name = "Todos" handler = {Todos}/> 
    </Route> 
); 

Router.run(routes, function(Handler) { 
    React.render(< Handler /> , document.getElementById('content')); 
}); 

Mein Problem ist, dass meine Todos Komponente einige Suchfilter auf sie hat, und ich möchte beharren diese Filter, wenn ich auf eine bestimmte Todo und zurück übergehen. Die offensichtliche Lösung ist, diese Filterwerte auf App 's Zustand zu speichern, aber ich kann einen eleganten Weg nicht finden, Todos Zugang zum App' s Zustand zu erlauben.

Irgendwelche Hinweise?

Nachtrag: Diese App verwendet Reflux sowie React-Router.

+1

Ich habe Filter als Abfrageparameter verwendet, so dass sie mit den URLs bestehen bleiben. Oder wollen Sie die Ergebnisse zwischenspeichern? –

Antwort

3

würde ich die URL der Zustands Filter und Seitenzahl für Anzeigen zu speichern.

Einer der Reaktion Router "Vorteile dieses Ansatzes" ist: URLs sind Ihr erster Gedanke, kein Nachdenken.

Die URL ist ein grundlegender Teil des Webs, verwenden Sie es zu Ihrem Vorteil, versuchen Sie nicht, es zu vermeiden.

Durch Speichern des Filterstatus in der URL erhalten Sie die Schaltfläche "Button-Unterstützung" kostenlos und erlauben Ihren Benutzern, diesen gefilterten Status als Lesezeichen oder Link beizubehalten.

+5

Was ist, wenn Ihre Sicht sehr komplex ist und enthält Dutzende von Zuständen, vorgelesenen und gerenderten Daten? Sie können nicht alles in URL eingeben. Was ist mit Scroll-Position, auch? –

3

Sie könnten das tun, indem Sie etwas wie verwenden, um den Status in Ihrer gesamten Anwendung zu verwalten. Es würde als zentrale Speicher und zentrale Befehlsbibliothek (Aktionen)

var Reflux = require('reflux'); 

var actions = Reflux.createActions(
    ["getAction", "saveAction"] 
); 

var DataStore = Reflux.createStore({ 
    data: data, 
    listenables: [actions], 
    init: function() { 
    this.trigger(this.data); 
    }, 
    onGetAction: function() { 
    // some ajax if you like 
    }, 
    onSaveAction: function() { 
    // more ajax 
    }, 
    getInitialState: function() { 
    return this.data; 
    } 
}); 

var App = React.createClass({ 
    mixins: [Reflux.connect(DataStore, 'datastore')], 
    render: function() { 
    var d = this.state.datastore; 
    return (
    ... 
+0

Ja, ich habe gerade meine Frage bearbeitet, um festzustellen, dass ich bereits Reflux benutze. Würden Sie vorschlagen, einen Store zu verwenden, um diese Informationen zu speichern? Das macht Sinn, obwohl ich bisher Reflux verwendet habe, um eine externe API zu verbinden, so scheint mir diese Verwendung etwas fremd zu sein. –

+0

Ich habe gerade etwas Zeit über Reflux als auch gelernt ... kein Experte, gelinde gesagt, aber ich werde zugeben, dass die egghead.io Videos sind ziemlich hilfreich, wenn auch ein bisschen begrenzt – Incognos

Verwandte Themen