onViewableItemsChanged 回调不正确
来源:7-13 FlatList 高性能列表组件

西瓜一号
2024-06-25
import React, { useEffect, useRef } from "react"; import { FlatList, StyleSheet, Text, View } from "react-native"; export default () => { const data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41]; const renderItem = ({ item, index }) => { return ( <Text style={s.txt}>{`list item ${item}`}</Text> ); }; const renderItem2 = ({ item, index }) => { return ( <Text style={s.txt2}>{`list item ${item}`}</Text> ); }; const ListHeader = ( <View style={[s.txt, s.headAndFoot]}> <Text style={s.headAndFootText}>列表头部</Text> </View> ); const Listfooter = ( <View style={[s.txt, s.headAndFoot]}> <Text style={s.headAndFootText}>列表尾部</Text> </View> ); const flatListRef = useRef(null) // useEffect(() => { // setTimeout(() => { // flatListRef.current.data = data // }, 2000); // }, []); const Listempty = ( < View style={s.listEmpty} > <Text style={{ color: '#666666' }}>暂时无数据哦~</Text> </View >); return ( <FlatList style={s.root} ref={flatListRef} data={data} //数据源 renderItem={renderItem} //每隔元素样式 keyExtractor={(_, index) => { `item - ${index}` }} //唯一标识符 // scroll 属性 contentContainerStyle={s.containerStyle} showsVerticalScrollIndicator={false} onScroll={(event) => { console.log(event.nativeEvent.contentOffset.y); }} keyboardDismissMode='on-drag' keyboardShouldPersistTaps='never' // 表头 表尾 ListHeaderComponent={ListHeader} ListFooterComponent={Listfooter} //无数据显示view 占位样式 ListEmptyComponent={Listempty} // 分隔 样式组件 ItemSeparatorComponent={<View style={s.separator}></View>} //初次渲染数量 一般超过一屏,用于长列表优化性能 initialNumToRender={15} //反向渲染 inverted={false} //多列排布 瀑布流 numColumns={1} // 回调 当前屏幕显示的item数组 onViewableItemsChanged={(info) => { const { viewableItems } = info; console.log(viewableItems); console.log('Changed items:', info.changed); }} > </FlatList> // <FlatList style={s.root} // data={data} //数据源 // renderItem={renderItem2} //每隔元素样式 // keyExtractor={(_, index) => {`item - ${index}`}} //唯一标识符 // horizontal={true} // showsHorizontalScrollIndicator={false} // > // </FlatList> ); }; const s = StyleSheet.create({ root: { width: '100%', height: '100%', backgroundColor: 'gray', }, txt: { width: '100%', height: 56, fontSize: 32, color: 'black', textAlignVertical: 'center', textAlign: 'center', // marginTop: 10, backgroundColor: 'pink', }, headAndFoot: { backgroundColor: 'yellow', }, headAndFootText: { textAlignVertical: 'center', textAlign: 'center', fontSize: 34, height: '100%', backgroundColor: '#d3f8c4' }, txt2: { width: 200, height: 200, fontSize: 32, color: 'black', textAlignVertical: 'center', textAlign: 'center', marginLeft: 10, backgroundColor: 'yellow', }, containerStyle: { paddingHorizontal: 16, paddingTop: 10, backgroundColor: 'green', }, listEmpty: { width: '100%', height: 400, justifyContent: 'center', backgroundColor: 'pink', textAlignVertical: 'center', alignItems: 'center', }, separator: { width: '100%', height: 1, backgroundColor: '#d0d0d0', }, });
onViewableItemsChanged
只在reload,或者启动的时候回调一次,后续滚动都不走回调
启动时回调打印如下
[{"index": 0, "isViewable": true, "item": 1, "key": undefined}]
onScroll
回调正常的
写回答
1回答
-
原因是:你的keyExtractor写了一个大括号,但是没有写return,导致返回的是空。
正确写法有两种:
keyExtractor={(_, index) => {return `item - ${index}`;}}
或者不要写大括号:
keyExtractor={(_, index) => `item - ${index}`}
012024-06-27
相似问题