I have the following code :
import { useContext, useState, useEffect } from 'react';
import React from 'react';
import { RoomContext } from '../context/RoomContext';
let nextMessageID = 0
export default function Chat({roomId}) {
const { socket } = useContext(RoomContext)
const [messagesReceived, setMessagesReceived] = useState([]);
useEffect(() => {
socket.on('receive_message', (data) => {
console.log(data.message);
setMessagesReceived([
...messagesReceived,
{ id: nextMessageID++, content: data.message}
]);
})
}, [socket, messagesReceived])
return (
<div>
<h1>Received messages :</h1>
<ul>
{messagesReceived.map(message => {
<li key={message.id}>{message.content}</li>
})}
</ul>
</div>
)
}
which is heavily inspired from the react documentation here : https://react.dev/learn/updating-arrays-in-state#adding-to-an-array
I can see that this code updates my state array "messagesReceived" correctly by adding a button that logs it to the console
<button onClick={() => {
console.log(messagesReceived);
}}>Log messages</button>
but it does not update my component. How can I fix that ?
Also I'm not sure why I need to also execute my effect hook when "messagesReceived" changes but not doing so makes my array only contain the last message. I'd appreciate any explanation on this.
Thank you very much !