从套接字渲染响应

时间:2017-03-22 23:04:49

标签: sockets reactjs

我正在使用套接字连接到我的数据库。初始响应是一个消息列表。

我希望它显示此消息列表,然后允许在下面添加更多消息。

我想我看到了这个问题。 JSON.parse正在返回一个数组,我将它添加到数组中。所以在渲染中,代码期待" item"作为一个对象,但它实际上是对象数组。

如何从套接字呈现此初始数据/响应的正确方法?

class Chat extends Component {
  constructor(props) {
      super(props);
      this.state = {
        data: []
      };
    }
  componentWillMount () {
    const socket = new WebSocket('ws://localhost:8000/chat/super/');
    socket.addEventListener('message', 
        event => {this.setState(prev=>({ 
            data: [...prev.data, event.data ? JSON.parse(event.data) : {}] 
    }))
    });

    socket.addEventListener('message', function (event) {
    console.log(event.data);
    // THIS data is the response, which I want to show as the immediate array
    });
    }
    render() 
    {
        return  <div>
  {this.state.data.map(item=>(
    <div key={item.timestamp}>
        <h1 key={item.handle}>{item.handle}</h1>
            <li key={item.message}>{item.message}</li>
        </div>))}
    </div>

    ;}
    }

export default connect()(Chat);

1 个答案:

答案 0 :(得分:-1)

正如Rei Dien指出的那样,你有重复的事件监听器,所以删除第二个。此外,状态更改和数据提取应在componentDidMount中完成,以便它们正确地触发重新渲染。为了易读性,我还清理了你的代码。

class Chat extends Component {
  constructor(props) {
    super(props);
    this.state = {
      data: []
    };
  }

  componentDidMount () {
    const socket = new WebSocket('ws://localhost:8000/chat/super/');

    socket.addEventListener('message', event => {
      // console.log(event)
      this.setState({
        data: [
          ...prev.data, 
          event.data ? ...JSON.parse(event.data) : {}
        ] 
      })
    });
   }

   render() {
     return  (
       <div>
         {this.state.data.map(item => (
           <div key={item.timestamp}>
             <h1 key={item.handle}>{item.handle}</h1>
             <li key={item.message}>{item.message}</li>
           </div>
          ))}
        </div>
      );
    }
  }

export default connect()(Chat);