我是比较新的(ISH)反应所以还是努力学习最佳实践等。父组件重新绘制子组件多次ReactJS
我目前正在创建具有多个“小部件”仪表盘风格的应用程序显示各种数据。我有一个父组件'仪表板',这呈现每个'Widget'组件(这是愚蠢的组件)和数据通过道具传递。
现在我的问题是,在我的“仪表盘”组件我做一个Ajax调用以获取每个插件的数据,每个ajax调用我打电话的setState(),推动数据的成功。
从设计模式的角度来看,这似乎是正确的,但显然调用setState会导致级联重新呈现,因此每个小部件都会在我的情况下重新呈现10次(因为我有10个小部件)。
我在这做错了什么?我的应用程序现在是Flux还是Redux类型体系结构的候选人?
编辑:代码如下
父组件
/**
* Ajax calls (10 different calls, wont list them, all very similar)
*/
getRecent: function (url, limit) {
$.get(url, function (res) {
var data = res.response;
var products = [];
if (data.itemListInfo.numberOfItems > 0) {
for (var i = 0, j = limit; i < j; i++) {
products.push({
name: data.userItems[i].product.name,
itemCode: data.userItems[i].product.itemCode,
img: data.userItems[i].product.thumbnailImage,
});
}
}
// Obviously this is causing render() to fire
this.setState({
recent: {
numberOfItems: data.itemListInfo.numberOfItems,
products: products
}
});
setTimeout(function() {
$('#account-recent .loading').fadeOut();
}, 500);
}.bind(this));
},
componentDidMount: function() {
this.getReviews(this.config.reviews.url); // causes a render()
this.getRecent('/api/user/purchases/list', 3); // causes a render()
this.getRecommended('/api/user/recommendations/list', 3); // causes render()
this.getPreferences('/api/user/preferences/list'); //causes render()
// More ajax calls here....
},
render: function() {
return (
<Reviews data={this.state.reviews}/>
<Recommended data={this.state.recommended}/>
<RecentlyPurchased data={this.state.recent}/>
<Preferences data={this.state.preferences}/>
)
}
如果我把一个的console.log( '渲染......')在儿童中的一个渲染方法,它将根据它在ajax调用堆栈中的位置显示多少次
你能分享你的代码吗? – Mihir
如果您确实需要击中5个API(或5次API)才能获取每个小部件的信息,那么请在每个小部件中执行此操作。如果你可以把它放在一起,那就在父母身上做。或者您可以使用'Promise.all([])'并在更新状态之前等待所有请求返回。但是,真的,是把它放在一个redux商店。 –
@DavidGilbertson是的,我最初开始做单个组件的调用,但后来读的地方,所有的数据更好地通过从父母道具'愚蠢的'组件,所以去这条路线 – Zinc