#現在やっていること
React Typescript laravel styled-componentsでtodoリストのポートフォリオを作成しています
#解決したいこと
ログイン時と非ログイン時でガードのようなものをしてリロードしてもログイン状態を維持するようにプログラムしているのですが、ログイン状態でhome以外のページでリロードを行うとhomeにリダイレクトしてしまいます。ログイン時のそのページがそのまま表示されてほしいです
#考えられそうな原因
ログイン状態の取得はリロードする度にlaravelにapiで問い合わせており、ログインしていなかったらログイン画面に、逆にログインしているのにログイン画面にアクセスしようとしたらhomeにリダイレクトするようにガードで実現しています。コンソールで見ている感じ何回もログイン情報を取りに行っているため、この2つを行き来している可能性があるのですがどうすればリダイレクト前に確実にログイン情報を手に入れられるのかよく分かりません。これが原因かは分かりませんが、自分の考えだけ載せておきます
どなたかリロードした際にそのままのページが表示されるやり方を教えていただけると助かります。
ComponentRouter.tsx
import { VFC } from "react"; import { BrowserRouter, Route, Switch, Redirect } from "react-router-dom"; import styled from "styled-components"; import { Login } from "../components/pages/Login"; import { Home } from "../components/pages/logined/Home"; import { Top } from "../components/pages/Top"; import { Register } from "../components/pages/Register"; import { AuthRoute } from "./AuthRoute"; import { GuestRoute } from "./GuestRoute"; import { DefaultLayout } from "../components/templates/DefaultLayout"; import { LoginedLayout } from "../components/templates/LoginedLayout"; import { AddGroup } from "../components/pages/logined/action/AddGroup"; import { Quadrant } from "../components/pages/logined/Quadrant"; import { Group } from "../components/pages/logined/Group"; import { Edit } from "../components/pages/logined/action/Edit"; import { Help } from "../components/pages/Help"; import { path } from "../assets/data/path"; import { AddTask } from "../components/pages/logined/action/AddTask"; import { ActionLayout } from "../components/templates/ActionLayout"; export const ComponentRouter: VFC = () => { return ( <SComponentContainer> <BrowserRouter> <Switch> <Route exact path={path.top}> <DefaultLayout> <Top /> </DefaultLayout> </Route> <Route path={path.help}> <DefaultLayout> <Help /> </DefaultLayout> </Route> <GuestRoute path={path.login}> <DefaultLayout> <Login /> </DefaultLayout> </GuestRoute> <GuestRoute path={path.register}> <DefaultLayout> <Register /> </DefaultLayout> </GuestRoute> <AuthRoute path={path.home}> <LoginedLayout> <Home /> </LoginedLayout> </AuthRoute> <AuthRoute path={path.quadrant}> <LoginedLayout> <Quadrant /> </LoginedLayout> </AuthRoute> <AuthRoute path={path.group}> <LoginedLayout> <Group /> </LoginedLayout> </AuthRoute> <AuthRoute path={path.edit}> <ActionLayout> <Edit /> </ActionLayout> </AuthRoute> <AuthRoute path={path.addgroup}> <ActionLayout> <AddGroup /> </ActionLayout> </AuthRoute> <AuthRoute path={path.addtask}> <ActionLayout> <AddTask /> </ActionLayout> </AuthRoute> <Route path="*"> <Redirect to={{ pathname: path.top }} /> </Route> </Switch> </BrowserRouter> </SComponentContainer> ); }; const SComponentContainer = styled.div` //色の指定 color: white; background-color: #423c3c; `;
AuthRoute.tsx
import React, { VFC } from "react"; import { Route, Redirect } from "react-router-dom"; import { useAuth } from "../hooks/useAuth"; import { useAuthContext } from "../providers/AuthProvider"; type propsType = { path: string; children: React.ReactNode; }; export const AuthRoute: VFC<propsType> = (props) => { const { isLogin } = useAuthContext(); useAuth(); const { path, children } = props; return ( <Route path={path} render={({ location }) => isLogin ? ( children ) : ( <Redirect to={{ pathname: "/login", state: { from: location }, }} /> ) } /> ); };
GuestRoute.tsx
React
1import React, { VFC } from "react"; 2import { Route, Redirect } from "react-router-dom"; 3import { useAuthContext } from "../providers/AuthProvider"; 4 5type propsType = { 6 path: string; 7 children: React.ReactNode; 8}; 9 10export const GuestRoute: VFC<propsType> = (props) => { 11 const { isLogin } = useAuthContext(); 12 const { path, children } = props; 13 return ( 14 <Route 15 path={path} 16 render={({ location }) => 17 isLogin ? ( 18 <Redirect 19 to={{ 20 pathname: "/home", 21 state: { from: location }, 22 }} 23 /> 24 ) : ( 25 children 26 ) 27 } 28 /> 29 ); 30}; 31
useAuth.tsx
import { useAuthContext } from "../providers/AuthProvider"; import axios from "axios"; export const useAuth = async () => { const { setIsLogin } = useAuthContext(); try { const res = await axios.get("/api/auth"); setIsLogin(res.data.isLogin); console.log("useAuth:ログイン情報を取得しisLoginセットしました"); } catch (error) { console.log("useAuth:ログイン情報が取得出来ませんでした"); } };
追記
AuthProvider.tsx
1import React, { createContext, useContext, useState, VFC } from "react"; 2 3const AuthContext = createContext( 4 {} as { 5 isLogin: boolean; 6 setIsLogin: React.Dispatch<React.SetStateAction<boolean>>; 7 } 8); 9 10type propsType = { 11 children: React.ReactElement; 12}; 13 14export const AuthProvider: VFC<propsType> = (props) => { 15 const { children } = props; 16 const [isLogin, setIsLogin] = useState<boolean>(false); 17 return ( 18 <AuthContext.Provider value={{ isLogin, setIsLogin }}> 19 {children} 20 </AuthContext.Provider> 21 ); 22}; 23 24export const useAuthContext = () => { 25 return useContext(AuthContext); 26}; 27
回答2件
あなたの回答
tips
プレビュー