Как сохранить состояние через переходы между маршрутизаторами

У меня есть довольно типичное приложение для реагирования на маршрутизатор:

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'));
});

Моя проблема в том, что у моего компонента Todos есть некоторые фильтры поиска на нем, и я хочу сохранить эти фильтры при переходе на конкретный Todo и обратно. Очевидным решением является сохранение этих значений фильтра в состоянии App, но я не могу найти элегантный способ разрешить доступ Todos к состоянию App.

Любые подсказки?

Добавление. Это приложение использует Reflux, а также реагирующий маршрутизатор.

Ответ 1

Я бы URL-адрес, чтобы сохранить фильтры состояния и номера страниц для списков.

Один из реагирующих маршрутизаторов "Преимущества этого подхода": URL-адреса - это ваша первая мысль, а не задумка.

URL-адрес является основополагающей частью Интернета, используйте его в своих интересах, не пытаясь избежать его.

Сохраняя состояние фильтра в URL-адресе, вы получаете бесплатную поддержку кнопки, и вы позволяете своим пользователям сохранять это фильтрованное состояние в качестве закладки или ссылки.

Ответ 2

Вы можете сделать это, используя что-то вроде Reflux для управления состоянием всего вашего приложения. Он будет действовать как ваш центральный магазин и центральная командная библиотека (действия)

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 (
    ...

Ответ 3

Вы можете использовать дочерние элементы или рендеринг вместо компонента, чтобы скрывать, а не размонтировать компонент, когда переходите к другому. Имейте в виду, что размонтирование компонента является стандартным способом выполнения действий в React и React-router, поскольку он поддерживает DOM меньше и, следовательно, быстрее. например.:

    <Route path={/some-path} children={({ match }) => {
              return (
    <div style={{ display: match ? 'block' : 'none' }}>
        <YourComponentHere/>
    </div>
        )
      }}
    />