2 phút đọc
Một dòng code duy nhất có thể khiến component React của bạn lặp vô hạn

Có một bug React rất ngầm mà nhiều lập trình viên gặp phải mà không nhận ra lý do tại sao.
const filters = [selectedValue]
Trông hoàn toàn vô hại.
Nhưng nếu được sử dụng bên trong một dependency array của filters hoặc useEffect…useCallback
👉 Component của bạn có thể bắt đầu re-render không ngừng.
Trong JavaScript:
[1] === [1] // false {} === {} // false
Object và array được so sánh theo tham chiếu, chứ không phải theo giá trị.
Mỗi khi component của bạn render:
const filters = [selectedValue]
JavaScript sẽ tạo ra một array hoàn toàn mới trong bộ nhớ.
Ngay cả khi không thay đổi,
tham chiếu vẫn khác nhau.selectedValue
And đối với React, điều đó có nghĩa là: dependency đã thay đổi.
Một pattern phổ biến trông giống như thế này:
const filters = [selectedValue] const fetchData = useCallback(() => { dispatch({ filters }) }, [filters]) useEffect(() => { fetchData() }, [fetchData])
Đây là những gì xảy ra:
Vòng lặp vô hạn.
Trong React:
Bất cứ khi nào bạn thấy những thứ này bên trong một lần render:
{} [] () => {}
Hãy ổn định tham chiếu bằng cách sử dụng :useMemo
const filters = useMemo(() => { return [selectedValue] }, [selectedValue])
Hoặc tránh tạo các object/array mới nếu bạn thực sự không cần đến chúng.
--
Hy vọng bài viết này giúp ích cho bạn! :)