如何设置 'react-native-drawer' 登录后仅对 Dashboard 可见
How to set 'react-native-drawer' visible only to Dashboard after login in react-native
In react-native, I want to disable drawer on Login
and enable drawer
on Dashboard
Screen. I have implemented 'react-native-drawer'
with
Navigator
to navigate between routes.
渲染方法如下:
render() {
<Drawer
ref={(ref) => this._drawer = ref}
disabled={!this.state.drawerEnabled}
type="overlay"
content={<Menu navigate={(route) => {
this._navigator.push(navigationHelper(route));
this._drawer.close()
}}/>}
tapToClose={true}
openDrawerOffset={0.2}
panCloseMask={0.2}
closedDrawerOffset={-3}
styles={{
drawer: {shadowColor: '#000000', shadowOpacity: 0.8, shadowRadius: 3},
main: {paddingLeft: 3}
}}
tweenHandler={(ratio) => ({
main: { opacity:(2-ratio)/2 }
})}>
<Navigator
ref={(ref) => this._navigator = ref}
configureScene={(route) => Navigator.SceneConfigs.FloatFromLeft}
initialRoute={{
id: 'Login',
title: 'Login',
index: 0
}}
renderScene={(route, navigator) => this._renderScene(route, navigator)}
navigationBar={
<Navigator.NavigationBar
style={styles.navBar}
routeMapper={NavigationBarRouteMapper} />
}
/>
</Drawer>
);
}
renderScene 如下导航路线:
_renderScene(route, navigator) {
navigator.navigate = self.navigate;
switch (route.id) {
case 'Login':
return ( <Login navigator={navigator}/> );
case 'Dashboard':
return ( <Dashboard navigator={navigator}/> );
}
}
我已经写了一种在 react-native 中启用和禁用抽屉的方法:
navigate(route, method){
if(route)
switch (route.id) {
case 'Login':
this.state = {drawerEnabled: false, navigationBarEnabled: false};
break;
case 'Dashboard':
this.state = {drawerEnabled: true, navigationBarEnabled: true};
break;
}
this.forceUpdate();
this.refs.navigator[method](route);
}
}
最初我在 class 中设置了 属性 并且在构造函数中调用了 navigate 方法。
state = {drawerEnabled:true, navigationBarEnabled: true};
constructor(){
super();
this.navigate = this.navigate.bind(this);
}
那么在 Login
菜单上禁用抽屉并在 Dashboard
屏幕上启用它的可能方法。
您可以在登录界面将抽屉的panOpenMask
和panCloseMask
属性设置为0。
像这样
<Drawer>
panOpenMask={isItLoginPage? 0 : 0.2}
panCloseMask={isItLoginPage? 0 : 0.2}
...
</Drawer>
您必须按如下方式更改您的 _renderScene()
方法:
_renderScene(route, navigator) {
navigator.navigate = this.navigate;
switch (route.id) {
case 'Login':
return ( <Login navigator={navigator} {...route.passProps} /> );
case 'Dashboard':
return ( <Dashboard navigator={navigator} {...route.passProps} />);
}
}
不需要navigate()
方法,所以删除那个方法。您必须根据需要编写所有案例,对于 default case
,您已将其设置为 null
。如果您设置 null
意味着 left
和 right
在 Dashboard
页面上被禁用,但只有 title
在 Dashboard
.[=26= 上启用]
您需要在 toolbar
上为 left
、right
和 title
编写代码如下:
const NavigationBarRouteMapper = {
LeftButton(route, navigator, index, navState) {
switch (route.id) {
case 'Dashboard':
return (
<TouchableOpacity
style={styles.navBarLeftButton}
onPress={() => {_emitter.emit('openMenu')}}>
<Icon name='menu' size={25} color={'white'} />
</TouchableOpacity>
)
default:
return null //For setting Dashboard left button null
}
},
RightButton(route, navigator, index, navState) {
switch (route.id) {
case 'Dashboard':
return (
<TouchableOpacity
style={styles.navBarRightButton} onPress={() => {route.onPress()}}>
<Icon name={'map'} size={25} color={'white'} />
</TouchableOpacity>
)
default:
return null //For setting Dashboard right button null
}
},
Title(route, navigator, index, navState) {
return (
<Text style={[styles.navBarText, styles.navBarTitleText]}>
{route.title}
</Text>
)
}
}
In react-native, I want to disable drawer on
Login
and enable drawer onDashboard
Screen. I have implemented'react-native-drawer'
withNavigator
to navigate between routes.
渲染方法如下:
render() {
<Drawer
ref={(ref) => this._drawer = ref}
disabled={!this.state.drawerEnabled}
type="overlay"
content={<Menu navigate={(route) => {
this._navigator.push(navigationHelper(route));
this._drawer.close()
}}/>}
tapToClose={true}
openDrawerOffset={0.2}
panCloseMask={0.2}
closedDrawerOffset={-3}
styles={{
drawer: {shadowColor: '#000000', shadowOpacity: 0.8, shadowRadius: 3},
main: {paddingLeft: 3}
}}
tweenHandler={(ratio) => ({
main: { opacity:(2-ratio)/2 }
})}>
<Navigator
ref={(ref) => this._navigator = ref}
configureScene={(route) => Navigator.SceneConfigs.FloatFromLeft}
initialRoute={{
id: 'Login',
title: 'Login',
index: 0
}}
renderScene={(route, navigator) => this._renderScene(route, navigator)}
navigationBar={
<Navigator.NavigationBar
style={styles.navBar}
routeMapper={NavigationBarRouteMapper} />
}
/>
</Drawer>
);
}
renderScene 如下导航路线:
_renderScene(route, navigator) {
navigator.navigate = self.navigate;
switch (route.id) {
case 'Login':
return ( <Login navigator={navigator}/> );
case 'Dashboard':
return ( <Dashboard navigator={navigator}/> );
}
}
我已经写了一种在 react-native 中启用和禁用抽屉的方法:
navigate(route, method){
if(route)
switch (route.id) {
case 'Login':
this.state = {drawerEnabled: false, navigationBarEnabled: false};
break;
case 'Dashboard':
this.state = {drawerEnabled: true, navigationBarEnabled: true};
break;
}
this.forceUpdate();
this.refs.navigator[method](route);
}
}
最初我在 class 中设置了 属性 并且在构造函数中调用了 navigate 方法。
state = {drawerEnabled:true, navigationBarEnabled: true};
constructor(){
super();
this.navigate = this.navigate.bind(this);
}
那么在 Login
菜单上禁用抽屉并在 Dashboard
屏幕上启用它的可能方法。
您可以在登录界面将抽屉的panOpenMask
和panCloseMask
属性设置为0。
像这样
<Drawer>
panOpenMask={isItLoginPage? 0 : 0.2}
panCloseMask={isItLoginPage? 0 : 0.2}
...
</Drawer>
您必须按如下方式更改您的 _renderScene()
方法:
_renderScene(route, navigator) {
navigator.navigate = this.navigate;
switch (route.id) {
case 'Login':
return ( <Login navigator={navigator} {...route.passProps} /> );
case 'Dashboard':
return ( <Dashboard navigator={navigator} {...route.passProps} />);
}
}
不需要navigate()
方法,所以删除那个方法。您必须根据需要编写所有案例,对于 default case
,您已将其设置为 null
。如果您设置 null
意味着 left
和 right
在 Dashboard
页面上被禁用,但只有 title
在 Dashboard
.[=26= 上启用]
您需要在 toolbar
上为 left
、right
和 title
编写代码如下:
const NavigationBarRouteMapper = {
LeftButton(route, navigator, index, navState) {
switch (route.id) {
case 'Dashboard':
return (
<TouchableOpacity
style={styles.navBarLeftButton}
onPress={() => {_emitter.emit('openMenu')}}>
<Icon name='menu' size={25} color={'white'} />
</TouchableOpacity>
)
default:
return null //For setting Dashboard left button null
}
},
RightButton(route, navigator, index, navState) {
switch (route.id) {
case 'Dashboard':
return (
<TouchableOpacity
style={styles.navBarRightButton} onPress={() => {route.onPress()}}>
<Icon name={'map'} size={25} color={'white'} />
</TouchableOpacity>
)
default:
return null //For setting Dashboard right button null
}
},
Title(route, navigator, index, navState) {
return (
<Text style={[styles.navBarText, styles.navBarTitleText]}>
{route.title}
</Text>
)
}
}