我想从DrawerNav导航回Login。在函数内使用alert(' Alert')就可以了。
我有一个带Login和DrawerNav的StackNavigator
const MyStackNavigator = StackNavigator({
Login : { screen : Login },
DrawerNav : { screen : DrawerNav }
}, {
navigationOptions : { header : false }
}
);
从登录我可以使用
导航到我的主屏幕DrawerNav_login = () => {
this.props.navigation.navigate('DrawerNav');
}
DrawerNav内部是DrawerNavigator(很明显)
const MyDrawerNavigator = DrawerNavigator({
... screens ...
}, {
initialRouteName : '',
contentComponent : CustomContent,
drawerOpenRoute : 'DrawerOpen',
drawerCloseRoute : 'DrawerClose',
drawerToggleRoute : 'DrawerToggle'
}
);
const CustomContent = (props) => (
<View>
<DrawerItems {...props} />
<TouchableOpacity
onPress={ this._logout }>
<Text style={ styles.logout }>Logout</Text>
</TouchableOpacity>
</View>
)
如您所见,注销不是菜单的一部分,而是在抽屉内
_logout = () => {
this.props.navigation.navigate('Login');
}
这给了我一个错误
undefined is not an object (evaluating '_this.props.navigation')
答案 0 :(得分:0)
this
中的this._logout
用于引用一个CustomContent
实例,但是由于CustomContent
是一个功能组件(没有实例),因此任何{{ 1}}引用无效,但不会由于a bug而引发错误。
更改
this
到
onPress={this._logout}
答案 1 :(得分:0)
由于您的导航堆栈很深,使用popToTop
函数不是很有意义吗?
在同一文件中,确保将_logout
函数定义为CustomContent
,然后可以执行以下操作:
props
传递给函数来更新函数调用_logout
以使用popToTop()
这是我的代码的外观。
_logout = (props) => {
props.navigation.popToTop();
}
const CustomContent = (props) => (
<View>
<DrawerItems {...props} />
<TouchableOpacity
onPress={ () => this._logout(props) }>
<Text style={ styles.logout }>Logout</Text>
</TouchableOpacity>
</View>
)
您将需要将props
传递给函数,因为它将包含您的navigation
道具,并允许您在导航堆栈上进行调用。
答案 2 :(得分:0)
将您的customComponent更改为来自functional.Like的类组件。
class CustomContent extends Component {
_logout = () => {
const resetAction = NavigationActions.reset({
key: null,
index: 0,
actions: [NavigationActions.navigate({ routeName: 'Login' })],
});
this.props.navigation.dispatch(resetAction);
}
render() {
return (
<View>
<DrawerItems {...props} />
<TouchableOpacity
onPress={this._logout}
>
<Text style={styles.logout}>Logout</Text>
</TouchableOpacity>
</View>
);
}
}
答案 3 :(得分:0)
注意: Best practice to implement auth screens通过使用switch navigator。如果您由于某种原因不使用它,则以下内容可能会有所帮助。
1:正如@Asrith KS回答的那样,将您的功能组件更改为类组件,并将_logout
编写为类函数,其中this.props
将具有navigation
< / p>
(或)
2 :将导航操作写为anonymous function。
const CustomContent = (props) => (
<View>
<DrawerItems {...props} />
<TouchableOpacity
onPress={ () => props.navigation.navigate("Login") }>
<Text style={ styles.logout }>Logout</Text>
</TouchableOpacity>
</View>
)