React Router 重定向呈现空白屏幕
React Router redirect rendering a blank screen
目前 ReactJS 和路由存在一个小问题。如果令牌不存在,我目前希望我的应用程序重定向回登录屏幕。该应用程序应该对其他页面进行零访问。如果用户尝试输入 url 以在没有有效令牌的情况下将其重定向,它应该默认返回登录页面。
目前我的代码如下
import { BrowserRouter, Route, Redirect, Switch } from 'react-router-dom';
...
render() {
const token = localStorage.getItem('access_token');
return (
<BrowserRouter>
{!token ? <Route render={() => <Redirect push to="/" />} /> :
<Switch>
<Route exact path="/" component={Login} />
<Route exact path="/validate" component={ValidateLoginContainer} />
<Route exact path="/home" component={Landing} />
<Route exact path="/non-arrivals" component={NonArrivals} />
<Route exact path="/due-in-summary" component={DueInSummary} />
<Route exact path="/due-in-forecast" component={DueInForecastDetail} />
<Route exact path="/hourly-arrivals-departures" component={HourlyArrivalsDepartures} />
<Route exact path="/overstays" component={Overstays} />
</Switch>
}
</BrowserRouter>
);
}
问题是重定向正常,但呈现空白屏幕。
更新代码,还是一样的错误:
<BrowserRouter>
<Switch>
<Route render={() => {
if (!token) {
return <Redirect push to="/" />;
}
return <Redirect push to="/home" />;
}}
/>
<Redirect exact from="/" to="/home" />
<Route exact path="/" component={Login} />
<Route exact path="/validate" component={ValidateLoginContainer} />
<Route exact path="/home" component={Landing} />
<Route exact path="/non-arrivals" component={NonArrivals} />
<Route exact path="/due-in-summary" component={DueInSummary} />
<Route exact path="/due-in-forecast" component={DueInForecastDetail} />
<Route exact path="/hourly-arrivals-departures" component={HourlyArrivalsDepartures} />
<Route exact path="/overstays" component={Overstays} />
</Switch>
</BrowserRouter>
好吧,您现在处于无限循环中,因为当用户尝试在没有令牌的情况下导航时,您将重定向到 /
但使用三元渲染时,您只渲染
<Route render={() => <Redirect push to="/" />} />
因此未定义 Login
的组件,您需要更改三元运算符以也始终呈现 Login
(基本上现在您只返回 redirect always when你没有令牌,这就是你有空白页的原因,你还需要在三元开关中添加登录路由,它应该在 true
分支而不是 false
分支内),或者更改实现喜欢:
authenticatedPage.js
export function authenticatedPage (Component) {
const componentName = Component.displayName || Component.name || 'Component'
return class extends React.Component {
static displayName = `Route(${componentName})`
renderPage () {
return (
<Component {...this.props} />
)
}
render () {
const token = localStorage.getItem('access_token');
if (token) {
return this.renderPage()
} else {
return <Redirect to='/login' />
}
}
}
}
index.js
import { authenticatedPage } from './authenticatedPage.js'
<BrowserRouter>
<Switch>
{/* Authentication Routes */}
<Redirect exact from='/' to='/home' />
<Route exact path='/login' component={Login} />
{/* Authenticated Routes */}
<Route exact path='/home' component={authenticatedPage(Landing)} />/> */}
</Switch>
</BrowserRouter>
目前 ReactJS 和路由存在一个小问题。如果令牌不存在,我目前希望我的应用程序重定向回登录屏幕。该应用程序应该对其他页面进行零访问。如果用户尝试输入 url 以在没有有效令牌的情况下将其重定向,它应该默认返回登录页面。
目前我的代码如下
import { BrowserRouter, Route, Redirect, Switch } from 'react-router-dom';
...
render() {
const token = localStorage.getItem('access_token');
return (
<BrowserRouter>
{!token ? <Route render={() => <Redirect push to="/" />} /> :
<Switch>
<Route exact path="/" component={Login} />
<Route exact path="/validate" component={ValidateLoginContainer} />
<Route exact path="/home" component={Landing} />
<Route exact path="/non-arrivals" component={NonArrivals} />
<Route exact path="/due-in-summary" component={DueInSummary} />
<Route exact path="/due-in-forecast" component={DueInForecastDetail} />
<Route exact path="/hourly-arrivals-departures" component={HourlyArrivalsDepartures} />
<Route exact path="/overstays" component={Overstays} />
</Switch>
}
</BrowserRouter>
);
}
问题是重定向正常,但呈现空白屏幕。
更新代码,还是一样的错误:
<BrowserRouter>
<Switch>
<Route render={() => {
if (!token) {
return <Redirect push to="/" />;
}
return <Redirect push to="/home" />;
}}
/>
<Redirect exact from="/" to="/home" />
<Route exact path="/" component={Login} />
<Route exact path="/validate" component={ValidateLoginContainer} />
<Route exact path="/home" component={Landing} />
<Route exact path="/non-arrivals" component={NonArrivals} />
<Route exact path="/due-in-summary" component={DueInSummary} />
<Route exact path="/due-in-forecast" component={DueInForecastDetail} />
<Route exact path="/hourly-arrivals-departures" component={HourlyArrivalsDepartures} />
<Route exact path="/overstays" component={Overstays} />
</Switch>
</BrowserRouter>
好吧,您现在处于无限循环中,因为当用户尝试在没有令牌的情况下导航时,您将重定向到 /
但使用三元渲染时,您只渲染
<Route render={() => <Redirect push to="/" />} />
因此未定义 Login
的组件,您需要更改三元运算符以也始终呈现 Login
(基本上现在您只返回 redirect always when你没有令牌,这就是你有空白页的原因,你还需要在三元开关中添加登录路由,它应该在 true
分支而不是 false
分支内),或者更改实现喜欢:
authenticatedPage.js
export function authenticatedPage (Component) {
const componentName = Component.displayName || Component.name || 'Component'
return class extends React.Component {
static displayName = `Route(${componentName})`
renderPage () {
return (
<Component {...this.props} />
)
}
render () {
const token = localStorage.getItem('access_token');
if (token) {
return this.renderPage()
} else {
return <Redirect to='/login' />
}
}
}
}
index.js
import { authenticatedPage } from './authenticatedPage.js'
<BrowserRouter>
<Switch>
{/* Authentication Routes */}
<Redirect exact from='/' to='/home' />
<Route exact path='/login' component={Login} />
{/* Authenticated Routes */}
<Route exact path='/home' component={authenticatedPage(Landing)} />/> */}
</Switch>
</BrowserRouter>