javascript - React-为什么多次调用 useEffect (即使有条件)?
问题描述
我在一个带有反应钩子的简单聊天应用程序上工作。在第二个 useEffect 中,我需要将新消息附加到其余消息中,以便能够在聊天中显示所有消息。现在,我只能在从数组长度调用 x2 后才能附加消息。例如:在第四条消息中,UseEffect 将在数组完成之前执行 8 次。
注意:在 useEffect 我 setAllMessages 两次但只有一个正在执行,这很好取决于它是否是发件人的接收者(所以我不认为这是问题)
function Chat() {
const [message, setMessage] = useState("");
const [userName] = useState(
JSON.parse(atob(localStorage.getItem("token").split(".")[1])).name
);
const [userTyping, setUserTyping] = useState(null);
const [allMessages, setAllMessages] = useState([]);
useEffect(() => {
socket.emit("join", userName);
socket.on("chat-message", data => {
toast(`Hello ${data}`);
});
socket.on("user-joined", data => {
toast(`${data} joined the chat`);
});
}, [userName]);
useEffect(() => { // the problem is here
function handleAllMessages(data) {
setAllMessages([...allMessages, data]);
console.log(allMessages);
}
socket.on("broadcast-message", data => {
handleAllMessages(data);
});
socket.on("my-message", data => {
data["userName"] = "You";
handleAllMessages(data);
});
}, [allMessages]);
useEffect(() => {
socket.on("who-typing", data => {
setUserTyping(data);
setTimeout(() => {
setUserTyping(null);
}, 2500);
});
}, [userTyping]);
useEffect(() => {
socket.on("user-disconnected", data => {
toast(`${data} left the chat`);
});
}, []);
function handleChat(e) {
e.preventDefault();
if (message.trim() === "") return toast.warn("not valid message");
socket.emit("user-message", message, userName);
setMessage("");
}
function handleChange(e) {
setMessage(e.target.value);
socket.emit("typing", userName);
}
return (...
解决方案
第二个useEffect
将被执行多次的原因 - 我想是无限的 - 是因为你告诉它每次allMessages
更改都执行,因为它在数组中 - 的第二个参数useEffect
。
在其中传递该数组allMessages
将导致useEffect
每次allMessages
更改时重新运行,这实际上是您在useEffect
调用handleAllMessages
函数时在内部执行的操作。
推荐阅读
- php - 检索邮递员在php中提交的json
- unity3d - 如何统一显示2个形状的相交边?
- java - 透明背景上的 setColor 未显示正确的颜色
- python - 条形图中的动态阈值线
- python - 为什么 lambda x: x % 2 表示奇数
- reactjs - 如何添加 favicon 以响应应用程序浏览器选项卡(重复)
- r-markdown - 更改 kableExtra 的 PDF 输出中的字体系列
- java - 如何在 Netbeans 8.2 中使用 XSD 1.1?
- node.js - NodeJs 和 MongoDB
- c# - 来自客户端的 WCF SOAP 动态 ContentType 处理