Flatlist 覆盖之前的数据
Flatlist overwrite previous data
问题
我有一个平面列表,在用户点击“显示更多”按钮后,这个平面列表需要填充额外的项目。如果我按下按钮,我可以更新组件的状态,但平面列表不会呈现旧项目。它只是覆盖它们。我不明白我错过了什么
代码
旧数据
const [resultsData, setResultsData] = useState([
{ description: '10/10/2019', reportId: 2131231734, reportNumber: 2131231734 },
{ description: '12/10/2019', reportId: 2131231636, reportNumber: 2131231636 },
{ description: '15/10/2019', reportId: 2131231777, reportNumber: 2131231777 },
{ description: '12/11/2019', reportId: 2131231666, reportNumber: 2131231666 },
{ description: '10/10/2019', reportId: 2131231555, reportNumber: 2131231555 },
{ description: '10/10/2019', reportId: 2131231444, reportNumber: 2131231444 },
{ description: '10/10/2019', reportId: 2131231333, reportNumber: 2131231333 },
{ description: '10/10/2019', reportId: 2131231222, reportNumber: 2131231222 },
{ description: '10/10/2019', reportId: 2131231111, reportNumber: 2131231111 },
{ description: '10/10/2019', reportId: 2131231000, reportNumber: 2131231000 },
]);
我需要添加的新数据
const _showMore = () => {
setRefresh(true);
setResultsData([
...resultsData,
{ description: '10/10/2019', reportId: 32131231734, reportNumber: 2131231734 },
{ description: '12/10/2019', reportId: 32131231636, reportNumber: 2131231636 },
{ description: '15/10/2019', reportId: 32131231777, reportNumber: 2131231777 },
{ description: '12/11/2019', reportId: 32131231666, reportNumber: 2131231666 },
{ description: '10/10/2019', reportId: 42131231555, reportNumber: 2131231555 },
{ description: '10/10/2019', reportId: 52131231444, reportNumber: 2131231444 },
{ description: '10/10/2019', reportId: 62131231333, reportNumber: 2131231333 },
{ description: '10/10/2019', reportId: 27131231222, reportNumber: 2131231222 },
{ description: '10/10/2019', reportId: 82131231111, reportNumber: 2131231111 },
{ description: '10/10/2019', reportId: 92131231000, reportNumber: 2131231000 },
]);
setRefresh(false);
};
组件
const _renderReportCard = ({ item }) => (
<GenericListItem
textLeft={item.reportId}
icon={downloadIcon}
onPress={() => fetchResultDetails(item.reportId)}
textRight={item.description}
/>
);
return (
<StyledContainer>
<ReportsList
style={{ flex: 1 }}
initialNumToRender={resultsData.length}
extraData={resultsData}
data={resultsData}
keyExtractor={_keyExtractor}
renderItem={_renderReportCard}
getItemLayout={(data, index) => ({ length: 40, offset: 40 * index, index })}
onRefresh={_showMore}
refreshing={refresh}
/>
<View>
<ShowMore onPress={_showMore}>
<ShowMoreText>{t('show').toUpperCase()}</ShowMoreText>
</ShowMore>
</View>
</StyledContainer>
);
预期行为
我需要在按下 ShowMore 按钮时查看所有 20 个项目。
我重新创建了您的示例,它运行良好。
代码:
export default function App() {
const [resultsData, setResultsData] = React.useState([
{ description: '10/10/2019', reportId: 2131231734, reportNumber: 2131231734 },
{ description: '12/10/2019', reportId: 2131231636, reportNumber: 2131231636 },
{ description: '15/10/2019', reportId: 2131231777, reportNumber: 2131231777 },
{ description: '12/11/2019', reportId: 2131231666, reportNumber: 2131231666 },
{ description: '10/10/2019', reportId: 2131231555, reportNumber: 2131231555 },
{ description: '10/10/2019', reportId: 2131231444, reportNumber: 2131231444 },
{ description: '10/10/2019', reportId: 2131231333, reportNumber: 2131231333 },
{ description: '10/10/2019', reportId: 2131231222, reportNumber: 2131231222 },
{ description: '10/10/2019', reportId: 2131231111, reportNumber: 2131231111 },
{ description: '10/10/2019', reportId: 2131231000, reportNumber: 2131231000 },
]);
const _showMore = () => {
setResultsData([
...resultsData,
{ description: '10/10/2019', reportId: 32131231734, reportNumber: 2131231734 },
{ description: '12/10/2019', reportId: 32131231636, reportNumber: 2131231636 },
{ description: '15/10/2019', reportId: 32131231777, reportNumber: 2131231777 },
{ description: '12/11/2019', reportId: 32131231666, reportNumber: 2131231666 },
{ description: '10/10/2019', reportId: 42131231555, reportNumber: 2131231555 },
{ description: '10/10/2019', reportId: 52131231444, reportNumber: 2131231444 },
{ description: '10/10/2019', reportId: 62131231333, reportNumber: 2131231333 },
{ description: '10/10/2019', reportId: 27131231222, reportNumber: 2131231222 },
{ description: '10/10/2019', reportId: 82131231111, reportNumber: 2131231111 },
{ description: '10/10/2019', reportId: 92131231000, reportNumber: 2131231000 },
]);
};
const renderItem = (item) => {
console.log('length', resultsData.length);
return (
<View key={item.reportId}>
<Text> {item.reportId} </Text>
</View>
);
}
return (
<View style={styles.container}>
<FlatList
data={resultsData}
renderItem={({item}) => renderItem(item)}
/>
<Button onPress={() => _showMore()} title="Show more" />
</View>
);
}
演示:
问题
我有一个平面列表,在用户点击“显示更多”按钮后,这个平面列表需要填充额外的项目。如果我按下按钮,我可以更新组件的状态,但平面列表不会呈现旧项目。它只是覆盖它们。我不明白我错过了什么
代码
旧数据
const [resultsData, setResultsData] = useState([
{ description: '10/10/2019', reportId: 2131231734, reportNumber: 2131231734 },
{ description: '12/10/2019', reportId: 2131231636, reportNumber: 2131231636 },
{ description: '15/10/2019', reportId: 2131231777, reportNumber: 2131231777 },
{ description: '12/11/2019', reportId: 2131231666, reportNumber: 2131231666 },
{ description: '10/10/2019', reportId: 2131231555, reportNumber: 2131231555 },
{ description: '10/10/2019', reportId: 2131231444, reportNumber: 2131231444 },
{ description: '10/10/2019', reportId: 2131231333, reportNumber: 2131231333 },
{ description: '10/10/2019', reportId: 2131231222, reportNumber: 2131231222 },
{ description: '10/10/2019', reportId: 2131231111, reportNumber: 2131231111 },
{ description: '10/10/2019', reportId: 2131231000, reportNumber: 2131231000 },
]);
我需要添加的新数据
const _showMore = () => {
setRefresh(true);
setResultsData([
...resultsData,
{ description: '10/10/2019', reportId: 32131231734, reportNumber: 2131231734 },
{ description: '12/10/2019', reportId: 32131231636, reportNumber: 2131231636 },
{ description: '15/10/2019', reportId: 32131231777, reportNumber: 2131231777 },
{ description: '12/11/2019', reportId: 32131231666, reportNumber: 2131231666 },
{ description: '10/10/2019', reportId: 42131231555, reportNumber: 2131231555 },
{ description: '10/10/2019', reportId: 52131231444, reportNumber: 2131231444 },
{ description: '10/10/2019', reportId: 62131231333, reportNumber: 2131231333 },
{ description: '10/10/2019', reportId: 27131231222, reportNumber: 2131231222 },
{ description: '10/10/2019', reportId: 82131231111, reportNumber: 2131231111 },
{ description: '10/10/2019', reportId: 92131231000, reportNumber: 2131231000 },
]);
setRefresh(false);
};
组件
const _renderReportCard = ({ item }) => (
<GenericListItem
textLeft={item.reportId}
icon={downloadIcon}
onPress={() => fetchResultDetails(item.reportId)}
textRight={item.description}
/>
);
return (
<StyledContainer>
<ReportsList
style={{ flex: 1 }}
initialNumToRender={resultsData.length}
extraData={resultsData}
data={resultsData}
keyExtractor={_keyExtractor}
renderItem={_renderReportCard}
getItemLayout={(data, index) => ({ length: 40, offset: 40 * index, index })}
onRefresh={_showMore}
refreshing={refresh}
/>
<View>
<ShowMore onPress={_showMore}>
<ShowMoreText>{t('show').toUpperCase()}</ShowMoreText>
</ShowMore>
</View>
</StyledContainer>
);
预期行为
我需要在按下 ShowMore 按钮时查看所有 20 个项目。
我重新创建了您的示例,它运行良好。
代码:
export default function App() {
const [resultsData, setResultsData] = React.useState([
{ description: '10/10/2019', reportId: 2131231734, reportNumber: 2131231734 },
{ description: '12/10/2019', reportId: 2131231636, reportNumber: 2131231636 },
{ description: '15/10/2019', reportId: 2131231777, reportNumber: 2131231777 },
{ description: '12/11/2019', reportId: 2131231666, reportNumber: 2131231666 },
{ description: '10/10/2019', reportId: 2131231555, reportNumber: 2131231555 },
{ description: '10/10/2019', reportId: 2131231444, reportNumber: 2131231444 },
{ description: '10/10/2019', reportId: 2131231333, reportNumber: 2131231333 },
{ description: '10/10/2019', reportId: 2131231222, reportNumber: 2131231222 },
{ description: '10/10/2019', reportId: 2131231111, reportNumber: 2131231111 },
{ description: '10/10/2019', reportId: 2131231000, reportNumber: 2131231000 },
]);
const _showMore = () => {
setResultsData([
...resultsData,
{ description: '10/10/2019', reportId: 32131231734, reportNumber: 2131231734 },
{ description: '12/10/2019', reportId: 32131231636, reportNumber: 2131231636 },
{ description: '15/10/2019', reportId: 32131231777, reportNumber: 2131231777 },
{ description: '12/11/2019', reportId: 32131231666, reportNumber: 2131231666 },
{ description: '10/10/2019', reportId: 42131231555, reportNumber: 2131231555 },
{ description: '10/10/2019', reportId: 52131231444, reportNumber: 2131231444 },
{ description: '10/10/2019', reportId: 62131231333, reportNumber: 2131231333 },
{ description: '10/10/2019', reportId: 27131231222, reportNumber: 2131231222 },
{ description: '10/10/2019', reportId: 82131231111, reportNumber: 2131231111 },
{ description: '10/10/2019', reportId: 92131231000, reportNumber: 2131231000 },
]);
};
const renderItem = (item) => {
console.log('length', resultsData.length);
return (
<View key={item.reportId}>
<Text> {item.reportId} </Text>
</View>
);
}
return (
<View style={styles.container}>
<FlatList
data={resultsData}
renderItem={({item}) => renderItem(item)}
/>
<Button onPress={() => _showMore()} title="Show more" />
</View>
);
}
演示: