Apabila membina aplikasi React, cangkuk seperti useEffect dan useLayoutEffect ialah alat penting untuk mengurus kesan sampingan, tetapi memahami masa dan cara menggunakannya boleh menjadi rumit. Dalam panduan mesra pemula ini, kami akan memecahkan perbezaan utama antara kedua-dua cangkuk ini, masa anda harus menggunakannya dan cara mengelakkan kesilapan biasa.
Bayangkan anda menghias rumah anda. Mula-mula, anda mungkin mahu menyusun perabot (susun atur), dan selepas itu, anda boleh menambah beberapa hiasan (kesan). Dalam React, kesan adalah seperti hiasan tersebut—ia membenarkan anda melakukan tindakan selepas komponen anda dipaparkan, seperti mengambil data atau menyediakan pendengar acara.
React menawarkan dua cangkuk utama untuk menguruskan kesan sampingan: useEffect dan useLayoutEffect. Kedua-duanya memainkan peranan penting, tetapi mereka mempunyai gelagat berbeza bergantung pada masa dan cara ia dijalankan.
Mari kita mulakan dengan useEffect, iaitu cangkuk yang paling biasa digunakan untuk kesan sampingan dalam React. Cangkuk ini dijalankan selepas komponen telah dipaparkan, menjadikannya sesuai untuk tindakan seperti mengambil data daripada API, mengemas kini DOM atau menyediakan langganan.
import { useEffect, useState } from 'react'; function MyComponent() { const [data, setData] = useState(null); useEffect(() => { fetch('https://api.example.com/data') .then(response => response.json()) .then(data => setData(data)); }, []); // Empty array means this effect runs once when the component mounts return <div>{data ? data.name : 'Loading...'}</div>; }
Dalam contoh ini, useEffect digunakan untuk mengambil data selepas komponen dipaparkan. Ini bagus untuk tindakan yang tidak menjejaskan reka letak awal komponen anda.
Sebaliknya, useLayoutEffect ialah cangkuk yang lebih khusus. Ia berjalan segera selepas DOM telah dikemas kini tetapi sebelum penyemak imbas telah melukis skrin. Ini bermakna useLayoutEffect boleh menyekat kemas kini visual sehingga kesannya selesai dijalankan, menjadikannya sesuai untuk tugasan yang perlu dilakukan sebelum pengguna melihat perubahan—seperti mengukur reka letak atau menyegerakkan animasi.
import { useLayoutEffect, useRef } from 'react'; function LayoutComponent() { const ref = useRef(); useLayoutEffect(() => { const height = ref.current.offsetHeight; console.log('Element height:', height); // This runs before the browser paints the screen }); return <div ref={ref}>Hello, world!</div>; }
Dalam contoh ini, useLayoutEffect digunakan untuk mengukur ketinggian elemen DOM sejurus selepas ia dipaparkan tetapi sebelum penyemak imbas mengemas kini skrin. Ini menjadikannya lebih tepat untuk tugasan yang perlu berfungsi dengan reka letak secara langsung.
Pada pandangan pertama, useEffect dan useLayoutEffect kelihatan serupa, tetapi masa dan kes penggunaannya berbeza dengan ketara. Berikut ialah pecahan pantas masa untuk menggunakan setiap satu:
useEffect: Gunakan ini untuk kebanyakan kesan sampingan, terutamanya kesan sampingan yang tidak menjejaskan reka letak secara langsung, seperti mengambil data, menyediakan pendengar acara atau mengemas kini keadaan.
useLayoutEffect: Gunakan ini apabila anda perlu mengukur atau memanipulasi DOM sebelum penyemak imbas melukis skrin. Ini penting untuk tugasan berkaitan reka letak, seperti mengira dimensi elemen atau menyegerakkan animasi.
Contoh kesilapan:
import { useEffect, useState } from 'react'; function MyComponent() { const [data, setData] = useState(null); useEffect(() => { fetch('https://api.example.com/data') .then(response => response.json()) .then(data => setData(data)); }, []); // Empty array means this effect runs once when the component mounts return <div>{data ? data.name : 'Loading...'}</div>; }
Penyelesaian: Hanya kemas kini keadaan apabila diperlukan dan gunakan kebergantungan yang betul dalam tatasusunan kebergantungan.
Contoh:
import { useLayoutEffect, useRef } from 'react'; function LayoutComponent() { const ref = useRef(); useLayoutEffect(() => { const height = ref.current.offsetHeight; console.log('Element height:', height); // This runs before the browser paints the screen }); return <div ref={ref}>Hello, world!</div>; }
Memilih antara useEffect dan useLayoutEffect mungkin kelihatan mengelirukan pada mulanya, tetapi dengan pemahaman yang jelas tentang cara dan bila ia dijalankan, anda boleh mengoptimumkan komponen React anda untuk prestasi dan kebolehbacaan yang lebih baik.
useEffect ialah pilihan anda untuk kebanyakan kesan sampingan, berjalan selepas pemaparan dan membiarkan penyemak imbas bebas untuk mengemas kini skrin mengikut keperluan. useLayoutEffect, walau bagaimanapun, hendaklah dikhaskan untuk kemas kini berkaitan reka letak yang perlu berlaku sebelum pengguna melihat skrin.
Dengan mengurus kesan anda dengan bijak, anda akan mengelakkan perangkap biasa seperti pemaparan semula yang tidak perlu atau gangguan reka letak, memastikan apl React anda pantas, cekap dan mudah diselenggara.
Bersedia untuk meningkatkan kemahiran React anda? Cuba gunakan useEffect dan useLayoutEffect dalam projek anda yang seterusnya untuk melihat cara mereka boleh meningkatkan prestasi apl anda.
Jika anda menyukai artikel ini, pertimbangkan untuk menyokong kerja saya:
Atas ialah kandungan terperinci Panduan Lengkap untuk React useEffect vs useLayoutEffect untuk Pemula. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!