【发布时间】:2017-08-15 07:30:36
【问题描述】:
我正在使用套接字连接到我的数据库。初始响应是消息列表。
我希望它显示这个消息列表,然后当然允许在下面添加更多消息。
我想我看到了这个问题。 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);
【问题讨论】:
-
你听过同一个事件两次?我认为这也会使任何事件处理两次,这是故意的吗?如果要显示 event.data,只需调用 setState。它将触发重新渲染
-
是的,我意识到我正在听两次,我试图 console.log() 响应。请通过示例告诉我如何调用设置状态
-
componentWillMount() { ... // 在此处设置状态之前始终确保 // 您的数据可用 this.setState({ data: [...event.data ] }) }