我想创建一个带有登录名的 React 应用程序。为了维护用户状态,我想使用React 16.3 引入的Context API。在实现登录路由时,我遵循了React Router 文档中的示例。
下面的源代码(如我所愿)是我的问题的一个非常简化的最小示例。当我localhost:3000/protected
在浏览器中打开时,URL 正确更改为localhost:3000/login
,但未显示该组件。该render()
方法似乎没有被调用。
如何说服 React 渲染我的登录组件?
这是我的源代码。
应用程序.js
import React, {Component} from 'react';
import {
BrowserRouter as Router,
Route
} from 'react-router-dom'
import Login from "./Login";
import Protected from "./Protected";
import ProtectedRoute from "./ProtectedRoute";
import UserContext from "./UserContext";
export default class App extends Component {
render() {
return (
<Router>
<UserContext.Provider value={false}>
<div>
<ProtectedRoute path='/protected' component={Protected}/>
<Route path='/login' component={Login}/>
</div>
</UserContext.Provider>
</Router>
);
}
}
登录.js
import React from 'react';
export default class Login extends React.Component {
render() {
return <p>Login</p>;
}
}
用户上下文.js
import React from "react";
const UserContext = React.createContext();
export default UserContext;
ProtectedRoute.js
import React from 'react'
import {Redirect, Route} from "react-router-dom";
import UserContext from './UserContext';
const ProtectedRoute = ({component: Component, ...rest}) => (
<Route {...rest} render={props =>
<UserContext.Consumer>
{loggedIn =>
loggedIn === true
? <Component {...props} />
: <Redirect to={{
pathname: '/login',
state: {from: props.location}
}}/>
}
</UserContext.Consumer>
}
/>
);
export default ProtectedRoute;
受保护的.js
import React from 'react';
export default class Protected extends React.Component {
render () {
return <h2>protected</h2>;
}
}