useEffect 内では、ページが更新されると 2 つの条件付き分岐がトリガーされます
P粉798343415
P粉798343415 2023-09-03 14:09:00
0
2
497

これは React コンポーネントの useEffect コードです。

 import { useSession } from '@supabase/auth-helpers-react' const session = useSession() useEffect(() => { if (セッション) { console.debug('ページに留まる') } それ以外 { console.debug('ログインに移動') router.push('/login').then( () => { console.debug('ログイン完了へ移動') } ) } }, [セッション、ルーター]) 

認証(セッション)の管理にはsupabaseを使用します。

ページを更新するときに非常に奇妙な問題が発生します (ルーターを介したログインとログアウトのリダイレクトにはまったく問題はありません。この問題はページが更新されたときにのみ表示されます)。両方のブランチに到達します。 js コンソールでは、2 つのブランチからログの条件分岐が確認できます。

「ページに留まる」 および ログインに移動/ログイン完了に移動

<ブロック引用>

これは、更新後に session が変更されたためだと思います。初めて未定義の場合、2 番目のブランチ router.push がトリガーされます。セッションが見つかると、最初のブランチ stays on the page がすぐにトリガーされます。

これを回避する方法について何か提案はありますか?それとも、React/NextJS でページの更新を処理するための 良い実践方法はありますか?それとも、以前に同様または同じ問題に遭遇した人はいますか?

P粉798343415
P粉798343415

全員に返信 (2)
P粉276876663

コードでは、セッションまたはルーターの値が変更されるたびに useEffect が実行されます (useEffect の 2 番目のパラメーター)。したがって、if も else も useEffect の同じ実行では実行されませんが、これらは急速に連続して実行される 2 つの異なる実行で実行されます。

これは、あなたが求めているものを達成するための 1 つの方法です。

  1. useState を使用して変数の状態を作成および管理する
  2. useEffect では、セッションをチェックするロジックを適用して状態を設定 (または設定しません)
  3. 現在のページをレンダリングするか、戻り値でログイン ページを表示します。

実装例:

リーリー
いいねを押す+0
    P粉035600555

    ついに根本原因が分かりました。

    これはsupabase auth helper、これは非同期関数です。ロード中か間違っているかのステータスは含まれていません。つまり、最初にあることを意味します(ロード中であることを意味します)。読み込み中)。

    この問題を解決する簡単な方法は、useSessionContextを直接使用することです。sessionは引き続き非同期で取得されますが、isLoadingerrorステータスを同期的に取得してこの問題を解決でき、これらをuseEffect で使用できます。内の条件分岐。

    新しいコードは次のようになります:

    リーリー

    いいねを押す+0
      最新のダウンロード
      詳細>
      ウェブエフェクト
      公式サイト
      サイト素材
      フロントエンドテンプレート
      私たちについて 免責事項 Sitemap
      PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!