什么是react-navigation?
react-native从开源至今,一直存在几个无法解决的毛病,偶尔就会复发让人隐隐作痛,提醒你用的不是原生,其中包括列表的复用问题,导航跳转不流畅的问题等等。
终于facebook坐不住了,在前一段时间开始推荐使用react-navigation,并且在0.44发布的时将之前一直存在的Navigator废弃了。
react-navigation是致力于解决导航卡顿,数据传递,Tabbar和navigator布局,支持redux。虽然现在功能还不完善,但基本是可以在项目中推荐使用的。
属性
react-navigation 分为三个部分。
- StackNavigator类似顶部导航条,用来跳转页面和传递参数。
- ** TabNavigator**类似底部标签栏,用来区分模块。
- DrawerNavigator抽屉,类似从App左侧滑出一个页面
StackNavigator 基础用法/属性介绍
const MyApp = StackNavigator({
// 对应界面名称
MyTab: {
screen: MyTab,
},
Detail: {
screen: Detail,
navigationOptions:{
headerTitle:'详情',
headerBackTitle:null,
}
},
}, {
headerMode: 'screen',
});
导航配置
screen
:对应界面名称,需要填入import之后的页面。
navigationOptions
:配置StackNavigator的一些属性。
- title:标题,如果设置了这个导航栏和标签栏的title就会变成一样的,所以不推荐使用这个方法。
- header:可以设置一些导航的属性,当然如果想隐藏顶部导航条只要将这个属性设置为null就可以了。
- headerTitle:设置导航栏标题,推荐用这个方法。
- headerBackTitle:设置跳转页面左侧返回箭头后面的文字,默认是上一个页面的标题。可以自定义,也可以设置为null
- headerTruncatedBackTitle:设置当上个页面标题不符合返回箭头后的文字时,默认改成"返回"。(上个页面的标题过长,导致显示不下,所以改成了短一些的。)
- headerRight:设置导航条右侧。可以是按钮或者其他。
- headerLeft:设置导航条左侧。可以是按钮或者其他。
- headerStyle:设置导航条的样式。背景色,款高等。
- headerTitleStyle:设置导航条文字样式。
- headerBackTitleStyle:设置导航条返回文字样式。
- headerTintColor:设置导航条颜色。总感觉和上面重叠了。
- headerPressColorAndroid:安卓独有的设置颜色纹理,需要安卓版本大于5.0
- gesturesEnabled:是否支持滑动返回收拾,iOS默认支持,安卓默认关闭
导航视觉效果
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 基础用法/属性介绍
const MyTab = TabNavigator({
ShiTu: {
screen: Shiqidu,
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,
}
});
屏幕导航配置
screen
:和导航的功能是一样的,对应界面名称,可以在其他页面通过这个screen传值和跳转。navigationOptions
:配置TabNavigator的一些属性
- title:标题,会同时设置导航条和标签栏的title,还是不推荐这种方式。
- tabBarVisible:是否隐藏标签栏。默认不隐藏(true)
- tabBarIcon:设置标签栏的图标。需要给每个都设置。
- tabBarLabel:设置标签栏的title。推荐这个方式。
标签栏配置
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
:图标的样式。
安卓上的tabbar文字会下移, 是因为安卓比iOS多了一个属性,就是iconStyle,通过设置labelStyle和iconStyle两个样式,外加style的高度,来使效果更佳合理.
跳转
navigate('Detail',{
title:'图片详情',
url:item.url,
});
Detail
:在StackNavigator中注册的页面,需要一一对应,才能跳转到相应的页面title
:在跳转的页面可以通过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();
自定义
项目中基本是没可能用自带的那个导航条的,自带导航条左侧的按钮永远是蓝色的,如果我们需要更改按钮颜色,就需要用到自定义的功能了。
const StackOptions = ({navigation}) => {
console.log(navigation);
let {state,goBack} = navigation;
// 用来判断是否隐藏或显示header
const visible= state.params.isVisible;
let header;
if (visible === true){
header = null;
}
const headerStyle = {backgroundColor:'#4ECBFC'};
const headerTitle = state.params.title;
const headerTitleStyle = {fontSize:FONT_SIZE(20),color:'white',fontWeight:'500'}
const headerBackTitle = false;
const headerLeft = (
<Button
isCustom={true}
customView={
<Icon
name='ios-arrow-back'
size={30}
color='white'
style={{marginLeft:13}}
/>
}
onPress={()=>{goBack()}}
/>
);
return {headerStyle,headerTitle,headerTitleStyle,headerBackTitle,headerLeft,header}
};
然后通过下面的方法调用就可以自定制导航了。
const MyApp = StackNavigator({
MyTab: {
screen: MyTab,
},
Detail: {
screen: Detail,
navigationOptions: ({navigation}) => StackOptions({navigation})
},
)};
在页面中使用的时候,在跳转页面的时候需要传递title参数,才能看到效果哦。
自定义tabbar
tabbar的图标可不可以使用原图,选中状态下可不可以设置其他图标。研究了一下官方文档,发现tabBarIcon除了tintColor还有另一个属性,用来判断选中状态的focused。
tabBarIcon: ({tintColor,focused}) => (
focused
?
<Image
source={{uri : '十七度'}}
style={tabBarIcon}
/>
:
<Image
source={{uri : '干货'}}
style={[tabBarIcon, {tintColor: tintColor}]}
/>
),
通过判断focused,选中状态下使用十七度图标,未选中状态使用干货图标。
如果想使用图标原来的样子,那就将style的tintColor去掉,这样就会显示图标原本的颜色。
封装
export const TabOptions = (tabBarTitle,normalImage,selectedImage,navTitle) => {
// console.log(navigation);
const tabBarLabel = tabBarTitle;
console.log(navTitle);
const tabBarIcon = (({tintColor,focused})=> {
return(
focused
?
<Image
source={{uri : normalImage}}
style={[TabBarIcon, {tintColor: tintColor}]}
/>
:
<Image
source={{uri : selectedImage}}
style={[TabBarIcon, {tintColor: tintColor}]}
/>
)
});
const headerTitle = navTitle;
const headerTitleStyle = {fontSize:FONT_SIZE(20),color:'white'};
// header的style
const headerStyle = {backgroundColor:'#4ECBFC'};
return {tabBarLabel,tabBarIcon,headerTitle,headerTitleStyle,headerStyle};
};
在static中使用this方法
我之前文章中是将navaigationOptions的方法写在了app.js中,没有在页面中通过static navaigationOptions来初始化页面,这段时间刚好有人问,所以在这里就写一下该怎么弄。
首先需要在componentDidMount(){}中动态的添加点击事件
属性给params
componentDidMount(){
this.props.navigation.setParams({
title:'自定义Header',
navigatePress:this.navigatePress
})
}
navigatePress = () => {
alert('点击headerRight');
console.log(this.props.navigation);
}
接下来就可以通过params方法来获取点击事件了
static navigationOptions = ({ navigation, screenProps }) => ({
title: navigation.state.params.title,
headerRight:(
<Text onPress={navigation.state.params.navigatePress}>
返回
</Text>
)
});
让安卓实现push动画
怎么让安卓实现类似iOS的push动画,后来翻看官方issues的时候,真的发现了实现push动画的代码,在这里共享下
// 先引入这个方法
import CardStackStyleInterpolator from 'react-navigation/src/views/CardStackStyleInterpolator';
// 在StackNavigator配置headerMode的地方,使用transitionConfig添加
{
headerMode: 'screen',
transitionConfig:()=>({
screenInterpolator:CardStackStyleInterpolator.forHorizontal,
})
}
相关推荐
接下来,我们需要安装`react-navigation-tabs`,这是`react-navigation`库的一部分,专门处理Tab导航: ```bash npm install @react-navigation/bottom-tabs # 或者使用yarn yarn add @react-navigation/bottom-...
相比 react-native init RN-name 的空项目,你不需要再去配置react-navigation等插件,甚至你自己可能因为版本兼容而陷入坑中。 0.62版本打包的最小apk只有7.5M左右,是相当不错的选择,在react native到0.60以后,...
RN项目源代码: 文章地址: https://blog.csdn.net/lxyoucan/article/details/108427400 React Navigation 5.x安装 react-native-vector-icons安装与配置 React Navigation传参和跳转 夜间模式的支持演示
"用了navigation"表明项目包含了React-Native的导航解决方案,如React Navigation,这是一个广泛使用的库,用于处理应用内的屏幕间导航。 React-Native的导航是移动应用开发中的关键部分,它帮助用户在不同的视图和...
React Native Navigation React Native Navigation provides 100% native platform navigation on both iOS and Android for React Native apps. The JavaScript API is simple and cross-platform - just install ...
react-native 配合react-navigation 入门demo,使用api包括, createMaterialTopTabNavigator, createAppContainer, createBottomTabNavigator, createAppContainer,以及使用了图标react-native-vector-icons。
"dependencies": { "axios": "^0.19.0", "jetifier": "^1.6.5", "querystring": "^0.2.0", ... "react-navigation": "^3.6.1" }, 已经封装好axios 并且在组件中可以直接使用的 demo 。注释的很清楚!
请注意,`react-native-tab-navigator`可能已经过时,现在推荐使用更新的库如`@react-navigation/bottom-tabs`或`react-navigation-tabs`来实现更现代的Tab导航。但以上方法仍然可以作为理解隐藏TabBar概念的基础。 ...
仅限Android目录支持安装React本机> = 0.60.0 1-安装软件包: $ yarn add react-native-navigation-bar-color 或者$ npm install react-native-navigation-bar-color --save 仅此而已! React本机<= 0.59.0 1-...
安装 npm install react-native-navigation-drawer-extension --save 或者 yarn add react-native-navigation-drawer-extension用法您需要向RNN注册抽屉组件。 为此,请使用register方法并将组件包装在RNNDrawer HOC...
React-Native本身并不直接提供底部Tab导航组件,但我们可以借助第三方库如`react-navigation`和其子库`@react-navigation/bottom-tabs`来实现。你需要执行以下命令来安装它们: ```bash npm install @react-...
React-Native-Basekit React-Native-Basekit 是初学者的项目结构。 入门 这些说明将为您提供一份项目副本,并在您的本地机器上运行,用于开发和测试目的。 先决条件 #! /bin/bash node@v10.x.x react-native-cli@...
同时,可以利用`react-navigation`库与`react-native-tabbar-android`配合,创建更复杂的导航结构。`react-navigation`提供了一系列导航解决方案,如StackNavigator、DrawerNavigator和TabNavigator,这些都可以与...
`react-native-navigation-hooks`库将这种思想应用到了React Native的导航场景中。它提供了诸如useNavigation、useRoute、useLinkTo等自定义Hook,这些Hook可以帮助我们轻松地在应用中控制导航行为。例如,`use...
React Native Vector Icons是一款广泛使用的开源库,专门为React Native开发者提供高度可定制的矢量图标。这个库使得在React Native应用中集成图标变得简单且高效,无论是用于导航栏、选项卡栏、工具栏,还是作为...
1. **导航**:学习使用React Navigation库来实现应用程序的页面间导航,包括StackNavigator、TabNavigator和DrawerNavigator等。 2. **动画**:React Native内置Animated库支持创建复杂的动画效果,同时也可以使用...
在"alimek-react-navigation-custom-bottom-tab-component-f8e76cd"这个项目中,我们可以看到如何实现这样的功能。 首先,要创建一个自定义的TabBarComponent,你需要创建一个新的React组件,这个组件将接收`...
1. **安装依赖**:在项目根目录下,使用npm或yarn添加`react-native-navigation-hybrid`库: ``` npm install react-native-navigation-hybrid 或 yarn add react-native-navigation-hybrid ``` 2. **配置...
在本项目中,我们使用了React Native的最新版本0.71进行移动应用的快速开发。React Native是一个开源框架,允许开发者使用JavaScript和React来构建原生移动应用程序,它极大地提高了开发效率,使得Web开发者可以跨...
在React Native开发中,`...TabNavigatorDemo这个压缩包文件很可能是包含了一个演示如何使用`react-navigation`创建TabBar和Nav的示例项目,通过学习和实践这个示例,你可以更好地理解和掌握React Native中的导航技术。