react-hook+antd-mobile ListView长列表分页

  • 用react-hook + ListView实现长列表分页,代码如下:
import { ListView, ActivityIndicator } from 'antd-mobile';
import React, { useState, useEffect, useCallback } from 'react';
import Header from '../../components/Header/index';
import styles from './index.module.css';
import CustomCard from '../../components/Card';
import classnames from 'classnames';
import Api from '../../lib/api';
import get from 'lodash/get';

const ListViewExample = () => {
  const [isLoading, setIsLoading] = useState(true);
  const [hasMore, setHasMore] = useState(true);
  const [pageNum, setPageNum] = useState(0);
  const [isFetching, setIsFetching] = useState(true);

  const listDataSource = new ListView.DataSource({
    rowHasChanged: (row1: any, row2: any) => true
  });
  const [dataSource, setDataSource] = useState(listDataSource);
  const [dataList, setDataList] = useState<any[]>([]);

  const getProgressData = useCallback(
    (page: number) => {
      setIsFetching(true);
      Api.get('/api/getData', {
        params: {
          page,
          size: 10
        }
      })
        .then(res => {
          setIsLoading(false);
          if (get(res, 'data.content').length === 0) {
            setHasMore(false);
            return false;
          }

          setDataList([...dataList, ...get(res, 'data.content')]);
          setDataSource(dataSource.cloneWithRows([...dataList, ...get(res, 'data.content')]));
        })
        .catch((err:any) => {
          console.log(err)
        })
        .finally(() => {
          setIsFetching(false);
        });
    },
    [pageNum, dataList, setDataList, setDataSource, setHasMore]
  );

  const onEndReached = () => {
    if (!hasMore) {
      return;
    }
    setPageNum(pageNum + 1);
    getProgressData(pageNum + 1);
  };

  useEffect(() => {
    getProgressData(1);
  }, []);

  const renderCard = (item: any, sectionID: any, rowID: any) => {
    return (
      <CustomCard key={sectionID + rowID}>    
          <div className={styles.cardContent}>
            <div className={classnames(styles.cardList, styles.companyIcon)}>
              企业名称:{item.enterpriseName || '-'}
            </div>
      </CustomCard>
    );
  };

  return (
    <div className={styles.serviceContainer}>
      <ActivityIndicator toast={true} text="加载中..." animating={isLoading} />
      {dataList.length > 0 && (
        <ListView
          renderHeader={() => (
            <>
              <div className={styles.topContainer} />
              <Header showShare={false} showReturn={true} />
            </>
          )}
          dataSource={dataSource}
          renderFooter={() => <div className={styles.footer}>{isFetching ? '加载中...' : '哎呀,到底了'}</div>}
          renderBodyComponent={() => <div />}
          renderRow={renderCard}
          className={styles.listContent}
          initialListSize={10}
          pageSize={10}
          scrollRenderAheadDistance={500}
          onEndReached={onEndReached}
          onEndReachedThreshold={10}
        />
      )}
    </div>
  );
};

export default ListViewExample;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值