0

Everytime an object is received from server-side socket, a new div element with a message inside must be appended to the DOM.

Instead the div element is being overwritten again and only one div element is produced.

  state = {
    chatMessage: ''
  }

  componentDidMount() {
    socket.on('retrieve-chat-left', (data) => {

      var message = data.map(data => {
        console.log(data.name, data.message);
        return <ChatListLeft key={data._id} name={data.name} chatMessage={data.message} />
      });

      this.setState({
        chatMessage: message
      });
    });

  }

  render() {

    return (
      <div className="mainbodybar">
        {this.state.chatMessage}
      </div>
    )
  }

// ChatListLeft component

import React from 'react'

export default function ChatListLeft({ chatMessage, name }) {
  return (
    <div className="retrieve-chat-left">
      {chatMessage}
      {name}
    </div>
  )
}

2 Answers 2

6

You're overwriting your messages instead of appending to them. Also instead of saving a component to state, it's better to save the data and then render it:

  state = {
    chatMessage: [] // chatMessage should be an array
  }

  componentDidMount() {
    socket.on('retrieve-chat-left', (data) => {

      var message = data.map(data => {
        return {id: data._id, message: data.message, name: data.name}
      });

      this.setState(state => ({
        chatMessage: [...state.chatMessage, message] // Append the messages to the state here
      }));
    });

  }

  render() {
    const messages = this.state.chatMessage.map(msg=> <ChatListLeft key={msg._id} name={mag.name} chatMessage={mag.message} />
    return (
      <div className="mainbodybar">
        {messages}
      </div>
    )
  }
Sign up to request clarification or add additional context in comments.

Comments

0

Do below concatenate it with existing value,

  this.setState({
    chatMessage: this.state.chatMessage + message
  });

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.