Routing 如何使用React路由器&x27;s重定向功能?

Routing 如何使用React路由器&x27;s重定向功能?,routing,reactjs,react-router,Routing,Reactjs,React Router,我想用以下方式配置React路由器。如果某个路由匹配,用户将被重定向到另一个路由。声明这是可能的,但没有提供实现这一点的确切方法。有人对此有见解吗 type EnterHook=(nextState:RouterState,replaceState:RedirectFunction,callback?:Function)=>any; 类型重定向函数=(状态:?位置状态,路径名:路径名|路径,查询:?查询)=>void; 编辑有关新的、未弃用的react路由器语法,请参阅其他答案 有一个很好的例

我想用以下方式配置React路由器。如果某个路由匹配,用户将被重定向到另一个路由。声明这是可能的,但没有提供实现这一点的确切方法。有人对此有见解吗

type EnterHook=(nextState:RouterState,replaceState:RedirectFunction,callback?:Function)=>any;
类型重定向函数=(状态:?位置状态,路径名:路径名|路径,查询:?查询)=>void;
编辑有关新的、未弃用的react路由器语法,请参阅其他答案


有一个很好的例子说明了如何在中使用
oneter
钩子。以下是相关代码:

函数requireAuth(nextState,replaceState){
如果(!auth.loggedIn())
replaceState({nextPathname:nextState.location.pathname},“/login”)
}
渲染((
),document.getElementById('example'))
如您所见,当访问
/dashboard
路由时,将调用
requireAuth
函数。它接收两个参数:
nextState
,它是一个表示用户即将进入的状态的对象;和
replaceState
,一个可以被调用以将该状态替换为其他状态的对象。在这种情况下,如果用户未登录,
requireAuth
调用
replaceState
,如下所示:

replaceState({ nextPathname: nextState.location.pathname }, '/login')
第二个参数显然是用户将被重定向到的路径名。第一个参数是一个对象,它可以包含我们希望路由处理程序(在本例中是
Login
组件)拥有的任何数据。在这里,用户试图转到的路径名(
/dashboard
)被设置为
nextPathname
属性,因此在登录后,用户可以重定向到该页面(请参阅
Login
组件中的
handleSubmit
方法)


如果用户登录,
requireAuth
什么也不做,而且由于从来没有调用过
replaceState
,因此路由照常工作,也就是说呈现了
仪表板组件。

对于从react router 2.0.0开始阅读此问题的任何人来说,replaceState(状态、路径名、查询)现在不推荐使用。现在必须使用位置描述符替换(位置)

根据他们的指南:

// v1.0.x
(nextState, replaceState) => replaceState(null, '/foo')
(nextState, replaceState) => replaceState(null, '/foo', { the: 'query' })

// v2.0.0
(nextState, replace) => replace('/foo')
(nextState, replace) => replace({ pathname: '/foo', query: { the: 'query' } })

下面是如何使用
react router
2.0.0(使用
replace
而不是
replaceState
)执行此操作的示例:

在router.jsx中:

功能要求授权(下一状态,替换){
如果(!userExists()){
替换({
路径名:'/sign',
状态:{nextPathname:nextState.location.pathname}
})
}
}
导出常量renderRoutes=()=>(
);
然后,在
SignIn
组件中,您可以在成功登录后重定向,如下所示:

replaceState({ nextPathname: nextState.location.pathname }, '/login')
从'react router'导入{browserHistory};
signInFunction({params},(err,res)=>{
//现在在登录回调中
如果(错误)
警报(“请重试”)
否则{
const location=this.props.location
if(location.state&&location.state.nextPathname){
browserHistory.push(location.state.nextPathname)
}否则{
browserHistory.push(“/”)
}
}
})

感谢您的详尽回答!我使用的是通用渲染,不幸的是,这种方法导致302个重定向。有没有办法在服务器请求的情况下使用301重定向?有谁能告诉我nextState和replaceState是如何作为函数参数注入的?@Bacem
requireAuth
是作为其
onEnter
属性传递给路由组件的正常函数。Route调用函数就像调用one React组件中的任何事件处理程序一样,例如
this.props.oneter(nextState,replaceState)
。(还请注意,如果您正在查找有关react router当前版本的信息,那么这个答案非常古老。)似乎OneNet方法已被弃用。请告诉我其他的选择。当我们使用replace函数时,它不会在重定向时保留存储状态。我该怎么做?我的意思是,如何在next routeHi@user3241111中传递存储状态(以及动作调度器),我在下面添加了一个答案,希望能帮助澄清。谢谢你的答案。有两件事与上面的示例和我的场景不同。首先,我的身份验证是基于令牌的,不像将他重定向到同一应用程序中的作为路由(在我的情况下不是)的登录表单。第二例。。在您执行replace(路径名:'/signin'..)时,我已经知道我的用户是否已登录,条件“if(userExists())”始终为TRUE,因为他肯定已登录。。我只想替换为“/notFound”页面,但加载此路由时应用程序状态丢失。我想保护一些组件免受登录用户的攻击。我的应用程序是同构的,所以问题来了。。我将我的身份验证令牌与“返回url”一起发送到其他url,后者对令牌进行了身份验证,并将重定向发送回“返回url”。因此,如果我使用“cb()”,它会重定向到受保护的URL,并保留我的用户详细信息,但如果我使用“replace('/notFound')”,它会忘记状态。。在我需要cb()或replace(..)的实例中,服务器状态已经有了userDetails,我想将其传递给“notFound”路由。