Maison > Questions et réponses > le corps du texte
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.
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 />} }
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
session
useSessionContext
。 session
仍将以异步方式获取,但可以通过同步方式获取 isLoading
和 error
状态来解决此问题,并且它们可用于 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
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épondre0