Reactjs 反应:socket.io和useffect工作不正常

Reactjs 反应:socket.io和useffect工作不正常,reactjs,socket.io,Reactjs,Socket.io,因此,我正在使用react学习socket.io,我遇到了一个问题。我想发生的是,当用户在字段中输入并提交某个内容时,它会使每个人的浏览器的标题成为该输入。但是,如果您的文本字段等于与每个人传播的消息(意味着可能是您单击了enter),则标题将变为“you changed it” 但是,在io.on(message)中,当它检查输入状态是否等于消息时,它总是根据消息检查状态的初始值,即“” 我猜这是因为useEffect在状态为“”时在开始时被调用,所以它硬编码io.on(消息)为当时的状态。我

因此,我正在使用react学习socket.io,我遇到了一个问题。我想发生的是,当用户在字段中输入并提交某个内容时,它会使每个人的浏览器的标题成为该输入。但是,如果您的文本字段等于与每个人传播的消息(意味着可能是您单击了enter),则标题将变为“you changed it”

但是,在io.on(message)中,当它检查输入状态是否等于消息时,它总是根据消息检查状态的初始值,即“”

我猜这是因为useEffect在状态为“”时在开始时被调用,所以它硬编码io.on(消息)为当时的状态。我认为要解决这个问题,我只需要将输入作为useEffect依赖性数组的一部分,但这不会覆盖当前的io。在(消息)上,它会重载它,因此两者都被调用。我不知道怎么解决这个问题

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
从“React”导入React
从“socket.io客户端”导入io
const SocketTest=(道具:任意)=>{
常量套接字=io('http://localhost:4000')
常量[input,setInput]=React.useState(“”)
const handleNewMessage=(消息:字符串)=>{
console.log(输入)
如果(输入!==消息){
document.title=消息
}否则{
document.title='您更改了它!'
}
}
React.useffect(()=>{
socket.on('message',(message:string)=>{
handleNewMessage(消息)
})
}, [])
常量handleChange=(e:React.ChangeEvent)=>{
设置输入(如目标值)
}
const handleSubmit=(e:React.FormEvent)=>{
e、 预防默认值()
socket.emit('message',input)
}
返回(
{input}
handleSubmit(e)}>
handleChange(e)}/>
)
}
导出默认SocketTest

我也相信我可以通过广播信息而不是发出信息来解决这个问题,但我正在努力学习如何解决这个问题。

这是否回答了你的问题?对绝对传奇这能回答你的问题吗?对绝对传奇