成功登录后,我尝试管理会话,同时重定向到表单提交的某些页面。
我通常会在类组件中这样做:
componentDidMount() {
if (context.token) {
return <Redirect to="/" />
}
}
因此,我想使用React钩子;以下代码未重定向到任何地方:
import React, { useEffect } from "react";
import ReactDOM from "react-dom";
import { BrowserRouter, Switch, Route, Redirect, Link } from "react-router-dom";
es6
const HomePage = props => (
<div>
<h1>Home</h1>
</div>
);
const AboutUsPage = props => {
useEffect(() => {
redirectTo();
}, []);
return (
<div>
<h1>About us</h1>
</div>
);
};
function redirectTo() {
return <Redirect to="/" />;
}
function App() {
return (
<div className="App">
<BrowserRouter>
<nav>
<Link to="/">Home</Link>
<Link to="/us">About us</Link>
</nav>
<Switch>
<Route exact path="/" component={HomePage} />
<Route exact path="/us" component={AboutUsPage} />
</Switch>
</BrowserRouter>
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
工作沙箱:https://codesandbox.io/s/blue-river-6dvyv?fontsize=14
我已经读到,如果钩子useEffect()
返回一个函数,它将仅在卸载组件时起作用。但是在安装组件时,它应该重定向。
有什么建议吗?预先感谢。
答案 0 :(得分:1)
您可以在状态上设置redirect
变量,并基于该变量在渲染器中重定向:
const AboutUsPage = props => {
const [redirect, setRedirect] = useState(false);
useEffect(() => {
setRedirect(true); // Probably need to set redirect based on some condition
}, []);
if (redirect) return redirectTo();
return (
<div>
<h1>About us</h1>
</div>
);
};
答案 1 :(得分:0)
您可以使用它,以便组件根据是否给页面赋予令牌来有选择地呈现页面。
const AboutUsPage = ({token}) => (
token ? (
<Redirect to="/" />
) : (
<div>
<h1>About us</h1>
</div>
)
);
但是,如果您仍然想在使用React Hooks实现上下文时使用上下文,则可以阅读如何在此article中将context
与钩子一起使用。它向您展示了如何仅用几行代码就能将context
整合到React中。
import React, {createContext, useContext, useReducer} from 'react';
export const StateContext = createContext();
export const StateProvider = ({reducer, initialState, children}) =>(
<StateContext.Provider value={useReducer(reducer, initialState)}>
{children}
</StateContext.Provider>
);
export const useStateValue = () => useContext(StateContext);
完成了钩子和上下文操作后,您的AboutUsPage
组件将类似于以下内容。
import { useStateValue } from './state';
const AboutUsPage = () => {
const [{token}, dispatch] = useStateValue();
return token ? (
<Redirect to="/" />
) : (
<div>
<h1>About us</h1>
</div>
);
};