Innerhalb von useEffect werden zwei bedingte Verzweigungen ausgelöst, wenn die Seite aktualisiert wird
P粉798343415
2023-09-03 14:09:00
<p>Dies ist der <code>useEffect</code>-Code in der React-Komponente. </p>
<pre class="brush:js;toolbar:false;"> 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])
</pre>
<p>Es verwendet Supabase, um die Authentifizierung (Sitzung) zu verwalten. </p>
<p>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. </p>
<p><code>"Auf der Seite bleiben"</code> und <code>Zur Anmeldung gehen</code>/<code>Zur Anmeldung gehen</code>. </p>
<blockquote>
<p>Ich denke, das liegt daran, dass sich die <code>session</code> nach der Aktualisierung geändert hat. Wenn die Sitzung zum ersten Mal nicht definiert ist, wird der zweite Zweig <code>router.push</code> ausgelöst. </p>
</blockquote>
<p>Irgendwelche Vorschläge, wie man das Problem umgehen kann? Oder gibt es <strong>bewährte Vorgehensweisen</strong> für den Umgang mit Seitenaktualisierungen in React/NextJS? Oder ist schon einmal jemand auf ähnliche oder identische Probleme gestoßen? </p>
在您的代码中,只要会话或路由器的值发生更改(useEffect 的第二个参数),就会执行 useEffect。因此,if 和 else 都不会在 useEffect 的同一次运行中执行,尽管是在可能快速连续执行的两次不同运行中执行。
这是实现您所追求的目标的一种方法。
示例实现:
终于,我找到了根本原因。
它来自 supabase auth helper,它是一个异步函数,它不包含是否正在加载或错误的状态,这意味着它在开始(这意味着它正在加载)。
解决这个问题的简单方法是直接使用
useSessionContext
。session
仍将以异步方式获取,但可以通过同步方式获取isLoading
和error
状态来解决此问题,并且它们可用于useEffect
内的条件分支。新代码将如下所示: