在React中使用jQuery呈现RSS源(XML),为什么从源解析的对象值看起来是空的?
问题描述:
我试图从一个项目中解析出来的项目标题只是为了一个测试。它总是要么给我一个错误消息,告诉我标题是未定义的或为null(对代码进行了多次小修改)。但是,getNews()方法似乎将30个对象设置为该状态。我只是无法呈现他们的任何值。任何人都可以看到我的方法有什么问题吗?查询有问题吗?在React中使用jQuery呈现RSS源(XML),为什么从源解析的对象值看起来是空的?
class App extends Component {
constructor(props) {
super(props);
this.state = { news: [] };
this.getNews = this.getNews.bind(this);
}
componentDidMount() {
this.getNews();
}
getNews() {
$.get("https://www.hs.fi/rss/tuoreimmat.xml",function(data) {
var $xml = $(data);
var items = [];
$xml.find("item").each(function() {
var $this = $(this),
item = {
title: $this.find("title").text(),
link: $this.find("link").text(),
description: $this.find("description").text(),
pubDate: $this.find("pubDate").text(),
}
items.push(item);
}.bind(this));
this.setState({ news: items });
}.bind(this));
}
render() {
var newsItem = this.state.news[1];
var title = newsItem.title;
return (
<div className="App">
<header className="App-header">
<h1 className="App-title">News</h1>
</header>
<div className="App-feeds">
</div>
<div className="panel-list">{title}</div>
</div>
);
}
}
答
问题是如何ajax调用和呈现工作。当你执行程序时,React试图直接渲染组件,所以ajax get调用还没有完成,状态变量仍然是空的。一旦你收到你的回复,你就会更新你的新闻,React更新视图。但是当它启动时,在渲染器中尝试访问this.state.news[1]
,但this.state.news
仍然是空的空白,所以你得到undefined
。
一个小补丁只是让你检查它与初始化状态...
this.state = { news: [{},{}] };
...所以现在this.state.news[1]
存在,您将看到的是如何刷新时的Ajax调用完成。
我想最终的目的是显示所有标题或所有新闻等。所以你想要这个问题,因为在渲染过程中,你必须“循环”所有的值this.state.news
(与map
功能,我猜),什么时候是空的,它不会失败。
在这里,您可以使用修补程序修改代码以查看其工作。有它看看,因为我试图清理它一点点...
class App extends React.Component {
constructor(props) {
super(props);
this.state = { news: [{},{}] };
}
componentDidMount() {
this.getNews();
}
getNews() {
$.get("https://www.hs.fi/rss/tuoreimmat.xml",function(data) {
var $xml = $(data);
var items = [];
$xml.find("item").each(function() {
var $this = $(this);
items.push({
title: $this.find("title").text(),
link: $this.find("link").text(),
description: $this.find("description").text(),
pubDate: $this.find("pubDate").text(),
});
});
this.setState({ news: items });
}.bind(this),'xml');
}
render() {
return (
<div className="App">
<header className="App-header">
<h1 className="App-title">News</h1>
</header>
<div className="App-feeds">
</div>
<div className="panel-list">{this.state.news[1].title}</div>
</div>
);
}
}
非常感谢你这么彻底说明问题!我真的很努力地找到问题的根源在哪里以及如何解决问题。 – jdet
我的荣幸!祝你有美好的一天,快乐的编码! –