Hướng dẫn tạo Loadmore cho Flatlist trong ReactNative

d52bb1 2024

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