Vấn đề:
- Chắc hẳn ai khi code dự án với
React.js
việc lấy dữ liệu từ server để hiển thị dưới dạng danh sách như list, bảng là không hiếm. Những sẽ có lúc bạn nhận dữ liệu trả về rất lớn, khiến cho việc React render ra list/table trở nên nặng nề và tốn nhiều thời gian. Đặc biệt là dữ liệu cần render là các image, pdf số lượng trang lớn,... nó làm ảnh hưởng đến porfermance và cũng ngốn không ít bộ nhớ. Đây chính là lúc bạn bắt đầu nghĩ đến việc trải nghiệm người dùng của người dùng cuối. Để giải quyết vấn đề đó sẽ có phương cách, tuy nhiên hôm nay mình sẽ đề cập đề react-window một thư viện gọn nhẹ, nhưng vô cùng hiệu quả, được tinh gọn lại từ thư viện react-virtualized bởi chính tác giả.
Thực hiện :
Cài đặt project:
-
Dùng lệnh
create-react-app
để khởi tạo project -
Tiếp theo cài thư viện
react-window
bằng câu lệnhyarn add react-window
hoặcnpm i react-window
-
Đây code sau khi setup:
- Trong hình là hai cách render thông thường và dùng
FixedSizeList
củareact-window
- Với cách thông thường nó sẽ render ra 20000
Row
vào DOM điều này dẫn đến thời gian render cácelement
sẽ lâu hơn. - Tuy nhiên với
FixedSizeList
nó chỉ render ra tầm trên dưới 10element
hiển thị trên màn hình, khi bạn scroll đến đâu nó sẽ tự render tới đó
- Hãy thử tưởng tượng bạn muốn render một file PDF vài trăm trang, việc render ra tất cả các trang đó cùng lúc là không thật sự tối ưu, thay vì vậy chúng ta chỉ render ra những file chúng ta cần xem như vậy sẽ giảm thời gian và bộ nhớ đi khá nhiều.
Cách hoạt động của thư viện:
-
Một số tham số truyền vào props như
height
,width
chỉ thông số chiều cao và rộng của containerList
đó,itemSize
là chiều cao của mỗi Item bên trong,itemCount
tổng số lượng Item bên trong. Để truyền tham số vào trong chirldren củaList
ta chỉ cần truyền quaitemData
là mỗiItem
sẽ nhận như truyền qua props củaItem
,innerRef
,outerRef
tạo ra Element bên trong, bên ngoài của nó (thường là "div").onScroll
đây là props type function mà nó sẽ trả về thông tin vị trí offset khi chúng ta scroll -
Về cách hoạt động của thư viện, nó sử dụng
virtualized list
chỉ render nhữngItem
trên màn hình khác so với cách render tất cả thông thường. Từheight
vàwidth
nó xác định kích thước củaList
, dựa vàoitemSize
vàitemCount
nó xác định chiều dài của List đó, ví dụitemSize
:200
vàitemCount
:1000
thì height tổng thể củaList
là 200 000. NhữngItem
trongList
sẽ được render dựa vào vị trí offsetScroll vớiposition
:absolute
, và số lượngItem
render trước cũng được tính toán từheight
vàitemSize
để scroll vẫn mượt mà và tối ưu.