Rumah  >  Soal Jawab  >  teks badan

setInterval Penyampaian semula tanpa had bagi komponen tindak balas-lengkap. Mengapa ini berlaku dan bagaimana untuk membetulkannya?

Ini kod tindak balas saya. Ia menjadikan komponen itu dipaparkan semula tanpa had:

const [seconds, setSeconds] = useState(60)
useEffect(() => {
    const interval = setInterval(() => {
        setSeconds(seconds => seconds - 1);
    }, 1000);
    return () => clearInterval(interval);
}, []);

console.log("object");

P粉978742405P粉978742405221 hari yang lalu445

membalas semua(1)saya akan balas

  • P粉476046165

    P粉4760461652024-04-04 14:48:25

    Ini berlaku kerana anda hanya mengosongkan selang apabila komponen memunggah, yang hanya berlaku apabila pengguna menavigasi keluar dari halaman.

    Mungkin ini yang anda perlukan? Apabila selang mencapai 0, saya mengosongkannya. Tetapi untuk ini saya perlu menggunakan rujukan, saya tidak boleh menggunakan keadaan dari setInterval kerana ia hanya mempunyai nilai awal:

    export default function App() {
      const [seconds, setSeconds] = useState(5);
      const secondsRef = useRef(seconds);
    
      useEffect(() => {
        const interval = setInterval(() => {
          if (secondsRef.current < 0) {
            clearInterval(interval);
          }
    
          secondsRef.current = secondsRef.current - 1;
          setSeconds((seconds) => seconds - 1);
        }, 1000);
        return () => clearInterval(interval);
      }, []);
    
      console.log("running", new Date());
    
      return 

    {seconds < 0 ? "Time is up!" : seconds}

    ; }

    balas
    0
  • Batalbalas