Re "кажется, что метод рендеринга вызывается два раза" : правильно, он вызывается дважды. Когда ваш компонент монтируется, вызывается render()
. Это вызывает componentDidMount()
для вызова. Когда вызывается componentDidMount()
, он вызывает this.props.getBanners()
как в вашем коде. Это вызывает повторную визуализацию, которая вызывает render()
во второй раз.
Re "впервые this.props.banner_list не определен" Исправить. Как упоминалось выше, первый рендеринг происходит ДО вызова componentDidMount()
и, следовательно, до вызова this.props.getBanners()
. В данный момент существует this.props
, поэтому ошибка не генерируется, но она еще не содержит поля banners
, поэтому просто возвращает undefined
.
Re "ошибка выброса, когда я пытаюсь показать объекты внутри представления" Это происходит потому, что если вы попытаетесь отобразить неопределенный объект внутри представления, он выдаст ошибку. Во время этого начального рендеринга this.props.banners
не определено, следовательно, ошибка.
Решение состоит в том, чтобы ОБЯЗАТЕЛЬНО ОКАЗАТЬ представление. Если вы сделаете <View>{a && b}</View>
, если a
равно false, Javascript автоматически отобразит это как <View>null</View>
, не потрудившись проверить, что такое b
. Таким образом, перепишите ваш код следующим образом:
class App extends Component<Props> {
componentDidMount(){
this.props.getBanners()
}
render() {
console.log(this.props)// here iam logging the props
return (
<View style={styles.container}>
// its throwing error so i comment it , i can see the render
// getting called two times. first time its undefined .
{banner_list.banners && banner_list.banners.banners.map(obj=>{
return(
<Text>{obj.title}</Text>
)
})}
</View>
);
}
function mapStateToProps(state){
return {
banners_list:state.banners
}
}
function mapDispatchToProps(dispatch){
return bindActionCreators({getBanners}, dispatch)
}
Все, что я там добавил ^^, это banner_list.banners &&
до banner_list.banners.banners.map
и т. Д.