ログイン時にページリロードなしでNavBarにユーザー名を表示させたいです。
状態管理にreact-queryを使っており、NavBarコンポーネントのトップレベルでプロフィールデータを取得するようになっています。
ログイン時にNavBarコンポーネントを再レンダリングしてプロフィール情報を取得したいのですが、よい方法はないでしょうか?
ログインメソッド内でqueryClient.refetchQueries("me")
としてみたのですが、うまく行きませんでした。
なお、リロードするとユーザー名が表示されます。
typescript
1// サーバーからプロフィール情報を取得するカスタムフック 2import { customAxios } from "@/utils/customAxios"; 3import { useQuery } from "react-query"; 4 5export const useMeQuery = () => { 6 return useQuery("me", async () => { 7 const { data } = await customAxios.get("/api/users/me"); 8 return data; 9 }); 10}; 11
typescript
1// ログイン処理を行うメソッドを返すカスタムフック 2import { customAxios } from "@/utils/customAxios"; 3import { useRouter } from "next/router"; 4import { useQueryClient } from "react-query"; 5 6export const useLoginUser = () => { 7 const queryClient = useQueryClient(); 8 const router = useRouter(); 9 const loginUser = async (userInput: { 10 username: string; 11 password: string; 12 }) => { 13 const { data } = await customAxios.post("/api/auth/login", userInput); 14 localStorage.setItem("token", data); 15 queryClient.refetchQueries("me"); 16 router.push("/"); 17 }; 18 return loginUser; 19}; 20
typescript
1// ログイン状態に応じて表示が変化するナビゲーションバー 2export const NavBar: React.FC = () => { 3 const { data } = useMeQuery(); //ログインしたときにデータを取得し直して再レンダリングしたい 4 const logoutUser = useLogoutUser(); 5 6 let body = null; 7 8 if (!data) { 9 body = ( 10 <> 11 <NextLink href="/login"> 12 <Link mr={2}>Login</Link> 13 </NextLink> 14 <NextLink href="/register"> 15 <Link>Register</Link> 16 </NextLink> 17 </> 18 ); 19 } else { 20 body = ( 21 <Flex> 22 <Box mr={2}>{data.username}</Box> 23 <Button variant="link" onClick={() => logoutUser()}> 24 logout 25 </Button> 26 </Flex> 27 ); 28 } 29 return ( 30 <Flex zIndex={2} position="sticky" top={0} bg="teal" p={4}> 31 <Box ml={"auto"}>{body}</Box> 32 </Flex> 33 ); 34};
あなたの回答
tips
プレビュー