react-navigation

安装核心包

yarn add @react-navigation/native

安装@react-navigation/native本身依赖的相关包

react-native-reanimated:动画库

react-native-gesture-handler:手势库

react-native-screens:使用原生代码实现screen容器可以提高性能流畅度

react-native-safe-area-context:可以让我们的组件渲染在一个安全的区域(比如有些移动设备是异性的,刘海屏、挖孔屏等)

@react-native-community/masked-view:堆栈式导航器所依赖的库

yarn add react-native-reanimated react-native-gesture-handler react-native-screens react-native-safe-area-context @react-native-community/masked-view

React Native 0.60以上,链接是自动的,因此不需要运行react原生链接。

但在iOS开发上,则需要安装pod来完成链接

cd ios
pod install

打开android/app/src/main/java/<your package name>/MainActivity.java

加入以下代码

public class MainActivity extends ReactActivity {// ...@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(null);}// ...
}

在该文件顶部加入

import android.os.Bundle;

在项目入口文件引入@react-navigation/native

import { NavigationContainer } from '@react-navigation/native';

如何使用堆栈式导航器

安装核心库

yarn add @react-navigation/stack

比如说写一个home组件

import React from 'react';
import { View, Text } from 'react-native';class Home extends React.Component {render() {return (<View><Text>Home</Text></View>    )}
}export default Home;

再写一个Detail组件

import React from 'react';
import { View, Text } from 'react-native';class Detail extends React.Component {render() {return (<View><Text>Detail</Text></View>    )}
}export default Detail;

然后在navigator下新建个文件夹index.tsx

import React from 'react';
import {NavigationContainer} from '@react-navigation/native'
import {createStackNavigator} from '@react-navigation/stack'
import Home from '@/pages/Home';
import Detail from '@/pages/Detail';type RootStackPareamList = {Home: undefined;Detail:undefined;
}let Stack = createStackNavigator<RootStackPareamList>();
/*{Navigator, // 导航器Screen // 路由,也就是页面
}
*/class Navigator extends React.Component {render(){return (<NavigationContainer><Stack.Navigator><Stack.Screen name="Home" component={Home}/><Stack.Screen name="Detail" component={Detail}/></Stack.Navigator></NavigationContainer>);}
}export default Navigator;

然后在src/index.tsx

import Navigator from '@/navigator/index';export default Navigator;

可以发现Android和ios的标题显示不一样,这是因为ios和Android的默认设计风格不一样导致的。

如何统一ios和Android的标题风格呢

使用screanOptions属性就好,在Stack.Screen里也有options属性,这样就可以单独设置某个页面的标题样式了,还有一些常用的属性 如:headerTitle:'首页'

