React + AJAX组件过度渲染
React + AJAX component over-rendering
为了填充React组件的内容,我在方法componentWillMount的主体中使用AJAX请求,我在这里更改了这一点。状态作为执行请求的结果。问题是呈现方法在请求完成之前运行,就像在this之后一样。通过setState改变状态。此外,如果这样的组件呈现一个,也使用AJAX,那么呈现调用的数量将以两倍的幂增长。
如何使组件只在获得必要的数据后才呈现?
var News = React.createClass({
getInitialState: function () {
return {
news: [],
page: 1
};
},
componentWillMount: function () {
let xmlhttp = getXmlHttp();
xmlhttp.open("POST", "server/news.php", true);
xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xmlhttp.onreadystatechange=() => {
if (xmlhttp.readyState != 4) return;
clearTimeout(timeout);
if (xmlhttp.status == 200) {
this.setState({
news: eval(xmlhttp.responseText.toString())
});
} else {
handleError(xmlhttp.statusText);
}
};
xmlhttp.send('page=' + this.state.page);
var timeout = setTimeout( function(){ xmlhttp.abort(); handleError("Request time over") }, 10000);
},
render: function () {
let itemList = this.state.news.map(function(item, iterator){
return (
<NewsItem
niTitle={item[0]}
niText={item[1]}
niDate={item[2]}
niImg={item[3]}
key={"ni " + iterator}
/>
);
});
return (
<div>
{itemList}
<PageChanger page={this.state.page}/>
</div>
);
}
});
如何使组件呈现只有在获得必要的数据?
如果您的render
函数返回false
,则不会呈现任何内容。(来源:the docs.)
getInitialState: function () {
return { page: 1, shouldRender: false };
}
然后,在render
中,您可以检查该标志:
if (! this.state.shouldRender) return false;
在传递给XHR的回调中,您可以更新标志:
this.setState({
shouldRender: true,
news: eval(xmlhttp.responseText.toString()),
});
首先,将您的网络调用抽象为一个helper,并根据需要导入到组件中。
第二,使用componentDidMount
而不是componentWillMount
来避免多次渲染。
import networkCall from ../helpers/networkCall
componentDidMount() {
this.setState({
emails: networkCall.news,
emailCache: networkCall.page
});
},
相关文章:
- AJAX 请求没有在我的 React 组件中设置 this.state.data
- 将AJAX结果作为道具传递给子组件
- 在react组件中使用ajax获取实时更新的数据
- 我可以将 AJAX 调用放在表示组件中,还是应该提取容器
- 检票口 - 使用 AJAX 刷新组件 - 文档元素后的垃圾
- 如何使 ember 组件从服务器获取数据.将 AJAX 调用放在组件中似乎不是处理此问题的好做法
- 反应组件调用了两次(AJAX调用异步)
- ReactJS 从父组件的 onClick 方法更新对子组件的 ajax 调用
- 在自定义 JSF 组件收到 AJAX 的更新后调用自定义 JavaScript 代码
- 如何更新p的标签:在primefaces中ajax调用后,在不关闭组件的情况下选择CheckboxMenu
- jQuery的组件不是彩色动画和ajax
- 使用cfajaxproxy对coldfusion组件进行Ajax调用
- 通过AJAX调用将数据加载到Knockout组件中
- 在Ajax请求后动态附加的HTML中呈现组件
- 如何在$.ajax的回调函数中更改组件视图中的变量
- 如何用ajax优雅地渲染React.js组件
- 尝试在React组件中发出Ajax请求并使用响应
- Ajax请求数据在组件之间传递
- JQuery UI选项卡中的另一个JQuery组件,带有Ajax页面调用
- React + AJAX组件过度渲染