微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

React Navigation

https://reactnavigation.org/docs/intro/nesting 官网

npm installreact-navigation --save

什么是react-navigation?

react-native从开源至今,一直存在几个无法解决的毛病,偶尔就会复发让人隐隐作痛,提醒你用的不是原生,其中包括列表的复用问题,导航跳转不流畅的问题等等。
终于facebook坐不住了,在前一段时间开始推荐使用react-navigation,并且在0.44发布的时将之前一直存在的Navigator废弃了。
react-navigation是致力于解决导航卡顿,数据传递,Tabbar和navigator布局,支持redux。虽然现在功能还不完善,但基本是可以在项目中推荐使用的。

属性

react-navigation分为三个部分。
StackNavigator类似顶部导航条,用来跳转页面和传递参数。
TabNavigator类似底部标签栏,用来区分模块。底部Tabbar和顶部Tabbar
DrawerNavigator抽屉,类似从App左侧滑出一个页面在这里不做讲解。
下面会分开讲解官网提供的配置方法,但顺序可能会官网不一样。

screenProps

之前是没有介绍这个属性的,但经过这么久发现,很多人都不知道这个属性,不知道它能干嘛,在这里我就简单的介绍下

screenProps:react-navigation自带一个属性,属于navigationoptions一个属性,可以全局控制navigationoptions中的某些值,比如说你想做换肤功能修改这个属性绝对是最简单的方式。

// 假设App就是项目中的入口文件,如果还不知道,可以看下Demo,在这里我将主题色通过screenProps属性修改成'red'
<App screenProps={{themeColor:'red'}}>

// 在页面中就可以通过screenProps来直接改变了,这个在Demo
中的Test2里面

static navigationoptions = ({navigation,screenProps}) => ({
        // 这里面的属性和App.js的navigationoptions是一样的。
                headerStyle:{backgroundColor:screenProps?
                screenProps.themeColor:
                '#4ECBFC'},)
})

StackNavigator 基础用法/属性介绍(跳转和传参数)

app.js

import { StackNavigator } from 'react-navigation';
import Home from "./components/Home"  //外部自己的组件
import My from "./components/My"   //外部自己的组件

//相当于设置路由组件集,第一个相当于入口,最后render中返回这个类似组件集的组件<SimpleApp/>
const SimpleApp = StackNavigator({
    Home: {
        screen: Home,//要跳转的组件
        navigationoptions:{
            headerTitle:'详情' //跳转过去的title
        }
    },My:{
      screen:My
    }
});

export default class App extends Component<{}> {
  render() {
    return (
        <SimpleApp/>
    );
  }
}

Home.js(实现跳转)

.........
render() {
        const { navigate } = this.props.navigation;  //获得navigate
        return (
            <View style={styles.container}>
                <Text
                 onPress={()=>{
                     navigate('My',{user:"纯纯"})  //跳转并传参数过去,参数名为user,值为纯纯
                 }}
                >111</Text>
            </View>
        );
    }

My.js(接受参数)

render() {
        const { params } = this.props.navigation.state; //获取参数集
        return (
            <View style={styles.container}>
                <Text>444{params.user}</Text>  //接收到参数
            </View>
        );
    }

导航配置

screen:对应界面名称,需要填入import之后的页面

