Bagaimana untuk menghalang tetapan semula keadaan apabila memanggil penetap keadaan dalam pustaka pihak ke-3
P粉835428659
P粉835428659 2023-09-10 22:56:16
0
1
660

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粉835428659
P粉835428659

membalas semua(1)
P粉514001887

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan