【发布时间】:2021-02-10 16:49:50
【问题描述】:
我有一个聊天组件,它在快乐流程上运行良好,但是当我进入另一个视图(意味着我退出聊天组件)并在聊天组件中返回之后,我收到了重复的消息。
我将console.log 放入由enter 事件触发的函数中,但它只显示一次。但是,我认为从内部触发两次发射是因为在服务器端(nodeJs)我两次获取数据。
这是我的代码:
function Chat() {
let [chatInput, setChatInput] = useState('');
let [chatArea, setChatArea] = useState([]);
const handleOnChange = (e) => {
setChatInput(e.target.value)
}
useEffect(() => {
const addTextMessage = (event) => {
if (event.keyCode === 13 && chatInput.value !== '') {
event.preventDefault();
socket.emit('chat', {
message: chatInput.value
});
setChatInput('');
}
}
const chatInput = document.querySelector('.chat-input input');
chatInput.addEventListener("keyup", addTextMessage, false);
socket.on('chat', (data) => {
setChatArea(prevInputState => (
[...prevInputState, <section key={prevInputState.length}>{data.sender}: {data.message}</section>]
))
})
return () => {
chatInput.removeEventListener("keyup", addTextMessage, false);
socket.off('chat');
};
}, []);
return (
<React.Fragment>
<section className="chat-room">
<div className="chat-area">
{chatArea}
</div>
<div className="chat-input">
<input value={chatInput} onChange={handleOnChange} type="text" />
</div>
</section>
</React.Fragment>
);
}
【问题讨论】:
标签: javascript reactjs websocket emit