【问题标题】:React useState() - adding new element in array not workingReact useState() - 在数组中添加新元素不起作用
【发布时间】:2021-09-09 08:13:40
【问题描述】:

我正在使用 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)
    }
}

【问题讨论】:

    标签: javascript reactjs typescript react-native socket.io


    【解决方案1】:

    是否有可能是因为您没有将先前的状态传递给 setMessages 调用?

    也许可以试试这样的东西

    async function receiveMessage(id) {
      await message.init(id)
    
      message.recieveMessage(message => {
        setMessages(prevMessages => [...prevMessages, message])
      })
    }
    
    

    【讨论】:

    • 谢谢你成功了。但我不明白setMessages(prevMessages => [...prevMessages, message]) 和setMessages([...messages, message]) 之间的区别
    • @BilljeshBaidya 功能状态更新,它从以前的状态更新,而常规更新是在创建回调时获取 messages 的任何关闭值。
    猜你喜欢
    • 2021-06-23
    • 2015-12-10
    • 1970-01-01
    • 2021-06-17
    • 2015-03-19
    • 2021-12-11
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    相关资源
    最近更新 更多