Trong React, cả useEffect
và useLayoutEffect
đều là các hook được sử dụng để xử lý các tác động bên ngoài (side effects) trong các component. Tuy nhiên, chúng có những điểm khác biệt quan trọng về thời điểm thực thi và cách chúng ảnh hưởng đến việc render.
Sử dụng useEffect
- Thời điểm thực thi:
useEffect
được gọi sau khi component đã được render và cập nhật DOM. Điều này có nghĩa là nó không chặn quá trình render, giúp tăng hiệu suất và trải nghiệm người dùng. - Trường hợp sử dụng:
- Gọi API để lấy dữ liệu.
- Đăng ký và hủy đăng ký sự kiện (event listeners).
- Cập nhật trạng thái dựa trên dữ liệu từ props hoặc state.
- Thực hiện các tác động không ảnh hưởng đến layout của trang, như cập nhật tiêu đề trang hoặc xử lý các tác động bên ngoài khác.
Sử dụng useLayoutEffect
- Thời điểm thực thi:
useLayoutEffect
được gọi ngay sau khi DOM đã được cập nhật nhưng trước khi trình duyệt vẽ (repaint) lại màn hình. Điều này có nghĩa là nó chặn quá trình render cho đến khi các tác động bên trong nó hoàn tất. - Trường hợp sử dụng:
- Đo kích thước hoặc vị trí của các phần tử DOM (DOM measurements) để thực hiện các thay đổi ngay lập tức.
- Cập nhật layout của component dựa trên các thay đổi trước khi trình duyệt vẽ lại.
- Khi cần đảm bảo rằng các thay đổi về layout được thực hiện trước khi người dùng thấy chúng, như trong trường hợp của animations hoặc transitions.
So sánh giữa useEffect
và useLayoutEffect
Tiêu chí | useEffect |
useLayoutEffect |
---|---|---|
Thời điểm thực thi | Sau khi render | Ngay sau khi render và trước khi repaint |
Ảnh hưởng đến hiệu suất | Không chặn render | Chặn render cho đến khi hoàn tất |
Trường hợp sử dụng | Tác động không ảnh hưởng đến layout | Tác động ảnh hưởng đến layout |
Kết luận
Việc lựa chọn giữa useEffect
và useLayoutEffect
phụ thuộc vào yêu cầu cụ thể của ứng dụng. Nếu bạn cần thực hiện các tác động mà không ảnh hưởng đến trải nghiệm người dùng, hãy sử dụng useEffect
. Ngược lại, nếu bạn cần đảm bảo rằng các thay đổi layout được thực hiện trước khi người dùng thấy chúng, hãy chọn useLayoutEffect
.