[英]Dynamic Role Based Routing (React-Router)
我正在开发与电子商务相关的产品,并且有两种类型的用户(客户和卖方)。 两种类型的用户都有自己的主页(彼此完全不同)。 现在,如果客户已登录,我想在客户主页上路由/,如果卖家帐户已登录,我要路由到卖家主页。 否则,它应该转到目标网页。 如何使用react-router
和此样板实现此功能?
我尝试执行以下操作(但没有成功):
{
path: '/',
name: 'home',
getComponent(nextState, cb) {
let HomePagePath = 'containers/HomePage';
if (customerLoggedIn) {
HomePagePath = 'containers/CustomerHomePage';
}
const importModules = Promise.all([
import(HomePagePath),
]);
const renderRoute = loadModule(cb);
importModules.then(([component]) => {
renderRoute(component);
});
importModules.catch(errorLoading);
},
},
我正在使用React Boilerplate做类似的事情。 这是要点:
在routes.js中定义一个onEnter
函数
onEnter:redirectToLogin,路径:'/ account',名称:'account',getComponent(nextState,cb){...
在routes.js
导入功能
导出默认函数createRoutes(store){//使用getHooks工厂常量创建可重复使用的异步注入器{injectSagas,redirectToLogin,redirectToDashboard} = getHooks(store);
在app/utils/hooks.js
创建重定向功能。 您可以在此处根据用户角色进行重定向。
导出函数redirectToLogin(store){//设置路径名以启用重定向setPath(); return(nextState,replace)=> {if(!user(store)){replace({pathname:'/',state:{nextPathname:nextState.location.pathname}}); } else {if(user(store).account_status ==='closed'){replace({pathname:'/ closedaccount',state:{nextPathname:nextState.location.pathname}}); }}}; }
从app/utils/hooks.js
导出重定向功能
导出函数getHooks(store){return {injectReducer:injectAsyncReducer(store),injectSagas:injectAsyncSagas(store),redirectToLogin:redirectToLogin(store),
我在这里找到了一篇文章,要点是在这里写的。 您可以像这样向组件添加道具
<Route path="/" component={App}>
//BOD routes
<Route authorisedUsers={['KR']} path="/home" component={HomeContainer} />
//HR routes
<Route authorisedUsers={['HR']} path="/hrhome" component={HRDashboardContainer} />
//common routes
<Route authorisedUsers={['KR', 'HR']} path="/notes" component={NotesContainer} />
然后在您的组件中添加以下代码,该代码在path ='/'上呈现
Role based routing react redux
componentDidUpdate() {
const {
children, //Component to be rendered (HomeContainer if route = '/home')
pathname: {location}, //location.pathname gives us the current url user is trying to hit. (with react router)
profileId, //profileId required by profile page common to all user journeys.
role } = this.props;
this.reRoute(role, this.props.children, location.pathname, ProfileId)
}
decideRoute(role, ProfileId) { //decide routes based on role
if(role==='HR')
return 'hrhome';
else if(role==='KR')
return 'home';
else if(role==='USER'&&ProfileId)
return 'profile/'+ProfileId;
else
return '/error';
}
isAuthorised(authorisedUsers, role) {
return _.includes(authorisedUsers, role)
}
reRoute(role, children, path, ProfileId) {
if(role===null && path!=='/') // user hit a different path without being authenticated first
{
hashHistory.replace('/'); //this is where we implemented login
return;
}
let route = this.decideRoute(role, ProfileId) //if role has already been fetched from the backend, use it to decide the landing page for each role.
if(children) // if we already are on one of the user journey screens ...
{
const authorisedUsers = children.props.route.authorisedUsers
if(!this.isAuthorised(authorisedUsers,role)) //... and the user is not allowed to view this page...
hashHistory.replace(`/${route}/`); //... redirect him to the home page corresponding to his role.
}
else
hashHistory.replace(`/${route}/`); // if the user has just logged in(still on / page or login page), and we know his role, redirect him to his home page.
}//if none of these holds true, user is allowed to go ahead and view the page
从本质上讲,这将添加一个网关检查,该检查将在所有容器上起作用,并根据您的角色指导您。 此外,如果您以某种方式输入了错误的网址,它也将不允许您访问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.