Rumah >hujung hadapan web >tutorial js >Mengapa Cangkuk `setInterval` React Saya Gagal Mengemas kini Keadaan dengan Betul?

Mengapa Cangkuk `setInterval` React Saya Gagal Mengemas kini Keadaan dengan Betul?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-12 17:02:10400semak imbas

Why Does My React `setInterval` Hook Fail to Update State Properly?

State Trap Within React's setInterval Hook

Apabila menggunakan React's useState hook dalam setInterval, adalah penting untuk mengetahui kemungkinan cabaran: kemas kini keadaan mungkin tidak mencerminkan seperti yang dijangkakan.

Dalam contoh kod yang disediakan, walaupun cuba menambah keadaan masa setiap saat, ia kekal tersekat pada 0. Ini kerana panggilan balik dalam setInterval terikat dengan nilai masa awal dan tidak mempunyai akses kepada kemas kini keadaan seterusnya.

Penyelesaian: Menggunakan Borang Panggilan Balik useState

Untuk menyelesaikan isu ini, gunakan borang panggil balik useState. Ini membolehkan panggilan balik mengakses nilai keadaan semasa sebelum mengemas kininya.

setTime(prevTime => prevTime + 1); // Updates based on current state

Kemas Kini Pelaksanaan:

function Clock() {
  const [time, setTime] = React.useState(0);
  React.useEffect(() => {
    const timer = window.setInterval(() => {
      setTime(prevTime => prevTime + 1);
    }, 1000);
    return () => {
      window.clearInterval(timer);
    };
  }, []);

  return (
    <div>Seconds: {time}</div>
  );
}

Bonus: Pendekatan Alternatif

Untuk maklumat lanjut tentang pengendalian setInterval dengan cangkuk, rujuk Dan Catatan blog Abramov, yang meneroka kaedah alternatif, seperti menggunakan rujukan atau cangkuk useReducer.

Atas ialah kandungan terperinci Mengapa Cangkuk `setInterval` React Saya Gagal Mengemas kini Keadaan dengan Betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn