Để 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