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层嵌套就会有问题
  • 891ab51fcbe7:TabNavigator 写错了
    891ab51fcbe7: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