Maison  >  Questions et réponses  >  le corps du texte

Dans useEffect, deux branches conditionnelles sont déclenchées lorsque la page est actualisée

<p>Il s'agit du code <code>useEffect</code> </p> <pre class="brush:js;toolbar:false;"> importer { useSession } depuis '@supabase/auth-helpers-react' const session = utiliserSession() useEffect(() => { si (session) { console.debug('rester dans la page') } autre { console.debug('aller à la connexion') router.push('/login').then( () => console.debug('goto login done') } ) } }, [session, routeur]) ≪/pré> <p>Il utilise supabase pour gérer l'authentification (session). </p> <p>Il y a un problème très étrange lors de l'actualisation de la page (il n'y a aucun problème avec la redirection de connexion et de déconnexion via le routeur, il n'apparaît que lorsque la page est actualisée.), les deux branches seront atteintes, donc dans le js, nous pouvons voir la branche conditionnelle du journal à partir de deux branches. </p> <p><code>"Rester sur la page"</code> et <code>Accéder à la connexion</code>/<code>Accéder à la connexion terminée</code>. </p> <blockquote> <p>Je pense que cela est dû au changement de <code>session</code> La première fois qu'elle est indéfinie, la deuxième branche <code>router.push</code> est déclenchée. Lorsque la session est trouvée, la première branche <code>reste sur la page</code> </p> </blockquote> <p>Des suggestions sur la façon de contourner ce problème ? Ou existe-t-il des <strong>bonnes pratiques</strong> pour gérer les actualisations de pages dans React/NextJS ? Ou est-ce que quelqu'un a déjà rencontré des problèmes similaires ou identiques ? </p>
P粉798343415P粉798343415434 Il y a quelques jours629

répondre à tous(2)je répondrai

  • P粉276876663

    P粉2768766632023-09-04 12:40:54

    Dans votre code, useEffect sera exécuté à chaque fois que la valeur de la session ou du routeur change (le deuxième paramètre de useEffect). Par conséquent, ni if ​​ni else ne sont exécutés dans la même exécution de useEffect, bien qu'ils soient exécutés dans deux exécutions différentes qui peuvent être exécutées en succession rapide.

    C'est une façon d'atteindre ce que vous recherchez.

    1. Utilisez useState pour créer et gérer l'état des variables
    2. Dans useEffect, vérifiez la session en appliquant une logique pour définir (ou non) l'état
    3. Rendu la page actuelle ou afficher la page de connexion en retour.

    Exemple de mise en œuvre :

    const App = (props) => {
      const [isLoggedIn, setIsLoggedIn] = useState(false);
      
      useEffect(()=>{
        //apply the logic and set the state
        if(logic) setIsLoggedIn(true);
      },[]) 
      
      return  {isLoggedIn ? <ActiveApp /> : <Login />}
    
    }

    répondre
    0
  • P粉035600555

    P粉0356005552023-09-04 00:28:17

    Enfin, j'ai trouvé la cause profonde.

    Il vient du hook supabase auth helper, c'est une fonction asynchrone, elle ne contient pas d'état indiquant si elle est en cours de chargement ou d'erreur, ce qui signifie qu'elle est au début (ce qui signifie qu'elle est en cours de chargement).

    Le moyen simple de résoudre ce problème est d'utiliser directement useSessionContext. La sessionuseSessionContextsession 仍将以异步方式获取,但可以通过同步方式获取 isLoadingerror 状态来解决此问题,并且它们可用于 useEffect sera toujours récupérée de manière asynchrone, mais ce problème peut être résolu en récupérant les statuts isLoading

    et error

    de manière synchrone, et ils peuvent être utilisés dans des branches conditionnelles dans useEffect

    . 🎜 🎜Le nouveau code ressemblera à ceci : 🎜
      import { useSessionContext } from '@supabase/auth-helpers-react'
      const {isLoading, session} = useSessionContext()
      useEffect(() => {
    
        if (isLoading) {
          console.debug('show loading page')
        }
        else if (session) {
          console.debug('stay in page')
        } 
        else {
          console.debug('goto login')
          router.push('/login').then(
            () => {
              console.debug('goto login done')
            }
          )
        }
      }, [session, isLoading, router])
    
    

    répondre
    0
  • Annulerrépondre