Jadi saya punya ini:
let total = newDealersDeckTotal.reduce(function(a, b) {
return a + b;
},
0);
console.log(total, 'tittal'); //outputs correct total
setTimeout(() => {
this.setState({dealersOverallTotal: total});
}, 10);
console.log(this.state.dealersOverallTotal, 'dealersOverallTotal1'); //outputs incorrect total
newDealersDeckTotal hanyalah sebuah larik angka, [1, 5, 9]
misalnya this.state.dealersOverallTotal
, tidak memberikan total yang benar, tetapi total
apakah? Saya bahkan melakukan penundaan waktu tunggu untuk melihat apakah ini menyelesaikan masalah. ada yang jelas atau haruskah saya memposting lebih banyak kode?
javascript
reactjs
state
setstate
Cacing
sumber
sumber
setState
.setState
memang dieksekusi setelah Anda masuk status. Saya pikir apa yang ingin Anda lakukan dalam debugging adalah meletakkanconsole.log
bagian di dalam batas waktu, dan disetState
luar.Jawaban:
setState()
biasanya asinkron, yang artinya pada saat Andaconsole.log
menyatakan statusnya, belum diperbarui. Coba masukkan log ke dalam callbacksetState()
metode tersebut. Ini dijalankan setelah perubahan status selesai:this.setState({ dealersOverallTotal: total }, () => { console.log(this.state.dealersOverallTotal, 'dealersOverallTotal1'); });
sumber
setState
.this.setState({someVar: newValue},function(){ console.log("force update") });
useState
hook dalam komponen fungsional. GunakanuseEffect
sebagai gantinya untuk efek setelah rendering.setState tidak sinkron. Anda dapat menggunakan metode callback untuk mendapatkan status diperbarui.
changeHandler(event) { this.setState({ yourName: event.target.value }, () => console.log(this.state.yourName)); }
sumber
Menggunakan async / await
async changeHandler(event) { await this.setState({ yourName: event.target.value }); console.log(this.state.yourName); }
sumber
The
setState()
operasi asynchronous dan karenanya Andaconsole.log()
akan dieksekusi sebelumsetState()
bermutasi nilai-nilai dan karenanya Anda melihat hasilnya.Untuk mengatasinya, masukkan nilai dalam fungsi callback
setState()
, seperti:setTimeout(() => { this.setState({dealersOverallTotal: total}, function(){ console.log(this.state.dealersOverallTotal, 'dealersOverallTotal1'); }); }, 10)
sumber
Untuk pengait, Anda harus menggunakan
useEffect
pengait.const [fruit, setFruit] = useState(''); setFruit('Apple'); useEffect(() => { console.log('Fruit', fruit); }, [fruit])
sumber
useEffect
berjalan pada setiap render ulang, dan jika item yang diteruskan ke dalam larik adalah pasir variabel status berubah. Jadi ketika buah berubah dan komponen dirender ulang, useEffect itu akan berjalan.Setstate adalah asynchronous dalam bereaksi, jadi untuk melihat status yang diperbarui di konsol gunakan callback seperti yang ditunjukkan di bawah ini (Fungsi callback akan dijalankan setelah update setstate)
Metode di bawah ini "tidak disarankan" tetapi untuk pemahaman, jika Anda mengubah status secara langsung, Anda dapat melihat status yang diperbarui di baris berikutnya. Saya ulangi ini "tidak disarankan"
sumber
cukup tambahkan
componentDidUpdate(){}
metode dalam kode Anda, dan itu akan berhasil. Anda dapat memeriksa siklus hidup react native di sini:https://images.app.goo.gl/BVRAi4ea2P4LchqJ8
sumber
Saya mengalami masalah saat menyetel status reaksi beberapa kali (selalu menggunakan status default). Mengikuti masalah react / github ini berhasil untuk saya
const [state, setState] = useState({ foo: "abc", bar: 123 }); // Do this! setState(prevState => { return { ...prevState, foo: "def" }; }); setState(prevState => { return { ...prevState, bar: 456 }; });
sumber
Saya memiliki situasi yang sama dengan beberapa kode yang berbelit-belit, dan tidak ada dari saran yang ada yang berhasil untuk saya.
Masalah saya adalah yang
setState
terjadi dari fungsi panggilan balik, yang dikeluarkan oleh salah satu komponen. Dan kecurigaan saya adalah bahwa panggilan itu terjadi secara sinkron, yang mencegahsetState
pengaturan status sama sekali.Sederhananya saya punya sesuatu seperti ini:
render() { <Control ref={_ => this.control = _} onChange={this.handleChange} onUpdated={this.handleUpdate} /> } handleChange() { this.control.doUpdate(); } handleUpdate() { this.setState({...}); }
Cara saya harus "memperbaiki" itu untuk dimasukkan
doUpdate()
ke dalamsetTimeout
seperti ini:handleChange() { setTimeout(() => { this.control.doUpdate(); }, 10); }
Tidak ideal, tetapi sebaliknya itu akan menjadi refactoring yang signifikan.
sumber