cari

Rumah  >  Soal Jawab  >  teks badan

React/Next kemas kini keadaan dan set semula selepas useEffect

Saya cuba menstrim data daripada api, tetapi semasa pemaparan, useEffect dipanggil beberapa kali, di mana semasa memuatkan halaman awal, semuanya berfungsi dengan baik kecuali dipanggil beberapa kali, tetapi apabila saya menyegarkan penyemak imbas Pada halaman dalam , perkara yang sama berlaku, tetapi teamData juga ditetapkan kepada batal selepas dimuatkan.

const router = useRouter();
    const { id } = router.query;

    const [teamData, setTeamData] = useState(null);
    const [loading, setLoading] = useState(true);

    useEffect(() => {
        GetTeamData(id).then((value) => {
            setTeamData(value);
            setLoading(false);
            console.log("Got Value")
        })
    }, [id])

Keadaan hanya dirujuk dalam kod yang selebihnya, tetapi tidak pernah ditetapkan lagi selepas coretan ini. Bagaimanakah saya boleh membuat React/Next stop tetapan semula teamData kepada null, dan sebagai bonus, bagaimanakah saya boleh membuatnya hanya memanggil useEffect sekali?

P粉908643611P粉908643611430 hari yang lalu503

membalas semua(2)saya akan balas

  • P粉032649413

    P粉0326494132023-09-12 10:31:56

    useEffect mempunyai id sebagai kebergantungan, jadi saya rasa nilai id berubah beberapa kali, menyebabkan komponen itu dipaparkan semula. Walau bagaimanapun, saya mengesyorkan anda berkongsi maklumat lanjut kerana coretan ini tidak banyak dipaparkan.

    Mengapa tidak menggunakan prop sisi pelayan? Lihat contoh di bawah.

    import type { InferGetServerSidePropsType, GetServerSideProps } from 'next'
     
    type Repo = {
      name: string
      stargazers_count: number
    }
     
    export const getServerSideProps: GetServerSideProps<{
      repo: Repo
    }> = async () => {
      const res = await fetch('https://api.github.com/repos/vercel/next.js')
      const repo = await res.json()
      return { props: { repo } }
    }
     
    export default function Page({
      repo,
    }: InferGetServerSidePropsType<typeof getServerSideProps>) {
      return repo.stargazers_count
    }

    balas
    0
  • P粉773659687

    P粉7736596872023-09-12 00:03:33

    Ada dua sebab mengapa kesan anda tercetus beberapa kali.

    1. Parameter pertanyaan penghala halaman Next.js tidak ditentukan semasa pemaparan awal - https://nextjs.org/docs/pages/api-reference/functions/use-router#router-object

    2. React 18 Nyahpasang dan pasang semula komponen dalam mod pembangunan apabila menggunakan mod ketat - https://react.dev/blog/2022/03/08/react-18-upgrade-guide#updates-to-strict-mod< /p>

    Sila lihat jika menulis semula kesan anda seperti berikut menyelesaikan masalah anda.

    useEffect(() => {
      let shouldCancel = false;
    
      if (id !== undefined) {
        GetTeamData(id).then((value) => {
          if (!shouldCancel) {
            setTeamData(value);
            setLoading(false);
            console.log("Got Value");
          }
        });
      }
    
      return () => {
        shouldCancel = true;
      };
    }, [id]);
    

    balas
    0
  • Batalbalas