如何在反应路由器转换中保持状态
How to persist state across react router transitions
我已经设置了相当典型的 react-router 应用程序:
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 以及 react-router。
您可以使用 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 (
...
我会 url 保存列表的状态过滤器和页码。
反应路由器之一 "Benefits of this Approach" 是:
URL 是您的第一个想法,而不是事后的想法。
url 是网络的基础部分,充分利用它,不要试图回避它。
通过在 url 中保存过滤状态,您可以免费获得后退按钮支持,并允许您的用户将该过滤状态保留为书签或 link。
您可以使用子项或渲染而不是组件,以便在导航到另一个组件后隐藏而不是卸载组件。请记住,卸载组件是 React 和 React-router 中做事的标准方式,因为它使 DOM 更小,因此更快。
例如:
<Route path={/some-path} children={({ match }) => {
return (
<div style={{ display: match ? 'block' : 'none' }}>
<YourComponentHere/>
</div>
)
}}
/>
我已经设置了相当典型的 react-router 应用程序:
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 以及 react-router。
您可以使用 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 (
...
我会 url 保存列表的状态过滤器和页码。
反应路由器之一 "Benefits of this Approach" 是: URL 是您的第一个想法,而不是事后的想法。
url 是网络的基础部分,充分利用它,不要试图回避它。
通过在 url 中保存过滤状态,您可以免费获得后退按钮支持,并允许您的用户将该过滤状态保留为书签或 link。
您可以使用子项或渲染而不是组件,以便在导航到另一个组件后隐藏而不是卸载组件。请记住,卸载组件是 React 和 React-router 中做事的标准方式,因为它使 DOM 更小,因此更快。 例如:
<Route path={/some-path} children={({ match }) => {
return (
<div style={{ display: match ? 'block' : 'none' }}>
<YourComponentHere/>
</div>
)
}}
/>