navigationoptions:配置StackNavigator的一些属性

  • title标题,如果设置了这个导航栏和标签栏的title就会变成一样的,所以不推荐使用这个方法
  • header:可以设置一些导航的属性,当然如果想隐藏顶部导航条只要将这个属性设置为null就可以了。
  • headerTitle:设置导航栏标题,推荐用这个方法
  • headerBackTitle:设置跳转页面左侧返回箭头后面的文字认是上一个页面标题。可以自定义,也可以设置为null
  • headerTruncatedBackTitle:设置当上个页面标题不符合返回箭头后的文字时,认改成"返回"。(上个页面标题过长,导致显示不下,所以改成了短一些的。)
  • headerRight:设置导航条右侧。可以是按钮或者其他。
  • headerLeft:设置导航条左侧。可以是按钮或者其他。
  • headerStyle:设置导航条的样式。背景色,宽高等。如果想去掉安卓导航条底部阴影可以添加elevation: 0,iOS下用shadowOpacity: 0。
  • headerTitleStyle:设置导航条文字样式。安卓上如果要设置文字居中,只要添加alignSelf:'center'就可以了。在安卓上会遇到,如果左边有返回箭头导致文字还是没有居中的问题,最简单的解决思路就是在右边也放置一个空的按钮。
  • headerBackTitleStyle:设置导航条返回文字样式。
  • headerTintColor:设置导航栏文字颜色。总感觉和上面重叠了。
  • headerPressColorAndroid:安卓独有的设置颜色纹理,需要安卓版本大于5.0
  • gesturesEnabled:是否支持滑动返回收拾,iOS支持,安卓关闭
  • gestureResponsedistance:对象覆盖触摸从屏幕边缘开始的距离,以识别手势。 它需要以下属性
    • horizontal - number - 水平方向的距离 认为25。
    • vertical - number - 垂直方向的距离 认为135。
// 设置滑动返回的距离
gestureResponsedistance:{horizontal:300},

注:beta13新出的东西,挺有意思,以后可以手动控制返回了

导航视觉效果

mode:定义跳转风格。

  • card:使用iOS和安卓认的风格。
  • modal:iOS独有的使屏幕从底部画出。类似iOS的present效果

headerMode:边缘滑动返回上级页面时动画效果

  • float:iOS认的效果,可以看到一个明显的过渡动画。
  • screen:滑动过程中,整个页面都会返回。
  • none:没有动画。

cardStyle自定义设置跳转效果

transitionConfig自定义设置滑动返回的配置。
onTransitionStart:当转换动画即将开始时被调用功能
ontransitionend:当转换动画完成,将被调用功能

path:路由中设置的路径的覆盖映射配置。
initialRouteName:设置认的页面组件,必须是上面已注册页面组件。
initialRouteParams:初始路由的参数。

path:path属性适用于其他app或浏览器使用url打开本app并进入指定页面。path属性用于声明一个界面路径,例如:【/pages/Home】。此时我们可以在手机浏览器中输入:app名称://pages/Home来启动该App,并进入Home界面。

TabNavigator 基础用法/属性介绍

