我有一个页面可以验证用户,并在验证成功后将其重定向到登录页面。但是,使用redirect
的URL会更改,但不会呈现Login
的新页面。如何获取新页面以呈现?
App.js
var child;
render() {
if (this.state.toLogin && !this.state.mounted) {
<Route exact path="/Login" component={Login} />;
<Route exact strict path="/" render={({location}) => {
if (location.pathname === window.location.pathname) {
return <Redirect to="/Login"/>;
}
return null;
}}
return(
<div className="App">
<ReactCSSTransitionGroup
transitionName="remove"
transitionEnterTimeout={100}
transitionLeaveTimeout={100}>
{child}
</ReactCSSTransitionGroup>
</div>
);
}
Index.js
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>,
document.getElementById('root')
);
编辑:根据答案进行了更改,但是URL并未更改,页面也没有呈现
答案 0 :(得分:5)
如果使用的是react-router-dom
,则将组件导出包装在withRouter
提供的react-router-dom
中。
,所有组件的用法都应从render返回。那么只有反应知道要渲染什么。
import React from 'react'
import { withRouter, Redirect } from 'react-router-dom';
class App extends React.Component {
render() {
if (this.state.toLogin && !this.state.mounted) {
return (
<React.Fragment>
<Route exact path="/Login" component={Login} />
<Route exact strict path="/" render={({location}) => {
if (location.pathname === window.location.pathname) {
return <Redirect to="/Login"/>;
}
return null;
}} />
</React.Fragment>
);
}
return (
<div className="App">
<ReactCSSTransitionGroup
transitionName="remove"
transitionEnterTimeout={100}
transitionLeaveTimeout={100}>
{child}
</ReactCSSTransitionGroup>
</div>
)}
}
export default withRouter(App)
答案 1 :(得分:0)
您需要删除组件的“ exact”和“ component = {Login}”并添加新的组件<Route exact path="/Login" component={Login} />
render() {
if (this.state.toLogin && !this.state.mounted) {
<Route exact path="/Login" component={Login} />
<Route exact strict path="/" render={({location}) => {
if (location.pathname === window.location.pathname) {
return <Redirect to="/Login"/>;
}
return null;
}} />
}
好运!
答案 2 :(得分:0)
请不要在此处执行此操作,请使用您的身份验证中间件根据授权/权限进行重定向。
答案 3 :(得分:0)
为了使路由正常工作,使用Route的组件必须接收Route参数
在您的情况下,App组件似乎没有接收Route参数作为道具。您可以简单地将其呈现为默认路线,也可以使用withRouter
HOC来包装App组件
ReactDOM.render(
<BrowserRouter>
<Route component={App} />
</BrowserRouter>,
document.getElementById('root')
);
答案 4 :(得分:0)
您错过了几次回报。您的render函数必须返回您的路线,并且您的路线必须包装在某些元素上。
render() {
if (this.state.toLogin && !this.state.mounted) {
return (
<React.Fragment>
<Route exact path="/Login" component={Login} />
<Route exact strict path="/" render={({location}) => {
if (location.pathname === window.location.pathname) {
return <Redirect to="/Login"/>;
}
return null;
}} />
</React.Fragment>
);
}
return //Something according to your logic
}
答案 5 :(得分:0)
确保路由标签中的“ component”和“ path”关键字应使用小写字母(Component代替Component)
答案 6 :(得分:-1)
似乎您不返回路线。尝试将路线移动到要初始化路由器的地方,并用App包装它:
<Router>
<Route component={App}>
<Route exact path="/Login" component={Login} />;
<Route exact strict path="/" render={({location}) => {
if (location.pathname === window.location.pathname) {
return <Redirect to="/Login"/>;
}
return null;
}/>
</Route>
</Router>
然后在您的App组件中,仅使用子项来呈现页面内容:
render() {
return (
<div className="App">
<ReactCSSTransitionGroup
transitionName="remove"
transitionEnterTimeout={100}
transitionLeaveTimeout={100}
>
{this.props.children}
</ReactCSSTransitionGroup>
</div>
);
}