标签: react-native-flatlist

React-Native:嵌套在SectionList中的Flatlist

我正在尝试在部分列表中呈现几个平面列表。最终目标是这样的:

包含多个部分的提要页面(您过去的订单、午餐时间等)

但是,我似乎无法让它正确渲染。它多次渲染同一个项目。

            <SafeAreaView style={styles.container}>
                <SectionList
                    sections={posts}
                    keyExtractor={(item, index) => item + index}
                    renderItem={({ item }) => 
                        <FlatList
                            horizontal
                            data={posts}
                            renderItem={this.renderPosts}
                            keyExtractor={(item, index) => index}
                        />
                    }
                    renderSectionHeader={({ section: { title } }) => (
                        <Text style={styles.header}>{title}</Text>
                    )}
                />
            </SafeAreaView>





    renderPosts = (element) => {
        const { image, opinions, votes, name } = element.item;
        return (
            <Card>
                <Card.Cover source={{ uri: image }}/>
                <View>
                    <Card.Content>
                        <Title numberOfLines={1}>{name}</Title>
                    </Card.Content>

                    <Card.Content>
                        <Caption>{opinions} opinions</Caption>

                        <Headline style={{ fontSize: 10 }}>{votes}%</Headline>
                    </Card.Content>
                </View>
            </Card>
        )
    }
Run Code Online (Sandbox Code Playgroud)

JSON …

json reactjs react-native react-native-flatlist react-native-sectionlist

5
推荐指数
1
解决办法
1万
查看次数

如何避免每次选择/取消选择行时react-native FlatList 重新渲染

请参阅可重现的演示代码

我尝试在react-native FlatList 上构建一个简单的可选择列表。该功能很简单:FlatList 中的每一行都是可选择的。如果尚未选择某行,则单击该行将选择该行;如果该行已被选中,单击该行将取消选择它。

我面临的问题是每次单击一行时,所有行都会重新渲染,这可以从日志中得知(例如“渲染项 id=cameron.nguyen@example.com, selected=false”)。我想避免重新渲染未更改的行,因为重新渲染可能会很昂贵(在我想要加载非常大的图像或列表很长的情况下),但不知道如何做。我已经尝试过两者,<MomoizedItem />但前者根本不会改变重新渲染行为,而后者则使应用程序的行为非常奇怪,您可以尝试替换为其中之一来查看效果。我也尝试使用over ,但它也没有帮助。<MemoizedItem2 />React.memo<Item />onClickCallBackonClick

是我使用不当React.memo还是React.useCallBack使用不当?我可以做什么来满足需求?谢谢。

如果代码链接过期,请粘贴以下代码:

import React, { memo, useEffect, useState } from "react";
import { SafeAreaView, FlatList, StyleSheet } from "react-native";
import Constants from "expo-constants";
import { Set } from "immutable";
import { Button, ListItem } from "react-native-elements";
import axios from "axios";

