Saya baru saja menemukan bahwa dalam this.setState()
fungsi react di setiap komponen adalah asynchronous atau dipanggil setelah selesainya fungsi yang dipanggilnya.
Sekarang saya mencari dan menemukan blog ini ( setState () State Mutation Operation May Be Synchronous In ReactJS )
Di sini ia menemukan bahwa setState
async (dipanggil saat tumpukan kosong) atau sinkronisasi (dipanggil segera setelah dipanggil) bergantung pada bagaimana perubahan status dipicu.
Sekarang kedua hal ini sulit untuk dicerna
- Di blog,
setState
fungsi disebut di dalam fungsiupdateState
, tetapi yang memicuupdateState
fungsi bukanlah sesuatu yang akan diketahui oleh fungsi yang dipanggil. - Mengapa mereka membuat
setState
asinkron karena JS adalah bahasa utas tunggal dan setState ini bukan WebAPI atau panggilan server sehingga harus dilakukan hanya di utas JS. Apakah mereka melakukan ini agar Rendering Ulang tidak menghentikan semua pendengar acara dan sebagainya, atau ada beberapa masalah desain lainnya.
setState
: medium.com/@agm1984/…Jawaban:
Anda dapat memanggil fungsi setelah nilai status diperbarui:
Selain itu, jika Anda memiliki banyak status untuk diperbarui sekaligus, kelompokkan semuanya dalam satu
setState
:Dari pada:
Lakukan saja ini:
sumber
1)
setState
tindakan bersifat asinkron dan dikumpulkan untuk mendapatkan kinerja. Ini dijelaskan dalam dokumentasisetState
.2) Mengapa mereka membuat setState async karena JS adalah bahasa utas tunggal dan ini
setState
bukan panggilan WebAPI atau server?Ini karena
setState
mengubah status dan menyebabkan perenderan ulang. Ini bisa menjadi operasi yang mahal dan membuatnya sinkron mungkin membuat browser tidak responsif.Dengan demikian, panggilan setState bersifat asinkron serta dikumpulkan untuk pengalaman dan kinerja UI yang lebih baik.
sumber
this.setState({ something: true }, () => console.log(this.state))
Saya tahu pertanyaan ini sudah lama, tetapi telah menyebabkan banyak kebingungan bagi banyak pengguna reactjs sejak lama, termasuk saya. Baru-baru ini Dan Abramov (dari tim react) baru saja menulis penjelasan yang bagus tentang mengapa sifatnya
setState
asinkron:https://github.com/facebook/react/issues/11527#issuecomment-360199710
setState
dimaksudkan untuk menjadi asinkron, dan ada beberapa alasan yang sangat bagus untuk itu dalam penjelasan yang ditautkan oleh Dan Abramov. Ini tidak berarti itu akan selalu asynchronous - ini terutama berarti Anda tidak bisa bergantung padanya untuk menjadi sinkron . ReactJS mempertimbangkan banyak variabel dalam skenario yang Anda ubah statusnya, untuk memutuskan kapanstate
harus benar-benar diperbarui dan komponen Anda dirender.Contoh sederhana untuk menunjukkan hal ini, adalah jika Anda memanggil
setState
sebagai reaksi terhadap tindakan pengguna, makastate
kemungkinan akan segera diperbarui (meskipun, sekali lagi, Anda tidak dapat mengandalkannya), sehingga pengguna tidak akan merasakan penundaan , tetapi jika Anda meneleponsetState
sebagai reaksi terhadap respons panggilan ajax atau beberapa peristiwa lain yang tidak dipicu oleh pengguna, maka status mungkin diperbarui dengan sedikit penundaan, karena pengguna tidak akan benar-benar merasakan penundaan ini, dan itu akan meningkatkan kinerja dengan menunggu kumpulkan beberapa pembaruan status bersama-sama dan render DOM lebih sedikit.sumber
Artikel bagus di sini https://github.com/vasanthk/react-bits/blob/master/patterns/27.passing-function-to-setState.md
atau berikan panggilan balik
this.setState ({.....},callback)
https://medium.com/javascript-scene/setstate-gate-abc10a9b2d82 https://medium.freecodecamp.org/functional-setstate-is-the-future-of-react-374f30401b6b
sumber
Anda dapat menggunakan bungkus berikut untuk melakukan panggilan sinkronisasi
sumber
Bayangkan menambah penghitung di beberapa komponen:
Ada penangan hitungan yang dipasang ke komponen induk dan anak. Ini dilakukan dengan sengaja sehingga kita bisa mengeksekusi setState () dua kali dalam konteks gelembung peristiwa klik yang sama, tetapi dari dalam 2 penangan yang berbeda.
Seperti yang dapat kita bayangkan, satu peristiwa klik pada tombol sekarang akan memicu kedua penangan ini karena peristiwa menggelembung dari target ke wadah terluar selama fase menggelegak.
Oleh karena itu, btnCountHandler () dieksekusi terlebih dahulu, diharapkan menaikkan hitungan menjadi 1 dan kemudian divCountHandler () dieksekusi, diharapkan menambah hitungan menjadi 2.
Namun hitungannya hanya bertambah menjadi 1 karena Anda dapat memeriksa di alat Pengembang React.
Ini membuktikan bahwa bereaksi
mengantri semua panggilan setState
kembali ke antrian ini setelah menjalankan metode terakhir dalam konteks (divCountHandler dalam kasus ini)
menggabungkan semua mutasi objek yang terjadi dalam beberapa panggilan setState dalam konteks yang sama (semua panggilan metode dalam satu fase peristiwa adalah konteks yang sama misalnya) menjadi satu sintaks mutasi objek (penggabungan masuk akal karena inilah mengapa kita dapat memperbarui properti status secara independen di setState () di tempat pertama)
dan meneruskannya ke dalam satu setState () untuk mencegah rendering ulang karena beberapa panggilan setState () (ini adalah deskripsi batching yang sangat primitif).
Kode yang dihasilkan dijalankan oleh react:
Untuk menghentikan perilaku ini, alih-alih meneruskan objek sebagai argumen ke metode setState, callback akan diteruskan.
Setelah metode terakhir menyelesaikan eksekusi dan saat react kembali untuk memproses antrian setState, itu hanya memanggil callback untuk setiap setState yang antri, meneruskan status komponen sebelumnya.
Reaksi cara ini memastikan bahwa callback terakhir dalam antrean akan memperbarui status yang telah dilakukan oleh semua mitra sebelumnya.
sumber
Ya, setState () asynchronous.
Dari tautan: https://reactjs.org/docs/react-component.html#setstate
Karena mereka berpikir
Dari tautan: https://github.com/facebook/react/issues/11527#issuecomment-360199710
Asynchronous setState () membuat hidup sangat sulit bagi mereka yang baru memulai dan sayangnya:
- masalah rendering yang tidak terduga: rendering tertunda atau tidak ada rendering (berdasarkan logika program)
- melewatkan parameter adalah masalah besar di
antara masalah lainnya.
Contoh di bawah ini membantu:
Semoga membantu.
sumber