Anda tidak dapat menggunakan salah satu metode siklus hidup yang ada ( componentDidMount
, componentDidUpdate
, componentWillUnmount
dll) di kail. Mereka hanya dapat digunakan dalam komponen kelas. Dan dengan Hooks Anda hanya dapat menggunakan komponen fungsional. Baris di bawah ini berasal dari dokumen Bereaksi:
Jika Anda akrab dengan Bereaksi metode kelas siklus hidup, Anda bisa memikirkan useEffect
Hook sebagai componentDidMount
, componentDidUpdate
, dan componentWillUnmount
gabungan.
sarankan adalah, Anda dapat meniru metode siklus hidup ini dari komponen kelas dalam komponen fungsional.
Kode di dalam componentDidMount
dijalankan sekali ketika komponen sudah terpasang. useEffect
setara hook untuk perilaku ini
useEffect(() => {
// Your code here
}, []);
Perhatikan parameter kedua di sini (array kosong). Ini hanya akan berjalan sekali.
Tanpa parameter kedua yang useEffect
kait akan dipanggil pada setiap membuat komponen yang bisa berbahaya.
useEffect(() => {
// Your code here
});
componentWillUnmount
digunakan untuk pembersihan (seperti menghapus pendengar acara, membatalkan timer dll). Katakanlah Anda menambahkan pendengar acara componentDidMount
dan menghapusnya seperti di componentWillUnmount
bawah ini.
componentDidMount() {
window.addEventListener('mousemove', () => {})
}
componentWillUnmount() {
window.removeEventListener('mousemove', () => {})
}
Setara dengan kode di atas adalah sebagai berikut
useEffect(() => {
window.addEventListener('mousemove', () => {});
// returned function will be called on component unmount
return () => {
window.removeEventListener('mousemove', () => {})
}
}, [])
useEffect()
fungsinya, terima kasih.componentWillMount
componentWillMount
, bukancomponentWillUnmount
. Jawaban ini memang tidak menjawab pertanyaan sama sekali, dan hanya mengulangi apa yang sudah diketahui OP.gunakan kait ComponentDidMount
Dalam kebanyakan kasus
useComponentDidMount
adalah alat untuk digunakan. Ini akan berjalan hanya sekali, setelah komponen telah terpasang (render awal).gunakanComponentWillMount
Penting untuk dicatat bahwa komponen dalam kelas
componentWillMount
dianggap warisan. Jika Anda memerlukan kode untuk menjalankan hanya sekali sebelum komponen dipasang, Anda dapat menggunakan konstruktor. Lebih lanjut di sini . Karena komponen fungsional tidak memiliki equivelant konstruktor, menggunakan hook untuk menjalankan kode hanya sekali sebelum pemasangan komponen mungkin masuk akal dalam kasus-kasus tertentu. Anda dapat mencapainya dengan kail khusus.Namun, ada jebakan. Jangan menggunakannya untuk mengatur negara Anda secara tidak sinkron (ex mengikuti permintaan server. Seperti yang Anda harapkan akan memengaruhi rendering awal yang tidak akan terjadi). Kasus-kasus seperti itu harus ditangani
useComponentDidMount
.Demo
Demo Penuh
sumber
componentWillMount
berbasis iniuseEffect
memiliki dua masalah. Yang pertama adalah bahwa tidak ada siklus hidup pemasangan di komponen fungsional, kedua kait akan berjalan setelah komponen diberikan, sehinggaRuns only once before component mounts
menyesatkan. Yang kedua adalah yangcomponentWillMount
disebut rendering server danuseEffect
tidak. Banyak perpustakaan masih mengandalkanUNSAFE_componentWillMount
karena saat ini itu adalah satu-satunya cara untuk memicu efek samping server-side.Menurut reactjs.org, componentWillMount tidak akan didukung di masa depan. https://reactjs.org/docs/react-component.html#unsafe_componentwillmount
Tidak perlu menggunakan componentWillMount.
Jika Anda ingin melakukan sesuatu sebelum komponen dipasang, lakukan saja di constructor ().
Jika Anda ingin melakukan permintaan jaringan, jangan lakukan itu di componentWillMount. Karena melakukan ini akan menyebabkan bug yang tidak terduga.
Permintaan jaringan dapat dilakukan di componentDidMount.
Semoga ini bisa membantu.
diperbarui pada 08/03/2019
Alasan mengapa Anda meminta componentWillMount mungkin karena Anda ingin menginisialisasi keadaan sebelum dirender.
Lakukan saja di useState.
atau mungkin Anda ingin menjalankan fungsi di componentWillMount, misalnya, jika kode asli Anda terlihat seperti ini:
dengan hook, yang perlu Anda lakukan adalah menghapus metode siklus hidup:
Saya hanya ingin menambahkan sesuatu ke jawaban pertama tentang useEffect.
useEffect berjalan pada setiap render, itu adalah kombinasi dari componentDidUpdate, componentDidMount, dan ComponentWillUnmount.
Jika kita menambahkan array kosong di useEffect, ia berjalan tepat saat komponen di-mount. Itu karena useEffect akan membandingkan array yang Anda berikan padanya. Jadi itu tidak harus menjadi array kosong. Ini bisa menjadi array yang tidak berubah. Misalnya, bisa [1,2,3] atau ['1,2']. useEffect masih hanya berjalan ketika komponen dipasang.
Itu tergantung pada Anda apakah Anda ingin menjalankan hanya sekali atau berjalan setelah setiap render. Tidak berbahaya jika Anda lupa menambahkan array selama Anda tahu apa yang Anda lakukan.
Saya membuat sampel untuk kail. Silakan periksa.
https://codesandbox.io/s/kw6xj153wr
diperbarui pada 21/08/2019
Sudah putih sejak saya menulis jawaban di atas. Ada sesuatu yang saya pikir perlu Anda perhatikan. Saat Anda menggunakan
Saat bereaksi membandingkan nilai yang Anda berikan ke array [], ia menggunakan Object.is () untuk membandingkan. Jika Anda melewatkan objek ke sana, seperti
Ini persis sama dengan:
Itu akan merender ulang setiap kali karena ketika Object.is () membandingkan suatu objek, itu membandingkan referensi bukan nilai itu sendiri. Itu sama dengan mengapa {} === {} menghasilkan false karena referensi mereka berbeda. Jika Anda masih ingin membandingkan objek itu sendiri bukan referensi, Anda dapat melakukan sesuatu seperti ini:
sumber
useLayoutEffect
bisa menyelesaikan ini dengan satu set pengamat kosong ([]
) jika fungsinya benar-benar mirip dengancomponentWillMount
- itu akan berjalan sebelum konten pertama sampai ke DOM - meskipun sebenarnya ada dua pembaruan tetapi mereka sinkron sebelum menggambar ke layar.sebagai contoh:
Manfaat dibandingkan
useState
dengan penginisialisasi / penyetel atauuseEffect
meskipun dapat menghitung render pass, tidak ada render ulang yang sebenarnya ke DOM yang akan dilihat pengguna, dan dijalankan sebelum render pertama yang terlihat, yang tidak berlaku untukuseEffect
. Kelemahannya tentu saja sedikit keterlambatan dalam render pertama Anda karena pemeriksaan / pembaruan harus terjadi sebelum mengecat ke layar. Itu benar-benar tergantung pada kasus penggunaan Anda.Saya pikir secara pribadi,
useMemo
baik-baik saja dalam beberapa kasus niche di mana Anda perlu melakukan sesuatu yang berat - selama Anda ingat itu adalah pengecualian vs norma.sumber
Ini adalah cara bagaimana saya mensimulasikan konstruktor dalam komponen fungsional menggunakan
useRef
pengait:Berikut adalah contoh siklus hidup:
Tentu saja komponen Kelas tidak memiliki
Body
langkah, tidak mungkin membuat simulasi 1: 1 karena konsep fungsi dan kelas yang berbeda.sumber
Saya menulis pengait khusus yang akan menjalankan fungsi satu kali sebelum render pertama.
useBeforeFirstRender.js
Pemakaian:
sumber
Ada solusi yang bagus untuk diterapkan
componentDidMount
dancomponentWillUnmount
denganuseEffect
.Berdasarkan dokumentasi,
useEffect
dapat mengembalikan fungsi "pembersihan". fungsi ini tidak akan dipanggil padauseEffect
panggilan pertama , hanya pada panggilan berikutnya.Oleh karena itu, jika kita menggunakan
useEffect
pengait tanpa ketergantungan sama sekali, pengait akan dipanggil hanya ketika komponen dipasang dan fungsi "pembersihan" dipanggil saat komponen dilepas.Panggilan fungsi kembali pembersihan dipanggil hanya ketika komponen dilepas.
Semoga ini membantu.
sumber
useEffect
panggilan yang sama Anda mendapatkan fungsi yang samacomponentWillMount
dancomponentWillUnmount
dengan cara yang baik dan bersihuseEffect
hanya berjalan setelah render sementaracomponentWillMount
berjalan sebelum komponen merender.componentDidMount
tidakcomponentWillMount
. Saya melewatkan itu dalam pertanyaan, saya buruk.Anda bisa meretas kait useMemo untuk meniru acara siklus hidup componentWillMount. Kerjakan saja:
Anda perlu menyimpan hook useMemo sebelum apa pun yang berinteraksi dengan negara Anda. Ini bukan seperti yang dimaksudkan tetapi itu bekerja untuk saya untuk semua masalah componentWillMount.
Ini berfungsi karena useMemo tidak perlu benar-benar mengembalikan nilai dan Anda tidak harus benar-benar menggunakannya sebagai apa pun, tetapi karena ia menghafal nilai berdasarkan dependensi yang hanya akan berjalan sekali ("[]") dan itu di atas komponen kami, itu berjalan sekali ketika komponen mount sebelum hal lain.
sumber
https://reactjs.org/docs/hooks-reference.html#usememo
sumber
Jawaban Ben Carp sepertinya hanya berlaku bagi saya.
Tetapi karena kita menggunakan cara-cara fungsional, pendekatan lain dapat mengambil manfaat dari penutupan dan HoC:
Kemudian gunakan:
sumber
Jawaban singkat untuk pertanyaan awal Anda , bagaimana
componentWillMount
dapat digunakan dengan React Hooks:componentWillMount
sudah usang dan dianggap sebagai warisan . Bereaksi rekomendasi :Sekarang di Hook Hook Anda temukan, apa yang setara dengan konstruktor kelas untuk komponen fungsi adalah:
Jadi contoh penggunaan
componentWillMount
terlihat seperti ini:sumber
Cukup tambahkan array ketergantungan kosong di useEffect itu akan berfungsi sebagai
componentDidMount
.sumber
Ada trik sederhana untuk mensimulasikan
componentDidMount
dancomponentWillUnmount
dengan menggunakanuseEffect
:sumber