Sans utiliser Redux, comment détecter un changement d’onglet avec un navigateur d’onglet de navigation?
Je sais que je dois utiliser onNavigationStateChange d'une manière ou d'une autre, mais je ne vois pas comment mettre à jour la vue actuelle.
export default () => <MyTabNav
ref={(ref) => { this.nav = ref; }}
onNavigationStateChange={(prevState, currentState) => {
//call function on current view
}}
/>;
export default () => <MyTabNav
ref={(ref) => { this.nav = ref; }}
onNavigationStateChange={(prevState, currentState) => {
const getCurrentRouteName = (navigationState) => {
if (!navigationState) return null;
const route = navigationState.routes[navigationState.index];
if (route.routes) return getCurrentRouteName(route);
return route.routeName;
};
global.currentRoute = getCurrentRouteName(currentState);
}}
/>;
Si vous ne souhaitez pas utiliser redux, voici comment vous pouvez stocker des informations globales sur la route en cours. Vous pouvez ainsi détecter un changement d’onglet et indiquer quel onglet est maintenant actif.
En fait, vous pouvez ajouter un auditeur spécial dans votre composant
componentDidMount () {
this.props.navigation.addListener('willFocus', (route) => { //tab changed });
}
Il y a de longues discussions à ce sujet depuis le numéro réact-native 314 , 486 , 1335 , et enfin, nous avons une meilleure manière de gérer cela, après le 27 septembre 2017, react- version de navigation v1.0.0-beta.13 :
Nouvelles fonctionnalités
Accepter un paramètre tabBarOnPress (# 1335) - @cooperka
Utilisation:
const MyTabs = TabNavigator({
...
}, {
tabBarComponent: TabBarBottom /* or TabBarTop */,
tabBarPosition: 'bottom' /* or 'top' */,
navigationOptions: ({ navigation }) => ({
tabBarOnPress: (scene, jumpToIndex) => {
console.log('onPress:', scene.route);
jumpToIndex(scene.index);
},
}),
});