Di dalam useEffect, dua cawangan bersyarat dicetuskan apabila halaman dimuat semula
P粉798343415
2023-09-03 14:09:00
<p>Ini ialah <code>useEffect</code> kod dalam komponen React. </p>
<pre class="brush:js;toolbar:false;"> import { useSession } daripada '@supabase/auth-helpers-react'
const session = useSession()
useEffect(() => {
jika (sesi) {
console.debug('kekal dalam halaman')
} lain {
console.debug('log masuk masuk')
router.push('/login').then(
() =>
console.debug('log masuk selesai')
}
)
}
}, [sesi, penghala])
</pra>
<p>Ia menggunakan supabase untuk mengurus pengesahan (sesi). </p>
<p>Terdapat masalah yang sangat pelik semasa menyegarkan halaman (tiada masalah sama sekali dengan log masuk dan log keluar semula melalui penghala, ia hanya muncul apabila halaman dimuat semula.), kedua-dua cawangan akan dicapai, jadi dalam js, kita boleh melihat Log cawangan bersyarat daripada dua cawangan. </p>
<p><kod>"Kekal di halaman"</kod> dan <kod>Pergi ke log masuk</kod>/<kod>Pergi untuk log masuk selesai</kod>. </p>
<blockquote>
<p>Saya rasa ini disebabkan <kod>sesi</code> berubah selepas muat semula. Kali pertama ia tidak ditentukan, cawangan kedua <code>router.push</code> dicetuskan dengan serta-merta. </p>
</blockquote>
<p>Ada sebarang cadangan tentang cara mengatasinya? Atau adakah terdapat <strong>amalan baik</strong> untuk mengendalikan penyegaran halaman dalam React/NextJS? Atau ada sesiapa yang menghadapi masalah yang sama atau sama sebelum ini? </p>
Dalam kod anda, useEffect akan dilaksanakan apabila nilai sesi atau penghala berubah (parameter kedua useEffect). Oleh itu, if no else tidak dilaksanakan dalam larian useEffect yang sama, walaupun ia dilaksanakan dalam dua larian berbeza yang mungkin dilaksanakan secara berturut-turut.
Ini adalah salah satu cara untuk mencapai apa yang anda idamkan.
Contoh pelaksanaan:
Akhirnya, saya jumpa puncanya.
Ia datang daripada cangkuk supabase auth helper, ia adalah fungsi async, ia tidak mengandungi status sama ada ia sedang dimuatkan atau ralat, yang bermaksud ia berada pada permulaan (yang bermaksud ia sedang dimuatkan).
Cara mudah untuk menyelesaikan masalah ini ialah menggunakan
masih akan diambil secara tidak segerak, tetapi masalah ini boleh diselesaikan dengan mengambil statususeSessionContext
。useSessionContext
session
仍将以异步方式获取,但可以通过同步方式获取isLoading
和error
状态来解决此问题,并且它们可用于useEffect
secara terus.session
isLoading
dan
secara serentak, dan ia boleh digunakan dalam cawangan bersyarat dalamerror
useEffect🎜. 🎜 🎜Kod baharu akan kelihatan seperti ini: 🎜