我使用React Navigation在我的React Native應用程序中的屏幕之間進行導航。我的屏幕結構是:StackNavigator的子組件在其父代外調用時呈現兩次
- DrawerNavigator
- HomeScreen
- MoviesStackNavigator
- MoviesListScreen
- MovieDetailsScreen
- DiscoverScreen
現在我想導航並將DiscoverScreen中的一些參數傳遞給MoviesListScreen。
這裏是我的代碼:
DiscoverScreen.js
onSearchConfirm() {
this.setState({searching: true})
var params = {
sort_by: this.state.sortBy,
year: this.state.releaseYear,
with_genres: this.state.genreIds.join(',')
};
const _this = this;
return fetch(Configuration.TMDB_BASE_URL
.concat('/discover/movie?')
.concat(Utility.stringFromQueryParams({...params, api_key: Configuration.TMDB_API_KEY})))
.then(response => response.json())
.then(jsonResponse => {
_this.setState({searching: false});
const navigateAction = NavigationActions.navigate({
routeName: 'MoviesList',
params: {data: jsonResponse}
})
_this.props.navigation.dispatch(navigateAction)
})
.catch(err => console.error(err.toString()))
}
DrawerNavigator:
export default MenuNavScreen = DrawerNavigator(
{
Home: {
screen: HomeScreen
},
Movies: {
screen: MoviesStackNavigator
},
DiscoverMovies: {
screen: DiscoverScreen
},
About: {
screen: AboutScreen
},
},
{
initialRouteName: 'Home'
})
MoviesStackNavigator:
export default MoviesStackNavigator = StackNavigator({
MoviesList: {
screen: MoviesListScreen
},
MovieDetails: {
screen: MovieDetailsScreen
},
});
最後,該代碼在那裏我檢查F或PARAMS MoviesListScreen:
//...
componentWillMount() { //THIS IS CALLED TWICE
if(!this.props.navigation.state.params) {
MoviesService.getPopularMovies()
.then(movies => {
this.setState({movies: movies.results})
})
.catch(err => Alert.alert(err.toString()))
}
else {
this.setState({movies: this.props.navigation.state.params.data.results})
}
}
//...
好了,代碼的最後一塊被執行兩次。首先「數據」參數未定義,第二次使用正確填充的參數。我的錯誤在哪裏?謝謝大家:)
編輯:要清楚,這是上述問題的結果: