javascript - React useState() - 在数组中添加新元素不起作用
问题描述
我正在使用 React native 和 socket.io 制作聊天应用程序,但是当我收到一条消息时,我想添加到消息数组中。但不知何故它不起作用。它替换数组元素而不是向其推送/添加元素。
const [messages, setMessages] = useState([])
useEffect(() => {
const id = data.id
receiveMessage(id)
}, []);
async function receiveMessage(id){
await message.init(id)
message.recieveMessage(message=>{
setMessages([...messages, message])//something is wrong over here
})
}
async function send(){
if(text){
message.sendMessage(text, data=>{
setMessages([...messages, data])//this part works perfectly
})
}
setText(null)
}
这是Messages object
:
export class Message {
private socket: Socket
private room: string
constructor(socketio: Socket){
this.socket = socketio
this.room = null
}
async init(id: string){
if(id === this.room) {
return
}
this.room = id
this.socket.emit("join", {id: id, session: await getSessionToken()})
const prom = new Promise((res, rej)=>{
this.socket.on("joined", message=>{
res("done")
})
})
await prom
return "done"
}
public sendMessage(message: string, callback){
const socket = this.socket
socket.emit("message", message)
socket.on("sent", callback)
}
public recieveMessage(callback){
const socket = this.socket
socket.on("receive message", callback)
}
}
解决方案
是否有可能是因为您没有将先前的状态传递给setMessages
调用?
也许试试这样的东西
async function receiveMessage(id) {
await message.init(id)
message.recieveMessage(message => {
setMessages(prevMessages => [...prevMessages, message])
})
}
推荐阅读
- cmd - SSL 证书添加失败,错误:183 当文件已存在时无法创建文件 - 如何将证书绑定到 ipport?
- android-studio - 如何制作多层水平recyclerview或gridlayout?
- python - 在Python中将值列表拆分为数据框
- tensorflow - 如何使用 TF 2.0 tf.recompute_grad?
- javascript - Android Javascript接口函数在ajax回调中不起作用
- android - 如何获取 okhttp 存储的缓存大小为字节?
- python-3.x - 如何使用其他交替列表中的元素创建列表?
- asp.net - 过滤asp时击键之间的时间限制:DropDownList
- haskell - 将我的 Parser 类型描述为一系列 monad 转换器
- django - 当我运行 collectatic 以使用 django 将静态保存在 S3 存储桶中时出现 TypeError