cari

Rumah  >  Soal Jawab  >  teks badan

Bagaimana untuk menghalang tetapan semula keadaan apabila memanggil penetap keadaan dalam pustaka pihak ke-3

Saya cuba menukar komponen kelas React kepada komponen fungsi React.

Terdapat fungsi onChange yang boleh dipanggil dalam dan luar komponen. Cangkuk useState mendapat nilai awal apabila fungsi komponen fungsi dipanggil. Apabila saya menggunakan cara komponen kelas lama semuanya berfungsi dengan baik. Mengapa ini berlaku dan bagaimana untuk menyelesaikannya?

const MyInput = (props) => {
  const { someLib, ...otherProps } = props;
  const [test, setTest] = useState(1); // console show 1,2,3, etc
            
  useEffect(() => {
    someLib && someLib.addCallback(onChange);
  }, []);

  const onChange = (event) => { 
    setTest(test + 1) // this function can called inside MyInput, and from someLib, 
                      // when it called from someLib, 'test' is reset, but in class component everything good 
  }
}

P粉835428659P粉835428659503 hari yang lalu662

membalas semua(1)saya akan balas

  • P粉514001887

    P粉5140018872023-09-11 22:01:16

    Masalahnya onChange 是一个过时的闭包。您需要做的是使 onChange kelihatan seperti ini:

    const onChange = (event) => {
        setTest(oldTest => oldTest +1)
    }
    

    Sebagai alternatif, anda boleh meletakkan test 添加到 useEffect dalam tatasusunan dependencies, tetapi pastikan untuk membersihkannya. (Anda sepatutnya melakukan ini, tetapi ia lebih penting sekarang)

    useEffect(() => {
        someLib && someLib.addCallback(onChange);
    
        return () => {
            someLib.removeCallback(onChange);
        }
    }, [someLib, test]);
    

    Secara teknikal, jika anda melakukan kaedah yang terakhir, anda perlu useCallback

    const onChange = useCallback((event) => {
        setTest(test + 1);
    }, [test]);
    
    useEffect(() => {
        someLib && someLib.addCallback(onChange);
    
        return () => {
            someLib.removeCallback(onChange);
        }
    }, [someLib, onChange]);
    

    Kelebihan ini ialah anda tidak perlu menjejaki senarai pergantungan onChange 的依赖项。 onChange di tempat yang berbeza sekarang setelah ia ditutup.

    balas
    0
  • Batalbalas