reactjs - Reactjs 从函数内部重定向
问题描述
我有一个带有注销按钮的标题/导航栏功能组件。当用户成功注销时,我希望他们被重定向到登录路由。
使用react-router-dom
我已经尝试导入和使用, Redirect
,History
但它们似乎都没有重定向。withRouter
props.history.push
我见过的所有答案和教程都使用类组件。
import React, { useState, useEffect } from "react";
import { Link, NavLink, useHistory, withRouter } from "react-router-dom";
import { Auth } from "aws-amplify";
function NavBar(props) {
const [isAuthenticating, setIsAuthenticating] = useState(true);
const [isAuthenticated, userHasAuthenticated] = useState(false);
useEffect(() => {
onLoad();
}, []);
async function onLoad() {
try {
await Auth.currentSession();
userHasAuthenticated(true);
} catch (e) {
if (e !== "No current user") {
alert(e);
}
}
setIsAuthenticating(false);
}
async function signOut() {
console.log("Signing out.");
await Auth.signOut();
userHasAuthenticated(false);
props.history.push("/login"); // Cannot get redirect to work
console.log("Signed out.");
}
return (
...
<Nav className='d-md-down-none' navbar>
...
<UncontrolledDropdown>
<DropdownMenu right>
...
<DropdownItem onClick={signOut}>
<i className='fa fa-lock'></i> Logout
</DropdownItem>
</DropdownMenu>
</UncontrolledDropdown>
</Nav>
);
}
export default NavBar;
单击注销按钮后,Cognito 身份验证会话数据全部被正确擦除,浏览器控制台中同时显示“退出”和“退出”,但不会重定向用户,控制台中也没有错误或警告。
NavBar 是更高级别 Layout 组件的子组件。
解决方案
请创建一个文件“useRouter.js”
import {useContext} from 'react'
import {__RouterContext} from 'react-router'
export default () => useContext(__RouterContext);
并插入以下内容
import useRouter from 'path to useRouter.js'
...
function SignUpForm(props: any) {
...
const router = useRouter()
...
router.history.push('/signin'); // write this where you want to push
}
推荐阅读
- azure - 向 Azure CLI 添加预览扩展时如何禁用(红色)警告?
- jenkins - 如何避免“。”的问题 在 DSL 文件 [Jenkins] 中的标识符中?
- javascript - 如何将参数传递给地图函数中的事件处理程序
- python - 从层次聚类中检索具有 > n 个成员的聚类
- javascript - 当用户将元素滚动到视口中时触发一个函数 – Vanilla JavaScript
- nginx - 入口规则未重定向到部署
- email - 带有文本引用的 SAS 电子邮件
- reactjs - 反应遵循什么架构模式?
- dialogflow-es - 验证插槽填充输入
- android - 如何绕过 JSON 中的“空”值?