【发布时间】:2020-04-06 13:18:26
【问题描述】:
我正在创建一个信使应用程序,并且我有一个用于所有消息主屏幕的组件。我试图确保每次用户发送或接收消息时,组件都会使用最后发送的消息呈现和更新Flatlist。我有一个 firebase 实时数据库的监听器来监听更新。
我在我的应用程序中使用了函数式组件,我认为我错误地使用了 setState,因为它会导致我的组件多次重新渲染。
我已经彻底检查了提出的问题,但似乎没有一个与我的问题有关。
这是我的代码。
const AllMessagesScreen = ({ navigation }) => {
const uid = firebase.auth().currentUser.uid;
const [state, setState] = useState({
allMessages: []
});
const { allMessages } = state;
const fsdb = firebase.firestore().collection('Users');
const db = database().ref(`messages/${uid}`); //realtime database
const get = async () => {
try {
await db.on('value', snapshot => {
snapshot.forEach(item => {
const { key: _id } = item;
const { lastMessage } = item.val();
fsdb.doc(_id).get().then((doc => {
const otherUser = doc.data();
const newChat = {
id: _id,
name: otherUser.name,
picture: otherUser.pictures.thumbnailUrl,
lastMessage: lastMessage
};
setState(prevState => ({
allMessages: [...prevState.allMessages, newChat]
}));
})).catch((err) => {
console.log('caught', err)
});
});
});
} catch (err) {
console.log('error caught', err)
};
};
useEffect(() => {
get();
}, []);
return (
<View style={styles.screen}>
<FlatList
data={allMessages}
keyExtractor={item => item.id}
renderItem={({ item }) => (
<View style={{ flex: 1 }}>
<MessageCard
id={item.id}
name={item.name}
image={item.picture}
lastMessageText={item.lastMessage.text}
/>
</View>
)}
/>
</View>
);
}
我也试过这样设置状态
setState({ allMessages: [...allMessages, newUser] });
``
The second way only shows the last rendered message and gets rid of the rest.
Any help is really appreciated
【问题讨论】:
标签: javascript reactjs react-native