Reputation: 80
I have the following in App.js
constructor(props){
super(props)
this.state = {data: 'false'};
}
componentDidMount(){
this._getData();
}
_getData = () => {
const url = 'http://localhost:8888/chats';
fetch(url, { credentials: 'include' })
.then((resp) => resp.json())
.then(json => this.setState({ data: json.chats }))
}
render() {
return (
<div className="App">
{
this.state.chats &&
this.state.chats.map( (buddy, key) =>
<div key={key}>
{buddy}
</div>
)}
<Chat />
</div>
)
}
and I have this in Chat.js
import React, { Component } from 'react';
class Chat extends Component {
render() {
console.log(this.props);
return (
<div className="App">
MY Chat
</div>
);
}
}
export default Chat;
and I have this in my http://localhost:8888/chats
{"chats":[{"buddy":"x","lastMessage":"Hey how are you?","timestamp":"2017-12-01T14:00:00.000Z"},{"buddy":"y","lastMessage":"I agree, react will take over the world one day.","timestamp":"2017-12-03T01:10:00.000Z"}]}
But I am getting empty arrays and a waring as follows:
The connection to ws://localhost:3000/sockjs-node/321/uglf2ovt/websocket was interrupted while the page was loading.
Object { }
mutating the [[Prototype]] of an object will cause your code to run very slowly; instead create the object with the correct initial [[Prototype]] value using Object.create
Object { }
I am not sure what is wrong, why are the variables empty ?
Thanks for your time.
Upvotes: 0
Views: 64
Reputation: 5838
For the problem when not getting any data, bind your method in the constructor.
constructor(props) {
super(props)
this.state = { chats: 'false'};
this._getData = this._getData.bind(this);
}
Also you are not passing any props to the Chat component. For example you can do:
render() {
return (
<div className="App">
{
this.state.chats &&
this.state.chats.map( (buddy, key) =>
<div key={key}>
{buddy}
</div>
)}
<Chat chats={this.state.chats} />
</div>
);
}
So when you are doing the console.log
class Chat extends Component {
render() {
console.log(this.props); // Here you will have an object like { chats: [data] }
return (
<div className="App">
MY Chat
</div>
);
}
}
Edit: Unifying the state attributes, you should change it in the method like:
_getData = () => {
const url = 'http://localhost:8888/chats';
fetch(url, { credentials: 'include' })
.then((resp) => resp.json())
.then(json => this.setState({ chats: json.chats }))
}
Upvotes: 3