首页 文章

如何在反应导航中将抽屉放在 Headers 上?

提问于
浏览
2

我正在使用反应导航 . 我想在屏幕的 Headers 上显示抽屉 . 当我打开抽屉时,我的 Headers 目前没有隐藏在抽屉下面 .

import React from 'react';
import { View, Text, StyleSheet } from 'react-native';
import { createStackNavigator, createDrawerNavigator  } from 'react-navigation';
import CategoryScreen from './CategoryScreen';
import ProductsScreen from './ProductsScreen';
import CartScreen from './CartScreen';


const drawerScreens = createDrawerNavigator ({
    Category: CategoryScreen,
    Products: ProductsScreen,
},{
    initialRouteName: 'Category'
}
)


export default AppStack = createStackNavigator(
    { 
        drawer: {
            screen: drawerScreens,
            navigationOptions: ({ navigation }) => ({
                header: <View style={styles.container}><Text>Header</Text></View>
              }),
        }, 
        cart: {screen: CartScreen} 
    },
    {
        initialRouteName: 'drawer',
    }
);

const styles = StyleSheet.create({
    container: {
        height: 100,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: 'orange',
    }
})

那么如何显示抽屉导航抽屉重叠或覆盖的 Headers .

目前看起来像这样

enter image description here

2 回答

  • 4
    • 您应该为 CategoryScreenProductScreen 创建一个新的StackNavigator

    • 您在 CategoryScreenProductScreen 导航选项上设置 Headers

    这就是我的意思

    // wrap your screen inside the drawer into StackNavigator
    const CategoryNavigator = createStackNavigator({
      CategoryList: {
        screen: CategoryScreen,
        navigationOptions: {
          title: "Category",
          header: // any custom header here
        }
      },
    });
    
    const drawerScreens = createDrawerNavigator({
      Category: CategoryNavigator,
      Products: ProductNavigator,
    }, {
      initialRouteName: 'Category'
    })
    
    
    export default AppStack = createStackNavigator({
      drawer: {
        screen: drawerScreens,
      },
      cart: {
        screen: CartScreen
      }
    }, {
      initialRouteName: 'drawer',
    });
    

    结果就是这样

    Embedded StackNavigator

    Following will make a floating header which similar with your screenshot

    将 Headers 模式设置为 float (您不需要将 CategoryScreenProductScreen 包装成 StackNavigator

    export default AppStack = createStackNavigator({
      drawer: {
        screen: drawerScreens,
      },
      cart: {
        screen: CartScreen
      }
    }, {
      headerMode: 'float', // set this header mode to float so you can share the header
      initialRouteName: 'drawer',
    });
    

    如果您将 Headers 模式更改为float
    Float header
    ,则会出现此结果

  • 1

    在我的情况下,我制作自己的Header组件并在我想要的每个页面中使用它 . 它使我能够为每个页面自定义 Headers .

    绝对是后门的方式,我希望其他人有你的问题的确切答案 .

    这是一个例子......

    主页:

    export default class Home extends Component {
        render() {  
            return (
                <View style={{ flex: 1 }}>
    
                    <Header showBorder={true}/>
    
                    <ScrollView>
                       ...
                    </ScrollView>
                </View>
            );
        }
    }
    

    Headers 组件:

    export default class Header extends React.PureComponent {
    
      renderTitle = () => {
        if (this.props.title) {
          return (
            <View style={{ flexDirection: 'column', flex: 3, justifyContent: 'center' }}>
              <View style={{ alignSelf: 'flex-start' }}>
                <Text style={[styles.fontBold, { fontSize:17, color: colors.borderWidthColor }]}>{this.props.title}</Text>
              </View>
            </View>
          )
        }
      }
    
      renderBack = () => {
        if (this.props.back) {
          return (
            <View style={{ marginTop:3 }}>
              <TouchableOpacity
                onPress={() => {
                  this.props.navigation.goBack()
                }}
                style={{ alignSelf: 'flex-start' }}>
                <Icon name="md-arrow-back" size={23} color="black" />
              </TouchableOpacity>
            </View>
          )
        }
      }
    
    
      render() {
        return (
          <View style={[{ height: 70, backgroundColor: this.props.backgroundColor, width: win.width, borderBottomWidth: this.props.showBorder ? 1 : 0 }]}>
            <View style={{ flex: 1, flexDirection: 'row', marginTop: Platform.OS == 'ios' ? 17 : 3 }}>
              <View style={{ flexDirection: 'column', flex: 1, justifyContent: 'center', marginLeft: 12 }}>
                {this.renderBack()}
                {this.renderTitle()}
              </View>
            </View>
          </View>
        )
      }
    }
    

相关问题