import {TabNavigator} from 'react-navigation';
const MyTab = TabNavigator({
    ShiTu: {
        screen: ShiTu,navigationoptions:{
            tabBarLabel: '识兔',tabBarIcon: ({tintColor}) => (
                <Image
                    source={{uri : '识兔'}}
                    style={[tabBarIcon,{tintColor: tintColor}]}
                />
            ),},}
},{
    tabBarPosition: 'bottom',swipeEnabled:false,animationEnabled:false,tabBarOptions: {
        style: {
            height:49
        },activeBackgroundColor:'white',activeTintColor:'#4ECBFC',inactiveBackgroundColor:'white',inactiveTintColor:'#aaa',showLabel:false,}
);

.....
render中返回<MyTab/>
render() {
    return (

        <MyTab/>
    );
  }

屏幕导航配置

screen:和导航的功能是一样的,对应界面名称,可以在其他页面通过这个screen传值和跳转
navigationoptions:配置TabNavigator的一些属性

  • title标题,会同时设置导航条和标签栏的title,还是不推荐这种方式。
  • tabBarVisible:是否隐藏标签栏。认不隐藏(true)
  • tabBarIcon:设置标签栏的图标。需要给每个都设置。
  • tabBarLabel:设置标签栏的title。推荐这个方式。
  • tabBarOnPress:设置tabBar的点击事件,内部提供了两个属性一个方法({ route,index },jumpToIndex)。
    beta13新添加方法,使用方式有些奇葩,如果想要使用,请参照下面的代码
tabBarOnPress:(({ route,jumpToIndex)=>{
    // console.log(route);        
    // alert(index);
    // 只有调用jumpToIndex方法之后才会真正的跳转页面。
    jumpToIndex(index);
}),

标签栏配置

tabBarPosition:设置tabbar的位置,iOS认在底部,安卓认在顶部。(属性值:'top','bottom')
swipeEnabled:是否允许在标签之间进行滑动。
animationEnabled:是否在更改标签显示动画。
lazy:是否根据需要懒惰呈现标签,而不是提前制作,意思是在app打开的时候将底部标签栏全部加载,认false,推荐改成true哦。
initialRouteName: 设置认的页面组件
backBehavior:按 back 键是否跳转到第一个Tab(首页), none 为不跳转

tabBarOptions:配置标签栏的一些属性

iOS属性

  • activeTintColor:label和icon的前景色 活跃状态下(选中)。
  • activeBackgroundColor:label和icon的背景色 活跃状态下(选中) 。
  • inactiveTintColor:label和icon的前景色 不活跃状态下(未选中)。
  • inactiveBackgroundColor:label和icon的背景色 不活跃状态下(未选中)。
  • showLabel:是否显示label,认开启。
  • style:tabbar的样式。
  • labelStyle:label的样式。

安卓属性

  • activeTintColor:label和icon的前景色 活跃状态下(选中) 。
  • inactiveTintColor:label和icon的前景色 不活跃状态下(未选中)。
  • showIcon:是否显示图标,关闭
  • showLabel:是否显示label,认开启。
  • style:tabbar的样式。
  • labelStyle:label的样式。
  • upperCaseLabel:是否使标签大写,认为true。
  • pressColor:material涟漪效果的颜色(安卓版本需要大于5.0)。
  • pressOpacity:按压标签的透明度变化(安卓版本需要小于5.0)。
  • scrollEnabled:是否启用可滚动选项卡。
  • tabStyle:tab的样式。
  • indicatorStyle标签指示器的样式对象(选项卡底部的行)。安卓底部会多出一条线,可以将height设置为0来暂时解决这个问题。
  • labelStyle:label的样式。
  • iconStyle:图标的样式。
    ps:很多人问我,为什么安卓上的tabbar文字会下移,是因为安卓比iOS多了一个属性,就是iconStyle,通过设置labelStyleiconStyle两个样式,外加style的高度,来使效果更佳合理.

跳转

this.props.navigation.navigate('Chat',{ user: 'Lucy' })

Chat:在StackNavigator中注册页面,需要一一对应,才能跳转到相应的页面
user:这是传参数,在跳转后的页面可以通过this.props.navigation.state.params.title获取到这个参数。当然这个参数可以随便填写,都可以通过this.props.navigation.state.params.xxx获取

回调传参

navigate('Detail',{
                   // 跳转的时候携带一个参数去下个页面
                   callback: (data)=>{
                         console.log(data); // 打印值为:'回调参数'
                     }
                   });

const {navigate,goBack,state} = this.props.navigation;
// 在第二个页面,在goBack之前,将上个页面方法取到,并回传参数,这样回传的参数会重走render方法
state.params.callback('回调参数');
goBack();

让安卓实现push动画

之前我群里的讨论怎么让安卓实现类似iOS的push动画,后来翻看官方issues的时候,真的发现了实现push动画的代码在这里共享下

/ 先引入这个方法
import CardStackStyleInterpolator from 'react-navigation/src/views/CardStackStyleInterpolator';

// 在StackNavigator配置headerMode的地方,使用transitionConfig添加
{
    headerMode: 'screen',transitionConfig:()=>({
        screenInterpolator:CardStackStyleInterpolator.forHorizontal,})
}

原文地址:https://www.jb51.cc/react/302336.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