React Native之FlatList组件(二)

2022-03-07  本文已影响0人  爱吃豆包

实例使用

import React, {useState} from 'react';
import {
  Text,
  View,
  FlatList,
  StyleSheet,
  RefreshControl,
  ActivityIndicator,
} from 'react-native';

const dataList = ['武汉', '宜昌', '孝感', '襄阳', '咸宁', '鄂州'];
export default function MyList() {
  // 默认 false 不加载
  const [isLoading, setIsLoading] = useState(false);
  const [dataArr, setDataArr] = useState(dataList);

  /**
   *
   * @param data ( item,index ) 一个就是数组的节点,一个是数组下坐标
   * @returns {JSX.Element}
   * @private
   */
  function _renderDataItem(data) {
    return (
      <View style={styles.item}>
        <Text style={styles.text}>{data.item}</Text>
      </View>
    );
  }

  /**
   * 下拉刷新
   */
  function loadData() {
    // 开启刷新状态
    setIsLoading(true);
    const tempData = [];
    setTimeout(() => {
      for (let i = dataArr.length - 1; i >= 0; i--) {
        tempData.push(dataArr[i]);
      }
      setDataArr(tempData.concat(dataArr));
      // 关闭刷新状态
      setIsLoading(false);
    }, 2000);
  }

  /**
   * 上拉加载
   */
  function refreshData() {
    // 开启刷新状态
    setIsLoading(true);
    const tempData = ['河南', '广州'];
    setTimeout(() => {
      setDataArr(dataArr.concat(tempData));
      // 关闭刷新状态
      setIsLoading(false);
    }, 2000);
  }

  /**
   * 上拉加载 样式
   * @returns {JSX.Element}
   */
  function genIndicator() {
    return (
      <View style={styles.genIndicatorContainer}>
        <ActivityIndicator
          size={'large'} // 显示大小为 小
          color={'red'} // 颜色
          animating={true} // 显示动画效果
        />
        <Text>正在加载更多</Text>
      </View>
    );
  }

  return (
    <View style={styles.container}>
      <FlatList
        data={dataArr} // 数据源
        renderItem={data => _renderDataItem(data)} // 需要渲染的视图
        // 这是组件自带的下拉刷新样式
        // refreshing={isLoading} // 是否刷新,通过一个状态
        // onRefresh={() => {
        //   loadData();
        // }}

        //自定义下拉刷新样式
        refreshControl={
          <RefreshControl
            title={'加载中'} // 显示的文字
            colors={['red']} // Android上的加载颜色
            tintColor={['red']} // IOS 上的加载颜色
            titleColor={'red'} // 显示的文字颜色
            refreshing={isLoading} // 是否刷新,通过一个状态
            onRefresh={() => {
              // 执行刷新的逻辑
              loadData();
            }}
          />
        }
        // 上拉加载
        ListFooterComponent={() => genIndicator()}
        onEndReached={() => {
          refreshData();
        }}
      />
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    backgroundColor: '#e2e2e2',
    flex: 1,
  },
  item: {
    height: 200,
    marginRight: 15,
    marginLeft: 15,
    marginBottom: 15,
    flexDirection: 'column',
    backgroundColor: '#169',
    alignItems: 'center',
    justifyContent: 'center',
  },
  text: {
    color: 'red',
  },
  genIndicatorContainer: {
    alignItems: 'center',
    justifyContent: 'center',
  },
});

上一篇下一篇

猜你喜欢

热点阅读