Dies ist der useEffect
-Code in der React-Komponente.
import { useSession } from '@supabase/auth-helpers-react' const session = useSession() useEffect(() => { if (Sitzung) { console.debug('auf der Seite bleiben') } anders { console.debug('gehe zum Login') router.push('/login').then( () => console.debug('goto login done') } ) } }, [Sitzung, Router])
Es verwendet Supabase, um die Authentifizierung (Sitzung) zu verwalten.
Es gibt ein sehr seltsames Problem beim Aktualisieren der Seite (es gibt überhaupt kein Problem mit der Anmelde- und Abmeldeumleitung über den Router, es erscheint nur, wenn die Seite aktualisiert wird.), beide Zweige werden erreicht, also im js-Konsole können wir den bedingten Protokollzweig aus zwei Zweigen sehen.
"Auf der Seite bleiben"
und Zur Anmeldung gehen
/Zur Anmeldung gehen
.
Ich denke, das liegt daran, dass sich die
session
nach der Aktualisierung geändert hat. Wenn die Sitzung zum ersten Mal nicht definiert ist, wird der zweite Zweigrouter.push
ausgelöst.
Irgendwelche Vorschläge, wie man das Problem umgehen kann? Oder gibt es bewährte Vorgehensweisen für den Umgang mit Seitenaktualisierungen in React/NextJS? Oder ist schon einmal jemand auf ähnliche oder identische Probleme gestoßen?
在您的代码中,只要会话或路由器的值发生更改(useEffect 的第二个参数),就会执行 useEffect。因此,if 和 else 都不会在 useEffect 的同一次运行中执行,尽管是在可能快速连续执行的两次不同运行中执行。
这是实现您所追求的目标的一种方法。
示例实现:
终于,我找到了根本原因。
它来自supabase auth helper,它是一个异步函数,它不包含是否正在加载或错误的状态,这意味着它在开始(这意味着它正在加载)。
解决这个问题的简单方法是直接使用
useSessionContext
。session
仍将以异步方式获取,但可以通过同步方式获取isLoading
和error
状态来解决此问题,并且它们可用于useEffect
内的条件分支。新代码将如下所示: