我正在尝试在部分列表中呈现几个平面列表。最终目标是这样的:
但是,我似乎无法让它正确渲染。它多次渲染同一个项目。
<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
我尝试在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) 我已经从 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
我正在尝试在平面列表中实现类似“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) 我在里面使用水平选项卡栏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
我在反应本机中有一个平面列表,我试图在拉下它时重新获取数据(本机刷新功能)。当我这样做时,我收到此错误:
类型错误:未定义不是对象
我不知道出了什么问题。我在用
这是我的代码:
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) 我需要设置状态来检测当前视口中的哪个项目可见。为此,我编写以下代码:
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
这是正在发生的事情:
-我正在 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)
有什么建议吗?提前致谢!
我现在有一个包含一堆项目的平面列表,当我按下按钮时,平面列表使用 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) 我有一个包含 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 线程?