Rumah  >  Soal Jawab  >  teks badan

Di dalam useEffect, dua cawangan bersyarat dicetuskan apabila halaman dimuat semula

<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>
P粉798343415P粉798343415434 hari yang lalu626

membalas semua(2)saya akan balas

  • P粉276876663

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

    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.

    1. Gunakan useState untuk mencipta dan mengurus keadaan pembolehubah
    2. Dalam useEffect, semak sesi dengan menggunakan logik untuk menetapkan (atau tidak menetapkan) keadaan
    3. Render halaman semasa atau tunjukkan halaman log masuk sebagai balasan.

    Contoh pelaksanaan:

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

    balas
    0
  • P粉035600555

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

    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 useSessionContextuseSessionContextsession 仍将以异步方式获取,但可以通过同步方式获取 isLoadingerror 状态来解决此问题,并且它们可用于 useEffect secara terus. session

    masih akan diambil secara tidak segerak, tetapi masalah ini boleh diselesaikan dengan mengambil status isLoading

    dan error

    secara serentak, dan ia boleh digunakan dalam cawangan bersyarat dalam useEffect🎜. 🎜 🎜Kod baharu akan kelihatan seperti ini: 🎜
      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])
    
    

    balas
    0
  • Batalbalas