Inilah masalahnya: Saya mencoba memanggil 2 fungsi dengan mengklik tombol. Kedua fungsi memperbarui status (Saya menggunakan hook useState). Fungsi pertama memperbarui value1 dengan benar ke 'baru 1', tetapi setelah fungsi 1s (setTimeout) kedua diaktifkan, dan ia mengubah nilai 2 menjadi 'baru 2' TETAPI! Ini mengatur value1 kembali ke '1'. Mengapa ini terjadi? Terima kasih sebelumnya!
import React, { useState } from "react";
const Test = () => {
const [state, setState] = useState({
value1: "1",
value2: "2"
});
const changeValue1 = () => {
setState({ ...state, value1: "new 1" });
};
const changeValue2 = () => {
setState({ ...state, value2: "new 2" });
};
return (
<>
<button
onClick={() => {
changeValue1();
setTimeout(changeValue2, 1000);
}}
>
CHANGE BOTH
</button>
<h1>{state.value1}</h1>
<h1>{state.value2}</h1>
</>
);
};
export default Test;
javascript
reactjs
react-hooks
Bartek
sumber
sumber
changeValue2
?useState
atau digunakanuseReducer
.const [state, ...]
, dan kemudian merujuknya di setter ... Ini akan menggunakan status yang sama sepanjang waktu.useState
panggilan terpisah , satu untuk setiap "variabel".Jawaban:
Selamat datang di neraka penutupan . Masalah ini terjadi karena setiap kali
setState
dipanggil,state
mendapat referensi memori baru, tetapi fungsichangeValue1
danchangeValue2
, karena penutupan, tetap menggunakanstate
referensi awal yang lama .Solusi untuk memastikan
setState
darichangeValue1
danchangeValue2
mendapatkan status terbaru adalah dengan menggunakan panggilan balik (memiliki status sebelumnya sebagai parameter):Anda dapat menemukan diskusi yang lebih luas tentang masalah penutupan ini di sini dan di sini .
sumber
Fungsi Anda harus seperti ini:
Dengan demikian Anda memastikan Anda tidak kehilangan properti apa pun yang ada dalam kondisi saat ini dengan menggunakan status sebelumnya saat aksi dipecat. Juga dengan demikian Anda menghindari keharusan mengelola penutupan.
sumber
Ketika
changeValue2
dipanggil, keadaan awal ditahan sehingga negara kembali ke keadaan awal dan kemudianvalue2
properti ditulis.Lain kali
changeValue2
dipanggil setelah itu, ia memegang status{value1: "1", value2: "new 2"}
, sehinggavalue1
properti ditimpa.Anda memerlukan fungsi panah untuk
setState
parameter.sumber
Apa yang terjadi adalah keduanya
changeValue1
danchangeValue2
melihat status dari render tempat mereka dibuat , jadi ketika komponen Anda membuat untuk pertama kalinya 2 fungsi ini melihat:Ketika Anda mengklik tombol,
changeValue1
dipanggil pertama dan ubah status menjadi{value1: "new1", value2: "2"}
seperti yang diharapkan.Sekarang, setelah 1 detik,
changeValue2
dipanggil, tetapi fungsi ini masih melihat status awal ({value1; "1", value2: "2"}
), jadi ketika fungsi ini memperbarui keadaan dengan cara ini:setState({ ...state, value2: "new 2" });
Anda berakhir melihat:
{value1; "1", value2: "new2"}
.sumber
sumber