useEffect và useLayoutEffect trong React

React cung cấp hai hook mạnh mẽ để xử lý hiệu ứng phụ: useEffectuseLayoutEffect. Tuy chúng có cú pháp giống nhau, nhưng cách chúng hoạt động khác biệt và ảnh hưởng trực tiếp đến trải nghiệm người dùng cũng như hiệu suất của ứng dụng.


Tóm tắt quy trình thực thi

useEffect

  • Chạy sau khi React cập nhật DOM xong và render UI xong.
  • Thích hợp cho các tác vụ không ảnh hưởng trực tiếp đến layout, như gọi API, đăng ký sự kiện, log, animation nhẹ…

Quy trình:

  1. Cập nhật lại state
  2. Cập nhật DOM (mutated)
  3. React render lại UI
  4. Clean up nếu có
  5. Gọi useEffect callback

useLayoutEffect

  • Chạy ngay sau khi DOM được cập nhật, nhưng trước khi browser vẽ lại giao diện (paint).
  • Dùng khi bạn cần đo lường DOM, thay đổi layout hoặc ngăn nhấp nháy giao diện.

Quy trình:

  1. Cập nhật lại state
  2. Cập nhật DOM (mutated)
  3. Clean up nếu dependencies thay đổi
  4. Gọi useLayoutEffect callback
  5. React render lại UI

Khi nào dùng cái nào?

Tình huốngNên dùng
Gọi API, thao tác không ảnh hưởng layoutuseEffect
Đo kích thước DOM, scroll, positionuseLayoutEffect
Cập nhật class, focus vào inputuseLayoutEffect
Hiệu ứng animation nhẹ sau renderuseEffect
Ngăn nháy layout (flicker) khi hiển thị componentsuseLayoutEffect
Cập nhật DOM trước khi browser vẽ lạiuseLayoutEffect