react-navigation 简单使用

作者: lesliefang | 来源:发表于2017-03-16 16:38 被阅读17394次

    react-navigation 做 TarBar 布局和导航非常简单方便,最好用的导航了
    https://reactnavigation.org/docs/intro/
    常用布局一般是首页 4 个 TabBar 布局,直接用 TabNavigator 就行

    import {StackNavigator, TabNavigator} from "react-navigation";
    
    export default class Tab1 extends React.Component {
        static navigationOptions = {
            title: 'Tab1',
            tabBarIcon: ({tintColor}) => (
                <Image
                    source={require('../images/home.png')}
                    style={[styles.icon, {tintColor: tintColor}]}
                />
            ),
        };
    
        render() {
            return ();
        }
    }
    
    const MainScreenNavigator = TabNavigator({
        Tab1: {screen: Tab1},
        Tab2: {screen: Tab2},
        Tab3: {screen: Tab3},
        Tab4: {screen: Tab4},
    }, {
        animationEnabled: false, // 切换页面时不显示动画
        tabBarPosition: 'bottom', // 显示在底端,android 默认是显示在页面顶端的
        swipeEnabled: false, // 禁止左右滑动
        backBehavior: 'none', // 按 back 键是否跳转到第一个 Tab, none 为不跳转
        tabBarOptions: {
            activeTintColor: '#0F9C00', // 文字和图片选中颜色
            inactiveTintColor: '#999', // 文字和图片默认颜色
            showIcon: true, // android 默认不显示 icon, 需要设置为 true 才会显示
            indicatorStyle: {height: 0}, // android 中TabBar下面会显示一条线,高度设为 0 后就不显示线了, 不知道还有没有其它方法隐藏???
            style: {
                backgroundColor: '#fff', // TabBar 背景色
            },
            labelStyle: {
                fontSize: 12, // 文字大小
            },
        },
    });
    
    const styles = StyleSheet.create({
        icon: {
            height: 22,
            width: 22,
            resizeMode: 'contain'
        }
    });
    

    然后顶层再用一个 StackNavigator ,把首页和其它页面嵌进去就行了。
    StackNavigator 和 TabNavigator 是可以相互嵌套的,这样就能从首页 Tab 跳转到其它页面了

    const App = StackNavigator({
        Main: {
            screen: MainScreenNavigator, // stack 嵌套 tab
            navigationOptions: {
                header: {
                    title: '互助',
                    style: {
                        backgroundColor: '#fff'
                    },
                    backTitle: null
                }
            }
        },
        PlanDetail: {
            screen: PlanDetail,
            navigationOptions: {
                header: {
                    style: {
                        backgroundColor: '#fff'
                    },
                }
            }
        }
    });
    
    AppRegistry.registerComponent('QQHZ_RN', () => App);
    
    页面跳转、返回、传参
    const {navigate} = this.props.navigation;
    <TouchableHighlight onPress={()=>{
         navigate('PlanDetail',{name:'leslie',id:100});
    }}>
    
    // 返回上一页
    this.props.navigation.goBack();
    

    navigate 函数根据名字跳转,还可以有第二个参数用于页面之间传递参数

    接收参数
    export default class PlanDetail extends Component {
        static navigationOptions = {
            // title 可以这样设置成一个函数, state 会自动传过来
            title: ({state}) => `${state.params.name}`,
        };
    
        componentDidMount() {
            const {params} = this.props.navigation.state;
            const id = params.id;
        }
    

    通过 this.props.navigation.state.params 接收参数

    相关文章

      网友评论

      • _极速快跑_:干货啊,
      • _海角_:通常是点击Tabbar 进行切换,如果像不点击Tabbar 切换Tab,请问如何实现
        _海角_:@lesliefang 谢谢,已解决,的确是路由
        lesliefang:这个其实操作的都是 路由 (route), 肯定有 api, 查查官方文档, 我很久都不搞 RN 了
      • 01163ea7b4c1:请问一下,我把tab嵌套在stack里面,为什么在tab里面的onPress={()=>{this.props.navigation.navigate('Page')}}>没办法跳转到stack里面的页面:flushed:
        01163ea7b4c1:@lesliefang 我觉得是调用到的navigation不是stack而是tab,所以导致了没响应:joy:
        lesliefang:@K_e9de 肯定哪有点问题你再好好看看,首先确保 onPress 被调用了, Page 页面存在 。。。
        01163ea7b4c1:也没有报错,只是没反应
      • 窦家骏:你好!请问在tabbar上根据消息数量显示红点,这个要怎么实现?
        lesliefang:如果本身不支持, 就自定义 tabitem 自己画
      • dc0db66b3d58:这种结构嵌套就会有个问题,点击tabbar里面的内容进行跳转时,页面就会把tabbar给覆盖掉了,业务要显示保持tabbar显示,3层嵌套就会有问题
      • 大雪人_bcf9:TabNavigator 写错了
        大雪人_bcf9:static navigationOptions = {
        tabBarLabel: 'Notifications',
        tabBarIcon: ({ tintColor }) => (
        <Image
        source={require('./notif-icon.png')}
        style={[styles.icon, {tintColor: tintColor}]}
        />
        ),
        };

        最新的 直接报错
      • 71f4b19c6061:我在真机上调试,发现占用位置很大,调整高度后,里面的内容显示不完全,请问怎么解决
        lesliefang:好久不看 RN 了,我记得好像是图片适配有问题,图片加上 @2X 或 @3X 试试
      • 苹果雪梨渣:请问下能否给个demo啊...
      • king锋:先顶一个 如果是返想传值应该如何处理呢;比如页面A->页面B, 从页面B->A 应该如何传递呢?
      • dab32aad0471:楼主你好,请问navigate如何实现二级页面再push到三级页面
        小猪向天飞:@lesliefang 那具体怎么实现呢?也还是需要先把所有的界面放在最初始的进行配置,然后怎么实现二级页面再跳转到三级页面呢?谢谢!
        lesliefang:stack 就是一个一个往里面 push,跟原生的概念的都是一样的
      • e5d90c227722:StackNavigator点击多次回退的时候就会回退很多次怎么解决
      • 勿问情殇:const SomeStack = StackNavigator({
        // config 配置该navigator
        });
        是一次性把所有的页面都在一个根文件中配置吗?
        lesliefang:是的
      • Sleet:请问一下当把一个 stack navigation嵌套在一个 drawer navigation.从drawer navigation 选择再次进入 stack navigation的时候。 stack navigation就会增加一个新的router ,如果想得到原来的router怎么办呢。是不是需要用 getScreen懒加载呀。十分谢谢您
        Sleet: @Alex_Dufresne 好的谢谢您
        lesliefang:不知道啊, 没有这样用过, 多看看文档吧
      • 勿问情殇:你好,可以实现跨级返回,或者直接返回到根视图吗?goback()?
        lesliefang:跨级返回其实就是修改 stack 的状态,把用不到的 router 从 statck 中移除
        https://github.com/react-community/react-navigation/issues/295
        https://reactnavigation.org/docs/routers/#Custom-Navigation-Actions
      • 8c89eda85e0c:想问下一级tab 页面跳转到二级页面,怎么在二级页面不显示一级页面的tab
      • 1f448c3e9823:像有两个导航栏 一上一下的那种该如何嵌套啊
        1f448c3e9823:@lesliefang 好吧 刚开始学习 还不是太会自己封装
        lesliefang:不知道 TabNavigator 能不能嵌套 TabNavigator, 如果不能只能自己封装实现了
      • 小欧lq:能说下DrawerNavigator的用法吗
        lesliefang:参考文档就行,我也没用过
      • 神农本草经:官方文档中没找到tabBar这个配置 有用
      • b6da66a175ae:请问StackNavigator怎么隐藏顶部导航栏了
        b6da66a175ae:@lesliefang 非常感谢,之前没有设置headerMode
        lesliefang:1. 初始化时 设置 headerMode 为 'screen'
        const SimpleApp = StackNavigator(
        {
        Tabs: { screen: MainScreenNavigator },
        ProfileThem: { screen: ProfileThemScreen, user: 'Sally' },
        AskForFeedback: { screen: AskForFeedbackScreen },
        },
        { headerMode: 'screen' } <--- !!!!!!
        );
        2. header:{ visible: false } 隐藏
        screen: JoinPlan,
        navigationOptions:{
        header: {
        visible: false
        },
        }
      • 渐行渐远的术士:使用StackNavigator时,android中可以使title居中吗?IOS默认是居中
        渐行渐远的术士: static navigationOptions = {
        // title 可以这样设置成一个函数, state 会自动传过来
        title: ({state}) => `${state.params.name}`,
        };
        但是我用这个,并不能在标题栏显示传过来的参数。
        渐行渐远的术士:@lesliefang alignSelf: 'center'可以,谢谢
        lesliefang:titleStyle 设成 textAlign:'center' 或者 alignSelf: 'center' 试试

        navigationOptions: {
        header: {
        title: '第二页',
        style: {
        backgroundColor: '#fff'
        },
        titleStyle:{
        textAlign:'center'
        }
        }
        }
      • 流星留步:不错的文章,干货
      • dd258e581b7f:我们经常会遇到登录成功,或者注销后,不允许返回上一页面,通过react-navigation怎么处理呢
        dd258e581b7f:@lesliefang 谢谢
        lesliefang:参考一下下面的,reset navigation action, 手动把 route 从 stack 中移除
        https://github.com/react-community/react-navigation/issues/295
        https://reactnavigation.org/docs/routers/#Custom-Navigation-Actions

      本文标题:react-navigation 简单使用

      本文链接:https://www.haomeiwen.com/subject/ywejnttx.html