InfiniteScroll 使用 ScrollView - React Native

InfiniteScroll using ScrollView - React Native

我有一个使用react native本身的ScrollView的列表。基本上,我通过 API return.

动态构建列表
async fetchData(userSearch) {
    const {route} = this.props;
    const {params} = route;
    const {type} = params;

    this.setState({
      loading: true,
    });

    const responseProcedures = await scheduleResource.getProcedures(userSearch);

    this.setState({
      procedures: responseProcedures.data,
      loading: false,
    });
  }



<ScrollView
  onScroll={(event) => this.shouldLoadMoreContent(event)}
>
    {procedures.map(procedure => (
      <ArrowBox key={procedure.id} onPress={() => RootNavigation.navigate('ProcedureDetails', {procedure})}>
        <Text bold style={styles.ProcedureTitle}>
          {procedure.name}
        </Text>
        {!!procedure.synonyms.length && (
          <>
            <Text bold style={styles.ProcedureSynonymTitle}>
              Sinônimos
            </Text>
            <View style={styles.ProcedureSynonymOptionsContainer}>
              {procedure.synonyms.map(synonym => <Text style={styles.ProcedureSynonymOption} key={synonym}>{synonym}</Text>)}
            </View>
          </>
        )}
      </ArrowBox>
    ))}
</ScrollView>

问题是我从 API 加载了整个 return 并且速度变慢了。

我想知道如何在到达页面末尾时动态加载内容并在 api 中进行新调用。 Api 允许我放置偏移量和限制。

有人能给我举个例子吗?

谢谢!!!!!

ScrollView 基本上不是为处理动态数据而设计的,设计用于执行此功能的正确组件称为 Flatlist。它的工作方式几乎与 ScrollView 完全一样,但速度更快,并且只会渲染屏幕上显示的组件。

请像这样从 React Native 导入 Flatlist...

//At the top of your file, please import FlatList together with all the modules that you want
import { FlatList, Text, View } from "react-native";

然后用这样的 Flatlist 替换代码中的整个 ScrollView:

<FlatList
  keyExtractor={(procedure) => procedure.id}
  data={this.state.procedures}
  renderItem={(procedure) => {
    return (
      <ArrowBox
        key={procedure.id}
        onPress={() =>
          RootNavigation.navigate("ProcedureDetails", {
          procedure })}>
            <Text bold style={styles.ProcedureTitle}>
          {procedure.name}
        </Text>
        {!!procedure.synonyms.length && (
          <>
            <Text bold style={styles.ProcedureSynonymTitle}>
              Sinônimos
            </Text>
            <View
            style={styles.ProcedureSynonymOptionsContainer}>
              {procedure.synonyms.map((synonym) => (
                <Text
                  style={styles.ProcedureSynonymOption}
                  key={synonym}>
                  {synonym}
                </Text>
              ))}
            </View>
          </>
        )}
      </ArrowBox>
    );
  }}
></FlatList>;