The useEffect Bereaksi kait akan menjalankan disahkan pada fungsi pada setiap perubahan. Ini dapat dioptimalkan agar panggilan hanya ketika properti yang diinginkan berubah.
Bagaimana jika saya ingin memanggil fungsi inisialisasi dari componentDidMount
dan tidak menyebutnya lagi pada perubahan? Katakanlah saya ingin memuat entitas, tetapi fungsi pemuatan tidak memerlukan data dari komponen. Bagaimana kita bisa menggunakan useEffect
kait ini?
class MyComponent extends React.PureComponent {
componentDidMount() {
loadDataOnlyOnce();
}
render() { ... }
}
Dengan kait ini bisa terlihat seperti ini:
function MyComponent() {
useEffect(() => {
loadDataOnlyOnce(); // this will fire on every change :(
}, [...???]);
return (...);
}
javascript
reactjs
react-hooks
Dávid Molnár
sumber
sumber
TL; DR
useEffect(yourCallback, [])
- akan memicu panggilan balik hanya setelah render pertama.Penjelasan detail
useEffect
berjalan secara default setelah setiap render komponen (sehingga menyebabkan efek).Saat menempatkan
useEffect
di komponen Anda, Anda memberi tahu Bereaksi bahwa Anda ingin menjalankan panggilan balik sebagai efek. Bereaksi akan menjalankan efek setelah rendering dan setelah melakukan pembaruan DOM.Jika Anda hanya melewati callback - callback akan berjalan setelah setiap render.
Jika melewati argumen kedua (array), Bereaksi akan menjalankan panggilan balik setelah render pertama dan setiap kali salah satu elemen dalam array diubah. misalnya saat menempatkan
useEffect(() => console.log('hello'), [someVar, someOtherVar])
- panggilan balik akan berjalan setelah render pertama dan setelah render apa pun yang salah satusomeVar
atausomeOtherVar
diubah.Dengan melewatkan argumen kedua array kosong, Bereaksi akan membandingkan setelah setiap render array dan akan melihat tidak ada yang berubah, sehingga memanggil panggil balik hanya setelah render pertama.
sumber
gunakan kaitountEffect
Menjalankan fungsi hanya sekali setelah komponen mount adalah pola umum yang membenarkan pengait itu sendiri yang menyembunyikan detail implementasi.
Gunakan dalam komponen fungsional apa pun.
Tentang hook useMountEffect
Saat menggunakan
useEffect
dengan argumen array kedua, Bereaksi akan menjalankan panggilan balik setelah pemasangan (render awal) dan setelah nilai dalam array berubah. Karena kami melewatkan array kosong, itu akan berjalan hanya setelah pemasangan.sumber
useMount
ketika fungsi efek Anda memerlukan sesuatu dari alat peraga tetapi tidak perlu dijalankan lagi meskipun nilai itu berubah tanpa linter warnig:useEffect(()=>console.log(props.val),[])
akan ada peringatan ketergantungan yang hilang tetapiuseMount(()=>console.log(props.val))
tidak akan menyebabkan peringatan tetapi "tidak berfungsi". Saya tidak yakin apakah akan ada masalah dengan mode bersamaan.Berikan array kosong sebagai argumen kedua
useEffect
. Ini secara efektif memberi tahu React, mengutip dokumen :Berikut cuplikan yang dapat Anda jalankan untuk menunjukkan bahwa ia berfungsi:
sumber
Saya suka mendefinisikan suatu
mount
fungsi, itu trik EsLint dengan cara yang samauseMount
tidak dan saya merasa lebih jelas.sumber
Caranya adalah useEffect menggunakan parameter kedua.
Param kedua adalah array variabel yang akan diperiksa komponen untuk memastikannya berubah sebelum rendering ulang. Anda dapat menempatkan bit alat peraga apa pun dan menyatakan bahwa Anda ingin memeriksa.
Atau, jangan masukkan apa pun:
Itu akan memastikan useEffect hanya berjalan sekali.
Catatan dari dokumen:
Jika Anda menggunakan pengoptimalan ini, pastikan array menyertakan semua nilai dari cakupan komponen (seperti properti dan status) yang berubah seiring waktu dan yang digunakan oleh efek. Jika tidak, kode Anda akan merujuk nilai basi dari perenderan sebelumnya.
sumber