Hướng dẫn tạo Loadmore cho Flatlist trong ReactNative
Để thực hiện được phần này, bạn cần có API demo danh sách nhiều dữ liệu một chút. Bạn hãy xem bài viết này https://zezo.dev/view/huong-dan-phan-trang-trong-danh-sach-du-lieu-api-viet-bang-nodejs
Sau khi có API demo như bài viết trên, bạn hãy vào Compass nhập khoảng 30 bản ghi và sửa biến limit trong controller thành 15 bản ghi trên 1 trang.
Cơ bản là bạn nên đặt số bản ghi trên 1 trang làm sao cho hiển thị trên màn hình điện thoại nhiều hơn giới hạn chiều cao của màn hình để tránh bị load 2 trang cùng lúc.
Sau khi chuẩn bị dữ liệu xong, bạn thực hiện các bước sau:
Bước 1: Tạo ứng dụng ReactNative trống
Bước 2: Tạo 1 Component hoặc viết vào file App code sau
import React, { useState, useEffect } from 'react';
import { FlatList, Text, View, ActivityIndicator } from 'react-native';
const LoadMoreFlatList = () => {
const [data, setData] = useState([]);
const [isLoading, setIsLoading] = useState(false);
const [nexPage, setNextPage] = useState(1);
const [totalPages, setTotalPages] = useState(0);
useEffect(() => {
console.log("--- useEffect --> ");
fetchData();
}, []);
const fetchData = async () => {
console.log(`---- nexpage: ${nexPage} / ${totalPages}`);
if(totalPages >0 && nexPage>totalPages) {
console.log("Đã hết dữ liệu");
return;
}
setIsLoading(true); // hiện ActivityIndicator
// Thực hiện lấy dữ liệu từ API hoặc bất kỳ nguồn dữ liệu nào khác
// Trong ví dụ này, chúng ta chỉ sử dụng dữ liệu giả lập
const response = await fetch(`http://10.0.2.2:3000/api/todos?page=${nexPage}`);
const dataRes = await response.json();
// console.log(dataRes);
// ghép nối dữ liệu thêm vào danh sách
setData(prevData => [...prevData, ...dataRes.data]);
setTotalPages(dataRes.totalPages);// lưu lại tổng số trang
//xác định trang tiếp theo, nếu nextpage còn bé hơn totalpage thì tăng thêm 1 đơn vị
// if(dataRes.totalPages > nexPage)
setNextPage(prevPage => prevPage + 1);
setIsLoading(false);
};
const renderFooter = () => {
return isLoading ? (
<View style={{ paddingVertical: 20 }}>
<ActivityIndicator size="large" color="#0000ff" />
</View>
) : null;
};
return (
<FlatList
data={data}
keyExtractor={(item, index) => index.toString()}
renderItem={({ item }) => (
<View style={{ padding: 30, borderBlockColor: 'blue', borderWidth:1}}>
<Text>{item.title}</Text>
</View>
)}
onEndReached={fetchData}
onEndReachedThreshold={0.1}
ListFooterComponent={renderFooter}
/>
);
};
export default LoadMoreFlatList;
Trong thẻ Flatlist bạn cần chú ý 3 thuộc tính:
onEndReached={fetchData} ---> Khi cuộn đến cuối màn hình sẽ tự gọi hàm fetchData để load thêm dữ liệu
onEndReachedThreshold={0.1} --> khoảng cách đến cuối màn thì thì bắt đầu gọi hàm fetchData
ListFooterComponent={renderFooter} --> render ra cái vòng tròn quay quay đợi load dữ liệu ở cuối danh sách, khi load xong sẽ tự ẩn
Bước 3: Chạy thử nghiệm ứng dụng và cuộn màn hình
Nguồn: zezo.dev