Rumah >hujung hadapan web >tutorial js >Mengapakah Menggunakan `setInterval` dengan Cangkuk Keadaan Bertindak Menyebabkan Gelagat Tidak Dijangka?

Mengapakah Menggunakan `setInterval` dengan Cangkuk Keadaan Bertindak Menyebabkan Gelagat Tidak Dijangka?

Barbara Streisand
Barbara Streisandasal
2024-12-08 13:43:12851semak imbas

Why Does Using `setInterval` with React State Hooks Cause Unexpected Behavior?

Menggunakan React State Hooks dengan setInterval: Memahami Isu Kemas Kini Negeri

Dalam React, menggunakan cangkuk keadaan dalam setInterval boleh menyebabkan masalah dengan kemas kini negeri. Ini timbul apabila fungsi panggil balik dihantar ke setInterval mengekalkan akses kepada nilai keadaan awal, menghalang kemas kini berikutnya daripada ditunjukkan.

Masalahnya

Pertimbangkan komponen Jam berikut:

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

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

Isunya terletak pada fungsi panggil balik setTime. Ia merujuk pembolehubah masa pada masa pemaparan pertama, bukan nilai dikemas kini daripada pemaparan berikutnya. Akibatnya, kemas kini keadaan adalah terhad kepada nilai awal.

Penyelesaian

Untuk membetulkan isu ini, gunakan borang panggil balik cangkuk keadaan, yang menyediakan akses kepada nilai keadaan semasa:

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

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

Kini, fungsi panggil balik dengan betul menggunakan nilai keadaan terkini, memastikan masa dikemas kini sebagai dijangka.

Pendekatan Alternatif

Dan Abramov meneroka cara lain untuk mengendalikan setInterval dengan cangkuk dalam catatan blognya, menawarkan pendekatan alternatif yang mungkin sesuai dengan senario tertentu.

Atas ialah kandungan terperinci Mengapakah Menggunakan `setInterval` dengan Cangkuk Keadaan Bertindak Menyebabkan Gelagat Tidak Dijangka?. 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