在我的应用中,我正在使用react-router v2 - https://github.com/reactjs/react-router
我在onEnter
中的重定向问题:
某个组件
static async onEnter({ flux }, nextState, replace, callback) {
const token = flux.getStore('auth').getAccessToken();
if (!token) {
replace('/login');
return callback();
}
}
我正在使用服务器端呈现并使用了本指南 - https://github.com/reactjs/react-router/blob/master/docs/guides/ServerRendering.md#async-routes,因为它说我还需要在客户端上使用match
:
client.js
RouterMatch({history: browserHistory, routes: patchedRouteHooks(routes)}, (error, redirectLocation, renderProps) => {
// renderProps are `undefined` when replace from onEnter hook
ReactDOM.render(
<Router {...renderProps} createElement={passFluxToComponent} />,
mountNode,
);
});
routes.js
const routes = (
<Route path="/" component={AppHandler}>
<Route path="/" component={AuthHandler}>
<Route path="login(/)" component={LoginFormHandler} />
<Route path="signup(/)" component={SignupFormHandler} />
<Route path="resetpassword(/)" component={ResetPasswordFormHandler} />
<Route path="changepassword(/)" component={ChangePasswordFormHandler} />
<Route path="logout(/)" component={LogoutHandler} />
</Route>
<Route path="/" component={AppLayoutHandler}>
<Route path="/" component={EnsureAuthHandler}>
<Route path="me/favorites(/)" component={FavoritePropertiesHandler} />
<Route path="me/settings(/)" component={UserSettingsHandler} />
<Route path="dashboard(/)(:status)(/)" component={DashboardFlowHandler} />
<IndexRoute component={DashboardFlowHandler} />
</Route>
<Route path="/s(/)" component={SearchResultsHandler} />
<Route path="/user/:id(/)" component={UserDetailsHandler} />
<IndexRoute component={EnsureAuthHandler} />
</Route>
<IndexRoute component={AppLayoutHandler} />
</Route>
);
export default routes
patchRouteHooks.js
function patchRouteHooks (Route, patchData = {}) {
const { props: { children, component } } = Route;
function _patchChildren (children) {
if (Array.isArray(children)) {
return React.Children.map(children, ChildRoute => patchRouteHooks(ChildRoute, patchData));
} else {
return patchRouteHooks(children, patchData);
}
}
return {
...Route,
props: {
...Route.props,
onEnter: component && component.onEnter && function (...args) {
component.onEnter.call(null, patchData, ...args);
},
onLeave: component && component.onLeave && function (...args) {
component.onLeave.call(null, patchData, ...args);
},
children: children ? _patchChildren(children) : null
}
};
}
export default patchRouteHooks;
在onEnter中替换后,我将renderProps作为undefined
接收,这会在控制台和破坏的应用中产生警告:
有什么建议我做错了吗?谢谢!
答案 0 :(得分:0)
正如你所说,renderProps是undefined
。
我没有传递renderProps,而是做了一些粗略的事情:
ReactDOM.render(
<Router history={browserHistory} routes ={patchedRouteHooks(routes)} createElement={passFluxToComponent} />,
mountNode,
);
无法完全理解匹配是异步进行的,并且拥有功能完善的应用程序(使用服务器渲染)而没有它,我只是停止使用它:)
您可以保留当前的实现(匹配)并将回退渲染包装在
中 if (redirectLocation) {
...my proposition
} else {
...your implementation
}