#javascript #reactjs
Вопрос:
Я использую пользовательский хук, который возвращает true, если пользователь вошел в систему, иначе вернет false.
useAuth.js
импорт { useEffect, useState } из «react»;
const useAuth = () => {
const [isAuth, setIsAuth] = useState();
useEffect(() => {
setIsAuth(localStorage.getItem("auth"));
}, []);
if (!!isAuth) {
console.log("Auth", isAuth);
return true;
}
return false;
};
export default useAuth;
Я хочу динамически перенаправлять пользователей на /панель мониторинга, если они вошли в систему, или /войти, если они не вошли в систему.
Войдите в систему.jsx
const Login = () => {
function onLogin() {
localStorage.setItem("auth", "token");
}
return <button onClick={onLogin}>Login</button>;
};
export default Login;
Панель мониторинга.jsx
const Dashboard = () => {
return <h1>Dashboard</h1>;
};
export default Dashboard;
У меня есть отдельный файл для обработки маршрутизации
Router.js
import { BrowserRouter, Redirect, Route, Switch } from "react-router-dom";
import useAuth from "./useAuth";
import Dashboard from "./Dashboard";
import Login from "./Login";
const Router = () => {
const isAuth = useAuth();
const routes = [
{
path: "/login",
component: Login,
},
{
path: "/dashboard",
component: Dashboard,
},
];
return (
<>
<BrowserRouter>
<Switch>
{routes.map((route) => {
return (
<Route
key={route.path}
exact
path={route.path}
component={route.component}
/>
);
})}
<Redirect to={isAuth ? "/dashboard" : "/login"} />
</Switch>
</BrowserRouter>
</>
);
};
export default Router;
Но он всегда перенаправляется на «/вход». Есть какой-нибудь способ решить эту проблему?
Ссылка на Codesandbox : https://codesandbox.io/s/inspiring-joliot-h89gq?file=/src/Router.js
Комментарии:
1. Привет, Аби,
<Switch />
компонент отобразит первого соответствующего ребенка, поэтому, если вы уже/login
подключены к одному из них, или/dashboard
вы никогда никуда не будете перенаправлены. Если вы перейдете на такой маршрут, как/xyz
вы, однако, будете перенаправлены в зависимости от вашего статуса аутентификации.2.
this.props.history.push('/login');
3. @AmirSaleem не может считывать реквизиты неопределенных свойств
4. @JackGore То, что я хотел сделать, это перенаправить на /войти, если не аутентифицирован, и на /панель мониторинга, если аутентифицирован
5. @Abi, с помощью которого вам необходимо экспортировать свой компонент
withRouter(MyComponent)
. Вы можете импортировать с помощью маршрутизатора изreact-router-dom
Ответ №1:
@Abi Разместите оператор перенаправления вне оператора переключения, он будет работать. для получения дополнительной информации см. Этот выпуск на github — https://github.com/ReactTraining/react-router/issues/6840.