import React from 'react';
import {NavigationContainer} from '@react-navigation/native'
import {createStackNavigator} from '@react-navigation/stack'
import Home from '@/pages/Home';
import Detail from '@/pages/Detail';type RootStackPareamList = {Home: undefined;Detail:undefined;
}const Stack = createStackNavigator<RootStackPareamList>();
/*{Navigator, // 导航器Screen // 路由,也就是页面
}
*/class Navigator extends React.Component {render(){return (<NavigationContainer><Stack.NavigatorscreanOptions={{headerTitleAlign:'center',}}><Stack.Screen options={{ headerTitleAlign:'left, headerTitle:'首页'}} name="Home" component={Home}/><Stack.Screen name="Detail" component={Detail}/></Stack.Navigator></NavigationContainer>);}
}export default Navigator;

页面间的跳转如何实现?

import React from 'react';
import {NavigationContainer} from '@react-navigation/native'
import {createStackNavigator} from '@react-navigation/stack'
import Home from '@/pages/Home';
import Detail from '@/pages/Detail';
import {createStackNavigator,StackNavigationProp,
} from '@react-navigation/stack'; // 自动引入type RootStackPareamList = {Home: undefined;Detail:undefined;
}// 加这一行
export type RootStackNavigation = StackNavigationProp<RootStackPareamList>const Stack = createStackNavigator<RootStackPareamList>();
/*{Navigator, // 导航器Screen // 路由,也就是页面
}
*/class Navigator extends React.Component {render(){return (<NavigationContainer><Stack.NavigatorheaderMode="float"screanOptions={{headerTitleAlign:'center',}}><Stack.Screen options={{ headerTitleAlign:'left, headerTitle:'首页'}} name="Home" component={Home}/><Stack.Screen name="Detail" component={Detail}/></Stack.Navigator></NavigationContainer>);}
}export default Navigator;

tips:

headerMode="float"所有页面共用一个标题栏(ios的默认)

headerMode="none"没有标题栏

headerMode="screen"每个页面都有一个标题栏(Android的默认)

在Home组件中使用

import React from 'react';
import { View, Text, Button } from 'react-native';
import { RootStackNavigation } from '@/navigator/index'interface IProps {navigation:RootStackNavigation;
}class Home extends React.Component<IProps> {onPress = () => {const {navigation} = this.props;navigation.navigate("Detail");}render() {return (<View><Text>Home</Text><Button title="跳转到详情页" onPress={this.onPress}/></View>    )}
}export default Home;

目前这样跳转是比较生硬的。

如何产生一个跳转的动画效果?

让前一个页面的从左边划走,然后后一个页面从右往左进来,透明度从0到1渐变

可以使用headerStyleInterpolator:HeaderStyleInterpolators.forUIKit,ios就能实现上述效果

使用cardStyleInterpolator:CardStyleInterpolators.forHorizontalIOS,Android也能实现跟ios类似的效果了

<Stack.NavigatorheaderMode="float"screanOptions={{headerTitleAlign:'center',headerStyleInterpolator:HeaderStyleInterpolators.forUIKit,cardStyleInterpolator:CardStyleInterpolators.forHorizontalIOS,}}>
</Stack.Navigator>

但是可以发现ios是可以通过手势操作关闭详情页得,但是Android是不可以得,因为ios默认开启手势,Android默认不开启

使用gestureEnabled:true,开启手势系统,然后会神奇的发现,Android从左向右滑动还是无法关闭详情页,因为Android默认的手势方向是垂直方向,所以往下滑就能关闭详情页,如何让它像ios那样向右滑动可以关闭呢?

继续设置手势方向为水平即可:gestureDirection:'horizontal',

<Stack.NavigatorheaderMode="float"screanOptions={{headerTitleAlign:'center',headerStyleInterpolator:HeaderStyleInterpolators.forUIKit,cardStyleInterpolator:CardStyleInterpolators.forHorizontalIOS,gestureEnabled:true,gestureDirection:'horizontal',}}>
</Stack.Navigator>

仔细观察会发现,Android的显示没有ios美观。

如何针对Android写样式呢?

【安卓改善前效果如下图】

【改善后的Android效果】,左边阴影去掉了,也去掉了标题的下边框阴影

使用headerStyle

<Stack.NavigatorheaderMode="float"screanOptions={{headerTitleAlign:'center',headerStyleInterpolator:HeaderStyleInterpolators.forUIKit,cardStyleInterpolator:CardStyleInterpolators.forHorizontalIOS,gestureEnabled:true,gestureDirection:'horizontal',headerStyle: {...Platform:select({android: {elevation:0,borderBottomWidth:StyleSheet.hairlineWidth,}})},}}>
</Stack.Navigator>

页面跳转间如何传参呢?

这是开发种十分常见的场景,如进入详情页,肯定需要在跳转的时候传递id的

那么需要在src/navigator/index.tsx种修改(就是导航组件的位置,你的项目不一定在这个路径)

设置一下详情页接收参数的类型,因为后续在Detail需要用到这个类型,因此再加个export导出

export type RootStackPareamList = {Home: undefined;Detail:{id:number;}
}

然后再Home组件,增加传递参数的逻辑

// home组件里的那个跳转方法
onPress = () => {const {navigation} = this.props;navigation.navigate("Detail",{id:100,}); // 这里增加了传参~
}

在Detail组件接收即可

import React from 'react';
import { View, Text } from 'react-native';
import { RootStackParamList } from '@/navigator/index';interface IProps {route:RouteProp<RootStackParamList,'Detail'>;
}class Detail extends React.Component<IProps> {render() {const { route } = this.propsreturn (<View><Text>Detail</Text><Text>{route.params.id}</Text></View>    )}
}export default Detail;

后续再写一个标签导航器~

ReactNative——导航器react-navigation(堆栈式导航器篇)相关推荐

  1. RN路由-React Navigation组件5.x-基本原理(中文文档)

    ##引言 React Native路由导航,有它就够了!该文档根据React Navigation文档翻译,有些内容会根据自己的理解进行说明,不会照搬直译,若发现理解有问题的地方,欢迎大家提点!由于本 ...

  2. 从0到1打造一款react-native App(二)Navigation+Redux

    前言 很久没写东西了,发现时间过的真快.之前想学习下RN,但是由于自己的懒惰挖了个坑,最近正好公司开了RN的项目,我也把很久以前挖的坑填一下!新开的这个项目只有我一个人搞,之前没做过RN,这次正好可以 ...

  3. React Navigation 基本使用

    React Navigation 基本使用 参考资料 https://reactnavigation.org/docs/ 环境搭建 Minimum requirementsreact-native & ...

  4. activity堆栈式管理

    package com.chinaCEB.cebActivity.utils;import java.util.Stack;import android.app.Activity; import an ...

  5. 使用Redux在React Navigation App中管理状态

    by Andrea Bizzotto 通过安德里亚·比佐托(Andrea Bizzotto) 使用Redux在React Navigation App中管理状态 (Managing State in ...

  6. arcgis开发 多版本之间如何兼容_arcgis api 4.x for js 结合 react 入门开发系列初探篇(附源码下载)...

    你还在使用 JQuery 或者 Dojo 框架开发 arcgis api 4.x for js 吗?想试试模块化开发吗?随着前端技术的发展,arcgis api 4.x for js 也有了结合 re ...

  7. react navigation 中使用goBack()跳转到指定页面

    一.适用场景: 在app端开发的时候,相反回到某一个页面的时候保持跳转页面的所有状态不更新,也就是说不触发新的生命周期. 例如:A-->B-->C-->D 要想从D页面直接返回到B页 ...

  8. React实例响应式设计和数据绑定

    React实例响应式设计和数据绑定 React中的响应式设计原理和数据的绑定方法,俗话说的好:"宝剑磨的好,理论不能少".这节课我们不仅要编写效果,还要讲理论,这节课很重要!!!, ...

  9. React Navigation 路由导航库升级 5.x

    当前版本:3.0.0 升级版本:5.12.8 安装依赖 $ yarn add   @react-navigation/native   @react-navigation/stack   @react ...

最新文章

  1. SpringBoot核心注解介绍
  2. 全国计算机等级考试题库二级C操作题100套(第33套)
  3. [CB]TForm应用技巧
  4. selenium定位php,selenium之元素定位
  5. 重写需要注意哪些方面?
  6. ArcGIS版本更新对比
  7. CI框架 url指向错误 配置根目录
  8. scrapy 爬取煎蛋网图片
  9. 使用Cython将python文件打包成.so文件
  10. oracle 倒库详细步骤,新手倒车入库怎么操作 图文并茂详细讲解操作技巧
  11. outlook2016服务器设置不能修改,求助,outlook2016签名也无法编辑和修改,请工程师解决...
  12. 以下选项中、不是python对文件的打开模式的是_以下选项中,不是Python对文件的打开模式的是...
  13. 如何查看Oracle数据库的版本号
  14. [转]静态框架导航,左侧折叠树的样式,类似于treeview
  15. 7.TensorRT中文版开发教程-----TensorRT中的INT8量化详解
  16. 个人建设网站流程解说,手把手教你如何在阿里云上搭建自己的网站
  17. 北京大学计算机学院推免生名单,2014年北京大学软微学院保研录取名单
  18. 云原生时代,我们为何离不开混沌工程?
  19. 关于4A统一安全管理平台解决方案简单介绍
  20. 本地提交spark_Spark 任务提交

热门文章

  1. React设置自定义滚动条样式
  2. 优质公众号文章批量下载
  3. 如何删除Cookie
  4. 吃鸡不显示服务器,吃鸡四排不显示服务器 | 手游网游页游攻略大全
  5. simulink同步机光伏系统一次调频火电厂联合光伏电厂一次调频
  6. 手把手教你系列 - Particle粒子特效(上)
  7. cad怎么转换成pdf格式,3个方法快速搞定
  8. 关于Mysql中on条件和where条件的使用总结
  9. Flutter 基础组件之 Container
  10. 数据操作语言:DELETE语句