【发布时间】:2018-04-04 06:31:11
【问题描述】:
我有这个组件,它的作用是通过 fetch 从服务器获取类别对象,我把它放在 componentWillMount 中。 setState 只有一个:它在componentWillMount promise回调中,当数据从服务器到达时。
问题是组件渲染了两次,第一次 this.state.category 的值是构造函数的初始状态,然后第二次 this.state.category 等于从服务器接收到的对象。 如何在 setState 之后只调用一次 render 方法?
import ReactDom from 'react-dom';
import React from 'react';
import Breadcrumb from './Breadcrumb';
export default class Category extends React.Component{
constructor(props){
super(props);
this.state = {
category: {
'published_projects':[{'images':[]}],
'unpublished_projects':[{'images':[]}],
}
};
}
componentWillMount(){
fetch(route('api.categories.show', {'slug':this.props.match.params.slug}))
.then(response => response.json())
.then(data => {this.setState({category: data});});
}
totalLikesCount(){
return this.state.category.published_projects.reduce(( accu, item ) =>
accu + item.likes_count ,0
);
}
totalViewsCount(){
return this.state.category.published_projects.reduce(( accu, item ) =>
accu + item.views_count ,0
);
}
totalPicturesCount(){
return this.state.category.published_projects.reduce(( accu, item ) =>
accu + item.images.length ,0
);
}
render(){
const category = this.state.category;
console.log(category);
return (
<div className="w980px center">
<div className="CategoryHeader-bg-wrapper margin-rt10 margin-lt10">
<img alt="" src={category.picture_url}/>
<div className="CategoryHeader-bg-gradient">
<h1>
{ category.name }
</h1>
</div>
</div>
<div className="CategoryHeader-metrics-wrapper u-boxShadow margin-rt10 margin-lt10">
<ul className="CategoryHeader-metrics-list">
<li className="CategoryHeader-metrics-item txt-center">
<span className="CategoryHeader-metrics-label">
Projets
</span>
<span className="CategoryHeader-metrics-value">
{ category.published_projects.length }
</span>
</li>
<li className="CategoryHeader-metrics-item txt-center">
<span className="CategoryHeader-metrics-label">
Total de mentions j'aime
</span>
<span className="CategoryHeader-metrics-value">
{ this.totalLikesCount() }
</span>
</li>
<li className="CategoryHeader-metrics-item txt-center">
<span className="CategoryHeader-metrics-label">
Total des vues
</span>
<span className="CategoryHeader-metrics-value">
{ this.totalViewsCount() }
</span>
</li>
<li className="CategoryHeader-metrics-item txt-center">
<span className="CategoryHeader-metrics-label">
Total des photos
</span>
<span className="CategoryHeader-metrics-value">
{ this.totalPicturesCount() }
</span>
</li>
</ul>
</div>
</div>
);
}
}
【问题讨论】:
-
唯一的方法是在父组件中进行数据调用,并且在数据存在之前不挂载
Category组件。您不能阻止组件的初始渲染。可以查看render方法中是否加载了数据,如果不存在则return null,但还是会调用render函数两次。
标签: javascript reactjs