reactjs - setState 中的扩展运算符执行两次而不是一次
问题描述
当用户提交表单时,onSubmitMessage() 会被调用,这反过来会向服务器端的套接字发出一个事件,当向客户端发送响应时,它会执行两次 setState 函数而不是一次。
客户端代码
state = {
message: '',
currentChat: []
}
onChangeMessage = (event) => {
this.setState({
message: event.target.value
});
}
onSubmitMessage = (event) => {
event.preventDefault();
this.setState({
message: ''
});
console.log(this.state.message);
socket.emit('inputMessage', {
username: this.props.username,
message: this.state.message
});
socket.on('currentsocketchat', (data) => {
console.log('data is ',data.message);
this.setState({
currentChat: [...this.state.currentChat, data.message]
}, () => console.log(this.state.currentChat));
});
}
render() {
return (
<div className="inputbar">
<form onSubmit={this.onSubmitMessage}>
<input
ref={this.inputRef}
type="text"
placeholder="Enter message"
value={this.state.message}
onChange={this.onChangeMessage} />
</form>
</div>
)
}
//Server side code
socket.on('inputMessage', (data) => {
console.log(data.username, data.message);
const newChat = new Chat({
name: data.username,
message: data.message,
});
newChat.save().then(() => {
socket.emit('currentsocketchat', newChat);
// socket.broadcast.emit('broadcastchat', data);
}).catch((e) => {
console.log(e);
})
});
当我提交输入值为“Hiii”的表单时,this.state.currentChat 的输出应该是 [“Hiii”]。当我再次发送“Hello”时,输出应该是 ["Hii","Hello"] 而我得到的输出是 ["Hii","Hello", "Hello"]
解决方案
每次onSubmitMessage
执行时,您都在向套接字消息添加一个侦听器。所以第二次提交,回调会被调用两次,第三次提交会被调用3次。移动socket.on('currentsocketchat'...
到componentDidMount
,这应该工作。
推荐阅读
- javascript - Node.js Puppeteer UnhandledPromiseRejectionWarning 试图导航谷歌地图
- scheme - 如何将框表示转换为括号表示
- google-cloud-platform - GCP 负载均衡器指向 /bucket/folder1/folder2/index.html 中的 index.html
- flutter - 从 Flutter 中的其他文件调用字符串列表
- visual-studio - 如何更改 Visual Studio 项目的安装位置?
- python - 按条件子集python数据框
- python - 删除所有文件夹但将所有文件保留在文件夹中的程序/脚本
- c - 程序在没有声明 wait() 函数后编译并正常工作。为什么?
- python - 如何从嵌套标签的页面中提取文本
- amazon-web-services - 当创建时没有为 EC2 实例分配公共 IP 时,EC2 实例未向 ECS 注册