useEffect chạy asynchronously sau khi trình duyệt paint, không block UI. useLayoutEffect chạy synchronously sau DOM mutations nhưng trước khi trình duyệt paint, có thể block paint.
- Dùng useLayoutEffect khi cần đọc layout DOM và synchronously re-render để tránh visual flicker (ví dụ tooltips).
- Mặc định dùng useEffect.