Bagaimanakah kod bantuan useCallback berjalan lebih pantas?
P粉924915787
2023-08-18 10:02:15
<p>Jadi dikatakan useCallback boleh cache fungsi, saya rasa niatnya adalah untuk membuat kod berjalan lebih cepat. </p>
<p>Sebagai contoh, jika saya mempunyai: </p>
<pre class="brush:js;toolbar:false;">
setMsg(ev.target.value);
};
</pra>
<p>Saya juga boleh menukarnya kepada: </p>
<pre class="brush:js;toolbar:false;"> const handleChange = useCallback((ev) => {
setMsg(ev.target.value);
}, []);
</pra>
<p>Fungsi kini dicache. Walau bagaimanapun, adakah fungsi ini perlu dicipta apabila komponen itu dipaparkan semula? </p>
<p>Untuk mengujinya, saya menukarnya kepada IIFE supaya fungsi itu dikeluarkan daripadanya dan ia akan mencetak bahawa fungsi itu sedang dikeluarkan. </p>
<p>Lihat:
https://codesandbox.io/s/jolly-nightingale-zxqp8k</p>
<p>Jadi setiap kali anda menaip sesuatu dalam kotak input, fungsi baharu akan dikeluarkan, seperti yang ditunjukkan dalam konsol. Ini bermakna bahawa IIFE akan dilaksanakan setiap kali, yang juga bermakna bahawa fungsi literal akan ditukar kepada objek fungsi setiap kali, walaupun ia bukan IIFE. Jadi bagaimana kod bantuan ini berjalan lebih pantas? </p>
Ya, itu betul. Setiap render mencipta fungsi baharu, yang kemudiannya digantikan dengan fungsi cache.
Percepatan bukan kerana melangkau langkah mencipta fungsi, tetapi kerana kod lain dapat melangkau kerja mereka sendiri. Ini kerana jika mereka lulus fungsi yang sama setiap kali, mereka tahu bahawa tiada apa yang relevan telah berubah.
Sebagai contoh, jika anda perlu memasukkan
handleChange
传递给useEffect
dalam tatasusunan kebergantungan, adalah penting untuk menghantar rujukan yang stabil setiap kali, jika tidak, kesannya akan dijalankan semula pada setiap paparan:Atau jika
handleChange
作为prop传递给一个组件,并且该组件想要使用React.memo
langkau pemaparan. Rendering boleh dilangkau hanya apabila prop tidak berubah: