Maybe you can take advantage of the onEnter and onChange callbacks when configure rootRoute.
In onEnter callback back you can record the initial route path. In onChange callback you can compare cur/next route path, check recorded path history, and record path. Therefor since you can check and compare route path every time route changes, you can stop any circular links.
About save all component's state, if you use redux, the whole app state can save in an object, the redux store.
If you want save component's state at that time before leave, you can dispatch a save component state
action in componentWillUnmount
, and recover state in componentWillMount
.
Here is a snippet:
var rootRoute = {
path: '/',
onEnter: enter,
onChange: change,
component: MyApp,
indexRoute: { component: Home },
childRoutes: [
LoginRoute,
...
{path: 'home', component: Home},
{
path: '*',
component: NotFound
}
]
};
function enter (next) {
// pathStore record all navigation history
pathStore.record(next.location.pathname);
}
function change (cur, next, c) {
// when hit cur path links in nav, pathname is same, key is different.
if (cur.location.pathname !== next.location.pathname) {
...
}
}