【发布时间】:2020-06-01 20:46:17
【问题描述】:
我有一个上下文 (AuthContext),它可以让我知道用户是否经过身份验证。我还创建了一个受保护的路由,如果用户通过身份验证,我可以登录到 DashBoard,否则重定向到登录。但是,我在将这两者连接在一起时遇到了问题。
ProtectedRoute.js
import React from 'react';
import { Route, Redirect } from 'react-router-dom';
import { AuthContext } from './AuthContext';
const ProtectedRoute = ({ component: Component, ...rest }) => {
return (
<AuthContext.Consumer>
{(context) => {
const { isAuthenticated } = this.context;
return (
<Route
{...rest}
render={(props) => {
const { isAuthenticated } = this.context; //getting an error here
if (isAuthenticated) {
return <Component {...props} />;
} else {
return (
<Redirect
to={{
pathname: '/',
state: {
from: props.location,
},
}}
/>
);
}
}}
/>
);
}}
</AuthContext.Consumer>
);
};
export default ProtectedRoute;
AuthContext.js
import React, { Component, createContext } from 'react';
export const AuthContext = createContext();
class AuthContextProvider extends Component {
state = {
isAuthenticated: false,
};
toggleAuth = () => {
this.setState({ isAuthenticated: !this.state.isAuthenticated });
};
render() {
return (
<AuthContext.Provider
value={{ ...this.state, toggleAuth: this.toggleAuth }}>
{this.props.children}
</AuthContext.Provider>
);
}
}
export default AuthContextProvider;
编辑的代码(得到一个错误,说渲染不是一个函数)
import React from 'react'
import { Route, Redirect } from 'react-router-dom'
import { AuthContext } from './AuthContext'
const ProtectedRoute = ({component: Component, ...rest}) => {
return (
<AuthContext.Consumer>
{({context}) => (
<Route
{...rest}
render={(props) => {
const {isAuthenticated} = context;
if(isAuthenticated) {
return <Component {...props} />;
} else {
return (
<Redirect
to={{
pathname: "/",
state: {
from: props.location
}
}}
/>
);
}
}}
/>
)};
</AuthContext.Consumer>
)
}
export default ProtectedRoute
【问题讨论】:
标签: javascript reactjs routes react-router react-context