React native React本机平面列表一次呈现几个项目
我的应用程序中有一个聊天信息列表,底部添加了新项目。我使用了另一个SO问题中的一些代码,以便在添加新项目时将平面列表粘贴到底部,如下所示React native React本机平面列表一次呈现几个项目,react-native,React Native,我的应用程序中有一个聊天信息列表,底部添加了新项目。我使用了另一个SO问题中的一些代码,以便在添加新项目时将平面列表粘贴到底部,如下所示 <FlatList data={messages} renderItem={({item}) => <ChatMessage message={item}></ChatMessage>} keyExtractor={(item, index) => index.toString()} i
<FlatList
data={messages}
renderItem={({item}) => <ChatMessage message={item}></ChatMessage>}
keyExtractor={(item, index) => index.toString()}
initialNumToRender={messages.length}
initialScrollIndex={messages.length-1}
ref={ref => this.flatList = ref}
onContentSizeChange={(contentWidth, contentHeight)=>{
this.flatList.scrollToEnd();
}}
/>
}
keyExtractor={(项,索引)=>index.toString()}
initialNumToRender={messages.length}
initialScrollIndex={messages.length-1}
ref={ref=>this.flatList=ref}
onContentSizeChange={(contentWidth,contentHeight)=>{
这个.flatList.scrollToEnd();
}}
/>
问题是,当初始列表呈现时(仅35个项目,目前硬编码为一个数组),它似乎只呈现几个项目,然后向下滚动一点,再向下滚动几点,然后向下滚动一点,直到最终完成呈现并粘到底部。尽管添加了initialNumToRender={messages.length}并为每个结果呈现了一个非常简单的节点,但它仍然是不稳定且缓慢的
理想情况下,我想在向用户显示任何内容之前,我需要等待它完全渲染,但是(A)他们需要等待几秒钟才能开始使用聊天室,并且(B)我不认为平面列表是这样工作的,我假设在渲染之前元素必须是可见的
有没有更好的办法?(顺便说一下,在Android上测试)
编辑:添加ChatMessage组件以确保完整性
// Chat Message
import React, { Component } from 'react'
import {
StyleSheet,
ImageBackground,
Text,
View
} from 'react-native'
class ChatMessage extends Component {
constructor(props) {
super(props)
this.state = { }
}
render() {
return (
<View style={styles.chatMessage}>
<View style={styles.chatMessage_layout}>
<View style={styles.chatMessage_pic}>
<View style={styles.chatMessage_pic_image}>
<ImageBackground
source={require('./assets/images/profile-pics/example-profilr.png')}
style={styles.chatMessage_pic_image_background}
imageStyle={{ borderRadius: 40/2 }}
resizeMode="cover"
>
</ImageBackground>
</View>
</View>
<View style={styles.chatMessage_details}>
<View style={styles.chatMessage_name}>
<Text style={styles.chatMessage_name_text}>
{this.props.message.name}
<Text style={styles.chatMessage_name_time}> 24h</Text>
</Text>
</View>
<View style={styles.chatMessage_message}>
<Text style={styles.chatMessage_message_text}>{this.props.message.text}</Text>
</View>
</View>
</View>
</View>
)
}
}
export default ChatMessage;
const styles = StyleSheet.create({
chatMessage: {
paddingVertical: 10,
paddingHorizontal: 24
},
chatMessage_layout: {
flexDirection: 'row'
},
chatMessage_pic: {
width: 40,
height: 40,
marginRight: 12
},
chatMessage_pic_image: {
width: 40,
height: 40
},
chatMessage_pic_image_background: {
width: 40,
height: 40
},
chatMessage_details: {
flex: 1
},
chatMessage_name_text: {
color: '#FFF',
fontSize: 14,
fontWeight: 'bold'
},
chatMessage_name_time: {
fontSize: 11,
color: 'rgba(255,255,255,0.6)'
},
chatMessage_message: {
flexDirection: 'row',
alignItems: 'center'
},
chatMessage_message_text: {
color: '#FFF',
fontSize: 12
}
})
//聊天信息
从“React”导入React,{Component}
导入{
样式表,
图像背景,
文本,
看法
}从“反应本机”
类ChatMessage扩展组件{
建造师(道具){
超级(道具)
this.state={}
}
render(){
返回(
{this.props.message.name}
24小时
{this.props.message.text}
)
}
}
导出默认聊天信息;
const styles=StyleSheet.create({
聊天室留言:{
填充垂直:10,
水平方向:24
},
聊天室布局:{
flexDirection:“行”
},
图片:{
宽度:40,
身高:40,
marginRight:12
},
聊天信息图片图片:{
宽度:40,
身高:40
},
聊天信息\图片\图像\背景:{
宽度:40,
身高:40
},
chatMessage\u详细信息:{
弹性:1
},
聊天室信息\u名称\u文本:{
颜色:“#FFF”,
尺寸:14,
fontWeight:“粗体”
},
聊天室信息\u姓名\u时间:{
尺寸:11,
颜色:“rgba(255255,0.6)”
},
chatMessage\u消息:{
flexDirection:'行',
对齐项目:“中心”
},
聊天室消息\u消息\u文本:{
颜色:“#FFF”,
字体大小:12
}
})
如果项目数量较少,并且希望一次渲染所有项目,则应使用
ScrollView:一次渲染所有元素,但如果有大量元素,则渲染速度较慢
FlatList:在项目即将出现时,以延迟模式呈现项目,并在项目离开可见显示时将其删除,以节省内存,使其可用于大型列表的性能
对于平面列表优化,无论何时渲染子对象,您都需要使用PureComponent
,以便仅渲染子对象
此外,在
密钥提取程序
中,为项目
使用唯一id,并且不要依赖索引
,因为当项目更新时,索引
不可靠,可能会更改您是否也可以在中发布您的聊天信息
组件,他使用列表从下到上进行渲染。添加子组件感谢@Kranthi,我们将对此进行研究。感谢Pritish,我想知道“大数字”是什么意思?我可能不会允许超过100人。我似乎已经发现inversed=“true”似乎在工作,并且从下到上呈现列表,这不是我在文档中有限的描述中所期望的(我只需要颠倒数组的顺序)。我认为你的答案是正确的,我不确定你是否想为可能遇到这个答案的人添加关于inversed=“true”的内容?大量的数字大约是1000
,我只是想强调一下Flatlist
和ScrollView
的默认行为,以及PureComponent
的使用,这将大大提高性能。其余的都是表面上的改变。