使用 jquery 在 React 中呈现 RSS 提要 (XML),为什么从提要解析的 object 值看起来是空的?
Rendering RSS feed (XML) in React with jquery, why do object values parsed from the feed seem empty?
我正在尝试从提要解析的项目中呈现标题,只是为了测试。它总是给我一条错误消息,告诉我标题未定义或为空(尝试对代码进行多次小修改)。但是,getNews() 方法似乎将 30 objects 设置为预期的状态。我只是无法从中呈现任何值。谁能看出我的方法有什么问题?查询有问题吗?
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 调用完成后如何刷新。
我想最终目的是显示所有标题或所有新闻等。所以你会遇到这个问题,因为在渲染中你必须 "loop" 通过 [= 的所有值13=](我猜是使用 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>
);
}
}
我正在尝试从提要解析的项目中呈现标题,只是为了测试。它总是给我一条错误消息,告诉我标题未定义或为空(尝试对代码进行多次小修改)。但是,getNews() 方法似乎将 30 objects 设置为预期的状态。我只是无法从中呈现任何值。谁能看出我的方法有什么问题?查询有问题吗?
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 调用完成后如何刷新。
我想最终目的是显示所有标题或所有新闻等。所以你会遇到这个问题,因为在渲染中你必须 "loop" 通过 [= 的所有值13=](我猜是使用 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>
);
}
}