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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Firebase Authentication

Firebase Authenticationは、Firebaseを利用したユーザーの認証機能です。バックエンドサービス、SDK、アプリでのユーザー認証に使用できるUIライブラリが用意されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

Q&A

1回答

264閲覧

reactのuseEffectを使った際に、別のコンポーネントへリダイレクトした際にもなぜかuseEffectが読まれてしまう。

servus.k

総合スコア0

Firebase Authentication

Firebase Authenticationは、Firebaseを利用したユーザーの認証機能です。バックエンドサービス、SDK、アプリでのユーザー認証に使用できるUIライブラリが用意されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

0グッド

0クリップ

投稿2023/11/13 11:45

編集2023/11/13 11:47

実現したいこと

ログインユーザーがログイン画面にアクセスした場合、メインメニューページにリダイレクトさせる。その際にその旨を伝えるアラートを表示。
ここまではできているのですが、このアラートが、通常のログアウト状態からのログインでも表示されてしまうため、それを回避したい。

前提

reactアプリをTypeScript、firebase authenticationを使って、ユーザー管理機能を持ったシステムを作っています。
すでにログインしているユーザーのログイン画面への遷移はあるべき挙動ではないため、MainMenuページへのリダイレクトをするという機能を実装中に、以下の意図しない挙動が発生しました。

発生している問題

ログインユーザーに関する求める挙動は、求めるままに実現できました。ログイン中のため、メインメニューに移動します。という旨のアラートが表示され、okボタンを押すとMainMenuへ遷移します。
ですが、ログアウトをし、通常のログインを実行した際に、ログイン自体はできるのですが、ページ遷移直前に先述のアラートが出てしまい、okボタンを押すことでページ遷移がされます。本来、この通常のログインではアラートは必要なく、すぐにログインされて欲しいシーンです。

該当のソースコード

Typescript

1 useEffect(() => { 2 const unsubscribe = auth.onAuthStateChanged((user) =>{ 3 if (user) { 4 navigate("/mainMenu"); 5 alert("ログイン中のため、メインメニューに移動します") 6 } 7 }); 8 return () => { 9 unsubscribe(); 10 } 11 },[]);

試したこと

コードを直接変更したというよりは、useEffectの挙動に関する学習に努めました。現状の解釈としては、第二引数の配列の中に何も指定をしなければ、レンダリング時の一度だけuseEffectが実行されるということがわかりました。

補足情報(FW/ツールのバージョンなど)

firebase authentication
react-router-dom v6.15.?
ログイン機能、ログアウト機能、MainMenuページ等は正常に動いているため、該当する箇所と思われるコードだけを記載させていただきました。質問自体の経験が未熟なため、もし記載した以外に考慮に必要となるコードがあれば教えてください。追記します。

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

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

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

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

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

hoshi-takanori

2023/11/13 18:16

その useEffect をどのコンポーネントに書いて、そのコンポーネントをどう使ってるかの問題のような…。
servus.k

2023/11/14 11:06

@hoshi-takanori さん コメントありがとうございます! useEffectはLogin.tsxというファイルでログインに関するビューとロジックを持ったコンポーネントの中で記述しています。なので、ログインページに遷移した際(初回レンダリングした際)にuseEffectが読まれ、その時にログアウト状態であればuseEffectの中のif条件に該当しないため、何も起こらずuseEffectを終了し、記載してないですがこのuseEffectより下に記述してある通常のログインを実行するだけだと思うのですが。 useEffectの挙動に関する理解不足があるのでしょうか。
guest

回答1

0

提示された useEffect の記述は

マウントしたときにログイン済みかどうかチェックして、ログイン済みであれば navigate

ではなく

マウントしたときに「『ログイン済み』に状態が変わるたびに毎回 navigate する」イベントハンドラを登録する

という動作になっています。


なので、useEffect 云々よりも、

  • auth のどの機能を使うか検討する
  • 「useRef でフラグを用意し、イベントハンドラの中とかで true にする。そのフラグが true のときには navigate しない」のような方法で暴発を防ぐのが適切かと思います。

投稿2023/11/17 16:06

編集2023/11/17 16:07
honey32

総合スコア169

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問