На самом деле, нет проблем с вашим кодом, и это ожидаемое поведение.
Вы вызываете асинхронный запрос в ProductsListing
, поэтому нельзя гарантировать, что данные поступят до того, как будет обработан дочерний элемент. К тому времени, когда ваш DataTable
смонтирован, запрос еще не завершен, поэтому вы получаете пустой (начальный) массив.
Если вы хотите визуализировать компонент DataTable
только тогда, когда данные готовы - проверьте длину массива в компоненте ProductsListing
.
Как это:
class ProductListings extends Component {
constructor(props){
super(props);
this.state = {
dataSet: []
}
}
componentDidMount(){
this.props.getProducts({}).then(
(res) => {
this.setState({ dataSet: res.data });
}
);
}
render(){
console.log(this.state.dataSet);
return (
<div className="content-wrapper">
<section className="content-header">
{!!this.state.dataSet.length && <DataTable dataSet={this.state.dataSet}/>}
</section>
</div>
);
}
}
export default connect(null, {getProducts})(ProductListings);
В этом случае вы можете быть уверены, что ваш DataTable
будет обработан после того, как ответ будет готов.
Вот одна ловушка . Ваш компонент не будет отображаться, если массив пуст, даже если сервер возвращает это.
Если вы хотите отобразить что-то вроде «данные пусты» в вашей таблице и заставить свой код работать так, как вы хотите, используйте componentDidUpdate
ловушку жизненного цикла вместо componentDidMount
в DataTable
компоненте.