ReactNative基础(五)使用react-navigation实现页面的跳转、参数的传递(StackNavigator)

前端之家收集整理的这篇文章主要介绍了ReactNative基础(五)使用react-navigation实现页面的跳转、参数的传递(StackNavigator)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

博客基于react-native-0.48.4

在ReactNative v0.43之前的时候官方提供了Navigator组件,在v0.44版本之后官方就把他废弃了这是为什么呢?原因就是有个比他更好的react-navigation导航栏了、不得不说第三方依赖库真的很强大。

React Navigation

  • 官网地址:https://reactnavigation.org
  • 其中包含了我们开发中最常用的三种导航方式
    • StackNavigator(顶部导航栏)
    • TabNavigator (标签导航栏)
    • DrawerNavigator(侧滑菜单导航栏)
    • 效果图可以在官网首页看下

这篇文章就简单来说说@H_301_33@StackNavigator

  • 既然使用的是第三方库,如果在你项目的@H_301_33@node_modules文件夹中没有@H_301_33@react-navigation那么你需要执行如下命令
  1. //进入你项目的根目录下执行
  2. npm install --save react-navigation

引入@H_301_33@react-navigation中的StackNavigator

  1. import {
  2. StackNavigator,} from 'react-navigation';
  3.  
  4. import React from 'react';
  5.  
  6. const Main = require('./Main');
  7. const Detail = require('./Details');
  8. const Menu = require('./Menu');
  9.  
  10. /*
  11. * 初始化StackNavigator
  12. */
  13. export default App = StackNavigator({
  14. //默认加载第一个页面,这里用来注册需要跳转页面 相当于Manifest.xml文件
  15. Main: {
  16. screen: Main,},Detail: {
  17. screen: Detail,Menu: {
  18. screen: Menu,}
  19. });

这个文件负责对我们需要跳转页面进行注册(相当于在Android中每一个Activity都需要在清单文件注册),同时也创建了navigation供后续操作。

  1. import React,{Component} from 'react';
  2. import {
  3. AppRegistry,} from 'react-native';
  4.  
  5. //这里不能写var App = require('./src/Application'); 会出现问题
  6. //(小白刚学还不会,有路过的大神可以留言教一下)。
  7. import App from './src/Application';
  8.  
  9. export default class Pagejump extends Component {
  10. render() {
  11. return (
  12. <App/>
  13. );
  14. }
  15. }
  16.  
  17. AppRegistry.registerComponent('Pagejump',() => Pagejump);

效果图:

在Main页面添加一个按钮跳转至下一个页面、并修改导航栏的样式

  1. import React,{Component} from 'react';
  2. import {
  3. View,Text,StyleSheet,TouchableOpacity,} from 'react-native';
  4.  
  5. class Main extends Component {
  6.  
  7. //设置顶部导航栏的内容
  8. static navigationOptions = ({navigation,screenProps}) => ({
  9. //左侧标题
  10. headerTitle: '我是主页面',//设置@R_429_404@面左侧返回箭头后面的文字,默认是上一个页面标题
  11. headerBackTitle: null,//顶部标题栏的样式
  12. headerStyle: styles.headerStyle,//顶部标题文字的样式
  13. headerTitleStyle: styles.headerTitleStyle,});
  14.  
  15. render() {
  16. return (
  17. <View style={styles.container}>
  18. {/*页面跳转*/}
  19. <TouchableOpacity style={styles.button} activeOpacity={0.5} onPress={() => {
  20. this.props.navigation.navigate('Detail',{key: '传递的标题'})
  21. }}>
  22. <Text style={{color: 'white'}}>带参数 跳转Details页面</Text>
  23. </TouchableOpacity>
  24. <Text style={{marginTop: 10,color: 'black'}}>当前是Main页面</Text>
  25. </View>
  26. );
  27. }
  28. }
  29.  
  30. const styles = StyleSheet.create({
  31. container: {
  32. flex: 1,justifyContent: 'center',alignItems: 'center',backgroundColor: '#F5FCFF',button: {
  33. width: 240,height: 45,borderRadius: 5,backgroundColor: '#4398ff',headerStyle: {
  34. backgroundColor: '#4398ff',headerTitleStyle: {
  35. //标题文字颜色
  36. color: 'white',//设置标题的大小
  37. fontSize: 18,//居中显示
  38. alignSelf: 'center',});
  39. module.exports = Main;

这里就要重点说一说@H_301_33@navigationOptions中的属性

  • 可以参考一下这篇文章react-navigation使用技巧或者官网给出的属性介绍
  • @H_301_33@headerTitle: '标题' ===> 导航栏的标题
  • @H_301_33@header: null ===> 隐藏导航栏
  • @H_301_33@headerTintColor: 'white' ===> 返回按钮的颜色
  • @H_301_33@headerTitleStyle: {} ===> 导航栏文字的样式
  • @H_301_33@headerStyle: {} ===> 导航栏的样式
  • @H_301_33@headerRight: (< View/>) ===> 设置顶部导航栏友边的视图 和 解决当有返回箭头时,文字不居中
  • @H_301_33@headerLeft: (< View/>) ===> 设置导航栏左边的视图 和 去除返回箭头
  • @H_301_33@headerBackTitle: null ===> 设置@R_429_404@面左侧返回箭头后面的文字,默认是上一个页面标题
  • @H_301_33@gestureResponseDistance: {horizontal: 300} ===> //设置滑动返回的距离

上面@R_429_404@面的时候我们向下一个页面传递了一个键值为@H_301_33@key的参数

  1. //页面跳转 第一个参数则是我们在`Application.js`中注册页面
  2. //第二个参数则是传递的参数,也可以不传。
  3. this.props.navigation.navigate('Detail',{key: '传递的标题'}
  4.  
  5. //@R_429_404@面的第二种写法
  6. const {navigate} = this.props.navigation;
  7. navigate('Detail',{key: '传递的参数'});
  8.  
  9. //没有参数的情况
  10. const {navigate} = this.props.navigation;
  11. navigate('Detail');

页面接收传递过来的值

  1. navigation.state.params.key //key就是你自己设置的键

页面跳转效果图(有点失帧)

@H_301_33@Details页面这里就不贴出了,跟@H_301_33@Main内容都是差不多的。可以查看文末给出的源码

主要说一下最后一个带有菜单页面

  • 主要还是配置@H_301_33@navigationOptions属性
  1. //设置顶部导航栏的内容
  2. static navigationOptions = ({navigation,screenProps}) => ({
  3. // 这里面的属性和App.js的navigationOptions是一样的。
  4. headerTitle: '我是带有菜单页面',// 设置滑动返回的距离
  5. gestureResponseDistance: {horizontal: 300},//设置@R_429_404@面左侧返回箭头后面的文字,默认是上一个页面标题
  6. headerBackTitle: null,//顶部标题栏的样式
  7. headerStyle: styles.headerStyle,//顶部标题文字的样式
  8. headerTitleStyle: styles.headerTitleStyle,//返回按钮的颜色
  9. headerTintColor: 'white',//设置顶部导航栏左边的视图
  10. headerLeft: (<View/>),//设置顶部导航栏左边的视图 和 解决当有返回箭头时,文字不居中
  11. headerRight: (
  12. <Text style={{color: 'white',marginRight: 13}}
  13. onPress={() => navigation.state.params ? navigation.state.params.menuClick() : null}>添加
  14. </Text>),});
  • 隐藏左边返回箭头:headerLeft: (< View/>),
  • 添加右边的菜单:headerRight: (),

菜单添加点击事件,添加@H_301_33@headerRight视图的时候我们已经调用好了方法现在只需要定义即可

  • 需要在view渲染完成之后添加点击事件
  1. componentDidMount() {
  2. // 通过在componentDidMount里面设置setParams
  3. this.props.navigation.setParams({
  4. menuClick: this.menuClick,});
  5. }
  1. menuClick = () => {
  2. alert('我是添加菜单');
  3. };

End:StackNavigator就简单的介绍到这里来,源码下载地址如果遇到什么问题欢迎留言或者issuse

推荐阅读:

猜你在找的React相关文章