const Item = ({ id, title, avatarUrl, selected, onClick }) => {
  console.log(`rendering …
Run Code Online (Sandbox Code Playgroud)

reactjs react-native react-native-flatlist react-hooks

5
推荐指数
1
解决办法
6785
查看次数

加载 React Native Recyclerlistview 时出现闪烁问题

我已经从 Flipkart 的 Flatlist 切换到 RecyclerlistView。但是像 onload 和 onscroll 这样的事件存在一些行渲染闪烁问题,这看起来很奇怪。有人对此有任何解决办法吗?

这是代码:

           <RecyclerListView
 
                optimizeForInsertDeleteAnimations={true}
                // initialOffset={800}

                initialRenderIndex={0}
                scrollsToTop={false}
                showsVerticalScrollIndicator={false}

                style={{ paddingBottom: 90 }}
                forceNonDeterministicRendering={true}
                layoutProvider={this._layoutProvider}

                dataProvider={this.state.dataProvider}
                extendedState={this.state.dataProvider}

                rowRenderer={this._rowRenderer}

                disableRecycling={true}

                // shouldComponentUpdate={true}
                // shouldComponentUpdate={this.shouldComponentUpdateList()}


                onEndReached={this.onEndReached}
                onEndReachedThreshold={0.1}
                renderFooter={this._renderFooter}
                scrollViewProps={{
                    // contentContainerStyle: { paddingBottom: (140) },
                    // stickyHeaderIndices: [1],
                    refreshControl:
                        <RefreshControl
                            refreshing={this.state.refreshing}
                            onRefresh={() => {
                                this._handleRefresh()
                            }}
                        />
                }}

            />
Run Code Online (Sandbox Code Playgroud)

reactjs react-native react-native-flatlist recyclerlistview react-flatlist

5
推荐指数
1
解决办法
819
查看次数

将数据添加到 FlatList 的开头而不改变位置

我正在尝试在平面列表中实现类似“onBeginReached”的道具。我想以对用户透明的方式在数据数组的开头附加一些数据。

所以使用这个 flatList :

const App = () => {
  const flatListRef = useRef(null);
  const [data, setData] = useState(generateData(20));

  const renderItem = ({ item }) => {
  console.log(item);
  return (
    <View style={styles.itemContainer}>
      <Text style={styles.itemText}>{item}</Text>
    </View>
  );
};

  const handleMomentumScroll = (event) => {
    console.log("Momentum end")
    const xOffset = event.nativeEvent.contentOffset.x;
    const index = Math.round(xOffset / 30);

    if (index < 1) {
      setData([-10 ,-9, -8, -7, -6,-5, -3, -2, -1, ...data]);
    }
  };

  return (
    <FlatList
      style={{ width: 200, alignSelf: 'center', marginTop: …
Run Code Online (Sandbox Code Playgroud)

react-native react-native-flatlist

5
推荐指数
1
解决办法
3079
查看次数

我们怎样才能使ListHeaderComponent成为SectionList中的粘性标题?

描述

我在里面使用水平选项卡栏ListHeaderComponent,我想将其ListHeaderComponent作为SectionList中的粘性标题。我们可以在平面列表中制作粘性标题,但它在部分列表stickyHeaderIndices={[0]}中不起作用

反应本机版本:

React Native Environment Info:
    System:
      OS: macOS 10.14.6
      CPU: (12) x64 Intel(R) Core(TM) i7-8850H CPU @ 2.60GHz
      Memory: 38.35 MB / 16.00 GB
      Shell: 5.3 - /bin/zsh
    Binaries:
      Node: 12.15.0 - /usr/local/bin/node
      Yarn: 1.21.1 - /usr/local/bin/yarn
      npm: 6.13.4 - /usr/local/bin/npm
      Watchman: 4.9.0 - /usr/local/bin/watchman
    SDKs:
      iOS SDK:
        Platforms: iOS 12.4, macOS 10.14, tvOS 12.4, watchOS 5.3
      Android SDK:
        API Levels: 28, 29
        Build Tools: 28.0.3, 29.0.1, 29.0.2
        System Images: android-26 …
Run Code Online (Sandbox Code Playgroud)

react-native expo react-native-flatlist react-native-sectionlist

5
推荐指数
1
解决办法
4345
查看次数

Apollo-Client 重新获取 - 类型错误:未定义不是对象

我在反应本机中有一个平面列表,我试图在拉下它时重新获取数据(本机刷新功能)。当我这样做时,我收到此错误:

类型错误:未定义不是对象

我不知道出了什么问题。我在用

  • 世博 SDK 38
  • "@apollo/client": "^3.1.3",
  • "graphql": "^15.3.0",

这是我的代码:

export default function DiscoverFeed({ navigation }) {
  const theme = useTheme();

  const { data, error, loading, refetch, fetchMore, networkStatus } = useQuery(
    GET_RECIPE_FEED,
    {
      variables: { offset: 0 },
      notifyOnNetworkStatusChange: true,
    }
  );

  if (error) return <Text>There was an error, try and reload.</Text>;
  if (loading) return <Loader />;
  if (networkStatus === NetworkStatus.refetch) return <Loader />;

  const renderItem = ({ item }) => {
    return (
      <View style={styles.cardItems}>
        <RecipeCard item={item} …
Run Code Online (Sandbox Code Playgroud)

react-native apollo-client react-native-flatlist

5
推荐指数
0
解决办法
2323
查看次数

React Native FlatList onViewableItemsChanged 回调在状态更改重新渲染后遇到错误

我需要设置状态来检测当前视口中的哪个项目可见。为此,我编写以下代码:

const [inViewPort, setInViewPort] = useState(0);

const viewabilityConfig = {
  viewAreaCoveragePercentThreshold: 30,
};

const onViewableItemsChanged = ({viewableItems, changed}) => {
  if (changed && changed.length > 0) {
    setInViewPort(changed[0].index);
  }
};

return (
  <SafeAreaView style={styles.container}>
    <FlatList
      data={myData}
      renderItem={renderItem}
      showsHorizontalScrollIndicator={false}
      keyExtractor={(_, index) => index.toString()}
      horizontal={true}
      onViewableItemsChanged={onViewableItemsChanged}
      viewabilityConfig={viewabilityConfig}
    />
  </SafeAreaView>
);
Run Code Online (Sandbox Code Playgroud)

onViewableItemsChanged 事件回调正确触发,但在我调用 setInViewPort 后,组件更新并重新呈现以下错误:

违反不变性:不支持动态更改 onViewableItemsChanged

在此输入图像描述

reactjs react-native react-native-flatlist

5
推荐指数
1
解决办法
6112
查看次数

React Native:FlatList 对于较大的项目列表会闪烁,对于较小的列表则不然

这是正在发生的事情:

-我正在 RN 中开发一个博客应用程序。每个用户都有一个个人资料页面,其中可以看到用户撰写的所有帖子。

-每个帖子都有一个缩略图,我按照我应该的方式在 FlatList 中渲染帖子。

-但是,如果列表足够大,例如 100+,则对于 iOS 和 Android,帖子中的图像在向上/向下滚动时会闪烁。这是可以理解的,这是一种糟糕的用户体验。

-有趣的是,如果列表相当小,图像根本不会闪烁。如果这是语法问题,所有图像都会闪烁。

- 使用 FlatList 时是否会出现这种行为?即在渲染大量项目时会出现问题吗?如果是这样,我该怎么做才能防止闪烁?

仅供参考,下面是我用于 FlatList 组件的代码。足够简单:

     const PostArray = (props) => {
         return (
             (props.postarray===null ?
             null  :
             <FlatList
                 data={props.postarray}
                 style={{marginTop:10}}
                 renderItem={({ item }) =>
                 <ProfilePostsPreview item={item}/>
             }
             keyExtractor={(item, index) => index.toString()}
             />
             )
         )
     }
Run Code Online (Sandbox Code Playgroud)

有什么建议吗?提前致谢!

react-native react-native-flatlist

5
推荐指数
0
解决办法
920
查看次数

如何在本机反应中更改平面列表滚动动画持续时间?

我现在有一个包含一堆项目的平面列表,当我按下按钮时,平面列表使用 ref 和scrollToIndex 方法向下滚动。但滚动动画比我需要的要快,是否有办法增加滚动动画持续时间?

这是向上滚动(向上滑动手势)功能的代码

const scrollUp = () => {
    console.log("Up Gesture", currentIndex);
    if (currentIndex <= DATA.length - 1) {
        if (currentIndex != DATA.length - 1) {
            flatlistRef.current.scrollToIndex({
                index: currentIndex + 1,
                animated: true,
                viewOffset: 200,

            });
            setCurrentIndex(currentIndex + 1);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

这是jsx返回的

return (
    <>
        <StatusBar hidden={true} />
        <Button title="click me" style={{ position: 'absolute', zIndex: 20, top: 20, }} onPress={() => scrollUp()} />
        <AnimatedFlatList
            {...{ onScroll, ListFooterComponent, ListHeaderComponent, onScrollEndDrag }}
            ref={flatlistRef}
            overScrollMode='never'
            // scrollEnabled={false}
            scrollEventThrottle={1}
            data={DATA}
            style={{ …
Run Code Online (Sandbox Code Playgroud)

react-native react-native-flatlist flatlist

5
推荐指数
0
解决办法
1299
查看次数

如何在应用程序本身中进行昂贵的操作,例如在反应本机中搜索大列表?

我有一个包含 10000 条记录的 json,需要在 Flatlist 中显示。我正在使用工作正常的虚拟化列表。现在我有某些过滤器,单击后应过滤掉 json 并使用新数据重新渲染列表。我只是过滤掉数据。

const filters = foo1;
const largeList = [{ id:1, foo:'foo1',bar:10 },{id:2, foo:'foo1',bar:20} ...]
const filteredList = largeList.filter(l=>l.foo === filters && l.bar > 10);
Run Code Online (Sandbox Code Playgroud)

过滤器是动态的,这会滞后于我的应用程序,因为它会给 UI 线程带来压力。我已经使用了InteractionManager.runafterinteractions()但在这种情况下不起作用。如何在应用程序中执行如此昂贵的操作而不阻塞 UI 线程?

ui-thread react-native react-native-flatlist

5
推荐指数
1
解决办法
592
查看次数