J'utilise DrawerNavigator
et j'ai 3 pages: Router page
, mainScreen
et un photos page
,
J'ai créé une zone de barre de navigation en-tête et j'ai utilisé This <TouchableHighlight onPress={() => this.props.navigation.navigate('DrawerOpen')}>
pour ouvrir le menu Tiroir dans mainScreen et utilisé également pour la page de photos, le menu est ok dans mainScreen, mais lorsque je clique sur <TouchableHighlight onPress={() => this.props.navigation.navigate('DrawerOpen')}>
dans la page de photos , J'ai eu cette erreur:
Comment puis-je résoudre ce problème?
Ma page de photos:
import React from 'react';
import { Button, ScrollView, View, Text, StyleSheet, TouchableHighlight } from 'react-native';
import { DrawerNavigator } from 'react-navigation';
import MaterialIcons from 'react-native-vector-icons/MaterialIcons';
import Icon from 'react-native-vector-icons/FontAwesome'
const MyNavScreen = ({ navigation }) => (
<View>
<View style={styles.containerNavbar}>
<TouchableHighlight onPress={() => this.props.navigation.navigate('DrawerOpen')}>
<Icon name="bars" size={30} color="#fff" />
</TouchableHighlight>
<Text style={styles.navbarTitle}>Photos</Text>
</View>
<ScrollView>
<View><Text>photo</Text></View>
<Button onPress={() => navigation.goBack(null)} title="Go back" />
</ScrollView>
</View>
);
const MyPhotosHomeScreen = ({ navigation }) => (
<MyNavScreen navigation={navigation} />
);
MyPhotosHomeScreen.navigationOptions = {
title: 'Photos',
drawerIcon: ({ tintColor }) => (
<MaterialIcons
name="photo"
size={24}
style={{ color: tintColor }}
/>
),
};
export default MyPhotosHomeScreen;
écran principal:
export default class MainScreen extends React.Component {
static navigationOptions = {
drawerLabel: 'Home',
drawerIcon: ({ tintColor }) => (
<MaterialIcons
name="home"
size={24}
style={{ color: tintColor }}
/>
)
};
render() {
return (
<View>
<View style={styles.containerNavbar}>
<TouchableHighlight onPress={() => this.props.navigation.navigate('DrawerOpen')}>
<Icon name="bars" size={30} color="#fff" />
</TouchableHighlight>
<Text style={styles.navbarTitle}>mainScreen</Text>
</View>
<View>
<View style={styles.containerFooter}>
<Text style={styles.footerTitle}>Footer</Text>
</View>
</View>
</View>
)
}
}
J'ignore peut-être quelque chose, mais cela ressemble à une simple erreur Javascript. Vous détruisez vos accessoires dans votre composant pur MyNavScreen
:
const MyNavScreen = ({ navigation }) => (
Cela signifie que vous n'avez pas accès à this.props
. Vous avez juste accès à la propriété déstructurée navigation
. D'où la raison de l'erreur indéfinie car celle-ci est vraiment indéfinie:
<TouchableHighlight onPress={() => this.props.navigation.navigate('DrawerOpen')}>
Si vous le changez pour utiliser directement navigation
, cela devrait fonctionner:
<TouchableHighlight onPress={() => navigation.navigate('DrawerOpen')}>
Sur mainScreen
, tout va bien car ce n'est pas un composant pur avec des arguments déstructurés. Vous avez donc toujours accès à this.props
dans render()
.
Vous devriez rafraîchir détruire si cela vous cause des problèmes.
Si vous utilisez TouchableOpacity/Height dans votre élément enfant, transmettez-le this.props.onPress
comme ceci:
<TouchableOpacity onPress={this.props.onPress}/>
Appelez ensuite la fonction onPress dans votre composant parent comme suit:
<Parent onPress={this.Handlepress} />
Dans mon cas, cela fonctionnait lorsque je liais this
à la méthode qui appelle prop
dans le constructeur.
constructor(props){
super(props);
this.showDetails = this.showDetails.bind(this);// you should bind this to the method that call the props
}
showDetails(_id){
this.props.navigation.navigate('Details');
}
showDetails = (_id) => {
this.props.navigation.navigate('Details');
}
car pendant que vous utilisez la fonction expression, il va créer sa propre portée .
j'ai eu le même problème quand j'utilisais le composant d'en-tête
maintenant, vous pouvez utiliser la variable de navigation dans un autre composant comme celui-ci
<TouchableOpacity onPress={() => { this.props.navigation.navigate("Play");}}>
Bonne Codding :)
Essaye ça:
import { withNavigation } from 'react-navigation';
withNavigation
sert les accessoires partout dans le projet/l'application, vous accédez aux accessoires de navigation de n'importe où.
et
onPress={() => this.props.navigation.navigate('DrawerOpen')}
Finalement,
export default withNavigation(MyPhotosHomeScreen);
découvrez ceci https://reactnavigation.org/docs/fr/connecting-navigation-prop.html
Voici comment je l'ai fait dans la version 2 de React Navigation: J'appelle la méthode openDrawer()
depuis une StackNavigator
qui est un navigateur enfant de DrawerNavigator
.
C'est ma DrawerNavigator
:
export const Drawer = DrawerNavigator(
{
MyAccount: {screen: TabsStack},
});
export const TabsStack = StackNavigator({
Tabs: {
screen: Tabs, navigationOptions: ({navigation}) => ({
headerLeft: (
<TouchableOpacity style={{marginLeft: 10, marginTop: 3}}
onPress={() => navigation.openDrawer()}>
<Image source={require('./assets/menu_h.png')}/>
</TouchableOpacity>)
})
J'ai rencontré le même problème. C'est comme ça que j'ai résolu le problème:
this.props.navigation.navigate
dans le constructeur comme ceci: this.your_function = this.your_function.bind(this)
<ChildComponent navigation={this.props.navigation}/>
props.navigation.navigate("ScreenName")