React 根据 JSON 数据迭代对象
2016-09-30
7875
我有以下代码:
import ReactDom from 'react-dom';
import React from 'react';
import {render} from 'react-dom';
import $ from 'jquery';
class News extends React.Component {
render () {
var news = [];
this.props.news.forEach(function(el, i){
news.push(<SingleNews key={i} img={el.img} />);
});
return (
<section className="news-wrapper">
{news}
</section>
);
}
}
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
data: ''
}
}
mapObject(object, callback) {
return Object.keys(object).map(function (key) {
return callback(key, object[key]);
});
}
componentDidMount () {
const newsfeedURL = 'https://s3-eu-west-1.amazonaws.com/streetlife-coding-challenge/newsfeed.json';
$.get(newsfeedURL, function(result) {
this.setState({data: JSON.parse(result)});
console.log(typeof this.state.data.messages);
}.bind(this));
}
render () {
return (
<div>
{Object.keys(this.state.data.messages).map(function(key) {
return <div>Key: {key}, Value: {this.state.data.messages[key]}</div>;
})}
</div>
)
}
}
ReactDom.render(
<App />,
document.getElementById('app')
);
我正在尝试迭代“this.state.data.messages”以在渲染方法中输出一些数据。
输入此“console.log(typeof this.state.data.messages);”后,我了解到“this.state.data.messages”是一个对象,因此以下内容:
{Object.keys(this.state.data.messages).map(function(key) {
return <div>Key: {key}, Value: {this.state.data.messages[key]}</div>;
})}
但是我的控制台中有以下内容:
Uncaught TypeError: Cannot convert undefined or null to object
2个回答
这里的问题是您最初将数据设置为空字符串。在您的
componentDidMount
中,您正在进行 ajax 调用,并且由于它是异步的,因此 React 仍将呈现。一旦呈现,它就会尝试访问
this.state.data.messages
,而
this.state.data
是一个空字符串,因此不会有名为 messages 的属性。
我会做的是,在您的渲染方法中设置一个名为 loading 的初始状态属性,如果
this.state.loading === true
,则在 div 中渲染其他内容,如果
this.state.loading === false && this.state.data.messages
实际上返回您现在尝试执行的操作。
只需确保在解析 JSON 响应时将 loading 状态设置为 false
this.state = {
data: '',
loading: true
}
componentDidMount () {
const newsfeedURL = 'https://s3-eu-west-1.amazonaws.com/streetlife-coding-challenge/newsfeed.json';
$.get(newsfeedURL, function(result) {
this.setState({
data: JSON.parse(result),
loading: false
});
console.log(typeof this.state.data.messages);
}.bind(this));
}
render () {
let content;
if (this.state.loading === false && this.state.data.messages) {
content = {Object.keys(this.state.data.messages).map(function(key) {
return <div>Key: {key}, Value: {this.state.data.messages[key]}</div>;
})}
} else {
content = ''; // whatever you want it to be while waiting for data
}
return (
<div>
{content}
</div>
)
}
finalfreq
2016-09-30
您将在异步调用返回之前进行渲染。
您需要在有数据之前处理这种情况。如果没有其他事情,您应该更改初始状态以更好地匹配您期望的状态。
Dave Newton
2016-09-30