reactjs - 反应:socket.io 和 useEffect 无法正常工作
问题描述
所以我正在用 react 学习 socket.io,我遇到了一个问题。我想要发生的是,当用户在字段中输入内容并提交时,它会使每个人的浏览器的标题都输入。但是,如果您的文本字段等于传播给每个人的消息(意味着可能是您单击了 Enter),它将使您的标题为“您更改了它”。
但是,似乎在 io.on(message) 中,当它检查输入状态是否等于消息时,它总是根据消息检查状态的初始值,即 ''。
我猜这是因为当状态为''时在开始时调用useEffect,所以它将io.on(消息)硬编码为当时的状态。我想解决这个问题,我只需将 input 作为 useEffect 的依赖数组的一部分,但这不会覆盖当前的 io.on(message),它会使其重载,因此两者都被调用。不知道如何解决这个问题!
import React from 'react'
import io from 'socket.io-client'
const SocketTest = (props: any) => {
const socket = io('http://localhost:4000')
const [input, setInput] = React.useState<string>('')
const handleNewMessage = (message: string) => {
console.log(input)
if (input !== message){
document.title = message
} else {
document.title = 'You changed it!'
}
}
React.useEffect(() => {
socket.on('message', (message: string) => {
handleNewMessage(message)
})
}, [])
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setInput(e.target.value)
}
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault()
socket.emit('message', input)
}
return (
<div>
<h2 className="center">{ input }</h2>
<form onSubmit={ (e) => handleSubmit(e) }>
<input type="text" placeholder="Enter text" onChange={ (e) => handleChange(e) }/>
</form>
</div>
)
}
export default SocketTest
我也确信我可以通过广播消息而不是发出消息来解决这个问题,但我更想学习如何解决这个问题。
解决方案
推荐阅读
- integration - Unity XR 集成场景对象随着头部运动而旋转
- python - 解析 XML 以在不和谐 python 中按天发布事件
- java - 当 IDE 可以推断无效时,@Nullable 是否仍用于方法返回?
- c - strcpy 一个静态 char 数组转换成一个动态分配的 char 数组以节省内存
- angular - 如何将参数从派生组件类传递到基类
- css - 多列布局 - Chrome 检查器和视图不匹配
- visual-studio-code - 从 App Studio 中删除应用时如何再次执行 Microsoft Teams 应用
- laravel-backpack - 如何将 Spatie 媒体库与 Backpack 一起用于 Laravel 上传字段?
- firebase - 如何在 SliverList 中构建 StreamBuilder
- python-3.x - Facebook GraphAPI 无需使用生成器即可获得短期访问令牌