【发布时间】:2022-01-11 20:27:04
【问题描述】:
我对如何删除消息数组的无限循环感到困惑。我的代码看起来像这样。如果有人可以帮助我,那就太好了。
从 "react" 导入 React, { useEffect, useState };
import classes from "./Chat.module.css";
import StarOutlineOutlinedIcon from "@mui/icons-material/StarOutlineOutlined";
import InfoOutlinedIcon from "@mui/icons-material/InfoOutlined";
import { selectRoomId } from "../../src/features/appSlice";
import ChatInput from "./ChatInput";
import { useSelector } from "react-redux";
import {
collection,
query,
orderBy,
getFirestore,
doc,
getDoc,
getDocs,
} from "firebase/firestore";
import Message from "./Message";
function Chat() {
const roomId = useSelector(selectRoomId);
const [channelNameData, setChannelNameData] = useState("");
const [messages, setChannelMessages] = useState([]);
useEffect(() => {
console.log('running........');
async function getRoomDetails() {
const db = getFirestore();
const docRef = roomId && doc(db, "rooms", roomId);
const docSnap = roomId && (await getDoc(docRef));
if (docSnap?.exists()) {
setChannelNameData(docSnap.data().name);
}
}
async function getRoomMessages() {
const db = getFirestore();
const roomMessages =
(await roomId) &&
query(
collection(db, "rooms", roomId, "messages"),
orderBy("timestamp", "asc")
);
if (roomMessages) {
const querySnapShot = await getDocs(roomMessages);
const finalMessages = [];
querySnapShot.forEach((doc) => {
finalMessages.push({
id: doc.id,
value: doc.data(),
});
});
setChannelMessages(finalMessages);
}
}
getRoomDetails().then(() => {
getRoomMessages();
});
}, [roomId]);
useEffect(()=>{
console.log('running2....');
console.log(messages);
async function getRoomMessages() {
const db = getFirestore();
const roomMessages =
(await roomId) &&
query(
collection(db, "rooms", roomId, "messages"),
orderBy("timestamp", "asc")
);
if (roomMessages) {
const querySnapShot = await getDocs(roomMessages);
const finalMessages = [];
querySnapShot.forEach((doc) => {
finalMessages.push({
id: doc.id,
value: doc.data(),
});
});
setChannelMessages(finalMessages);
}
}
getRoomMessages();
},[messages, roomId])
return (
<div className={classes["chat-container"]}>
<div className={classes.header}>
<div className={classes["header-left"]}>
<h4>
<strong>#{channelNameData}</strong>
</h4>
<StarOutlineOutlinedIcon className={classes.star} />
</div>
<div className={classes["header-right"]}>
<p>
<InfoOutlinedIcon className={classes.info} /> Details
</p>
</div>
</div>
<div className={classes["chat-messages"]}>
{messages?.map((doc) => {
const { message, timestamp, user, userImage } = doc.value;
return (
<Message
key={doc.id}
message={message}
timestamp={timestamp}
user={user}
userimage={userImage}
>
{message}
</Message>
);
})}
</div>
<ChatInput channelName={channelNameData} channelId={roomId} />
</div>
);
}
export default Chat;
每次添加新消息时,我都需要获取消息。我已经坚持了很长一段时间。有人可以帮忙吗?
【问题讨论】:
-
你能解释一下为什么当react中的消息对象发生变化时,你需要再次从数据库中查询消息吗?
-
每当添加新消息时,我都需要更改 UI。我怎样才能做到这一点?也没有直接的事件监听器。有什么解决办法吗? @HOERNSCHEN
-
并将消息添加到 Firebase 数据库?
-
是的。没错。
标签: reactjs firebase react-hooks