質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Authentication

Authentication(認証)は正当性を認証する為の工程です。ログイン処理等で使われます。

Q&A

0回答

1667閲覧

状態管理をswrやreact-queryで行う場合の認証について

maskmelon

総合スコア63

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Authentication

Authentication(認証)は正当性を認証する為の工程です。ログイン処理等で使われます。

0グッド

0クリップ

投稿2021/03/20 09:46

ログイン時にページリロードなしで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};

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問