React Native学习笔记(七)-页面跳转、传值、回传

React Native页面跳转、传值、回传

Navigator --- 在React Native中的不同页面我们称之为场景(Scene),而Navigator页面跳转、传参的介质。它通过不同的路由对象来切换不同的场景,从而进行页面的渲染。

  • 初始化路由

      initialRoute = {
          name: 'login',
          component: Login,
      }; 
    

name为页面的名字,component为导入的组件

  • 设置页面的跳转方式

      configureScene = (route) => {
          return Navigator.SceneConfigs.FloatFromRight;
      };
    
  • 场景渲染

      renderScene = (route, navigator) => {
          let Component = route.component;
          return <Component {...route.params} navigator={navigator}/>
      };
    

若是第一次调用route的值为initialRoute的路由,而当我们拿到Login(例子中的Component)的时候,就把navigator对象传递给它,这样在Login页面中就可以使用navigator对象。navitator本质是一个管理所有界面对象的栈,所以通过push()、pop()方法可以控制栈的进出。

使用示例
  1. 在index.ios.js中设置初始路由

     import React, {Component} from 'react';
     
     import {
         AppRegistry,
         Navigator
     } from 'react-native';
     
     import Login from './lifeStyle/login/Login'
     
     export default class lifeStyle extends Component {
         initialRoute = {
             name: 'login',
             component: Login,
         };
     
         configureScene = (route) => {
             return Navigator.SceneConfigs.FloatFromRight;
         };
     
         //第一次调用的时候,第一个参数route就是initialRoute
         renderScene = (route, navigator) => {
             let Component = route.component;
             return <Component {...route.params} navigator={navigator}/>
         };
     
         render() {
             return (
                 <Navigator
                     initialRoute={this.initialRoute}
                     renderScene={this.renderScene}
                     configureScene={this.configureScene}/>
             );
         }
     }
     
     AppRegistry.registerComponent('lifeStyle', () => lifeStyle);
    
  2. 在Login.js页面进行页面的跳转和传参

     import React, {Component} from 'react';
     import {
         StyleSheet,
         View,
         Text,
         Image,
         ScrollView,
         TextInput,
         ToastAndroid,
         TouchableOpacity
     } from 'react-native';
     
     import Global from '../utils/Global';
     import NetUtil from '../utils/NetUtil';
     import JsonUtil from '../utils/JsonUtil';
     import Util from '../utils/Util';
     import StorageUtil from '../utils/StorageUtil';
     
     import LifeStyle from '../App';
     import Register from '../login/Register';
     import ResetPwd from '../login/ResetPwd';
     import TextButton from '../component/TextButton';
     import LoadingView from '../component/LoadingView';
     
     class Login extends Component {
         constructor(props) {
             super(props);
             this.state = {
                 username: '',
                 password: '',
                 email: '',
                 showLoading: false
             }
         }       
         render() {
             return (
                 <View style={styles.container}>
                     <TextButton
                         text={'忘记密码'}
                         onPress={() => this._resetPwd()}
                         color={'#FFDE00'}
                         backgroundColor={'transparent'}/>
    
                     <TextButton
                         style={styles.register}
                         text={'用户注册'}
                         onPress={() => this._register()}
                         color={'#FFDE00'}
                         backgroundColor={'transparent'}/>
                 </View>
             )
         }
         _register = () => {
             this.props.navigator.push({
                 name: 'register',
                 component: Register,
                 params: {
                     name: 'ibinbin'
                 }
             });
         };
         _resetPwd = () => {
             this.props.navigator.push({
                 name: 'resetPwd',
                 component: ResetPwd,
             });
         }
     }
     const styles = StyleSheet.create({
         container: {
             flex: 1,
             backgroundColor: '#f5f5f5'
         },
         reset_pwd: {
             fontSize: 14,
             color: '#FFDE00',
             backgroundColor: 'white'
         },
         register: {
             fontSize: 14,
             color: '#FFDE00',
             textAlign: 'right',
         }
     });
     
     export default Login;
    

    我们在_register()中使用navigator进行页面的跳转并传递了参数。

  3. 在register.js中返回到Login.js页面

     import React, {Component} from 'react';
     import {
         StyleSheet,
         View,
         Text,
         Image,
         TextInput,
         TouchableOpacity
     } from 'react-native';
     import TextButton from "../component/TextButton";
     import Global from '../utils/Global';
     import NetUtil from '../utils/NetUtil';
     import JsonUtil from '../utils/JsonUtil';
     import Util from '../utils/Util';
     import Header from '../component/Header';
     
     class Register extends Component {
     
         constructor(props) {
             super(props);
             this.state = {
                 username: '',
                 password: ''
             };
         }
     
         componentDidMount() {
             this.setState({
                 name: this.props.name
             })
         }
     
         render() {
             return (
                 <View style={styles.container}>
                     <TouchableOpacity>
                         <TextButton
                             text="注册"
                             onPress={() => this._register()}
                             color={'black'}
                             backgroundColor={'#FFDE00'}/>
                     </TouchableOpacity>
                 </View>
             )
         }
         _goBack = () => {
             const {navigator} = this.props;
             if (navigator) {
                 navigator.pop();
             }
         }
     }
     
     const styles = StyleSheet.create({
         container: {
             flex: 1,
             backgroundColor: '#f5f5f5'
         },
         register: {
             marginTop: 20,
             marginLeft: 20,
             marginRight: 20,
             backgroundColor: '#FFDE00',
             height: 35,
             borderRadius: 5,
             justifyContent: 'center',
             alignItems: 'center',
         },
     });
     
     export default Register;
    

    在componentDidMount()我们通过this.props.name接收了从Login页面传递过来的name。并在_goBack()设置了页面的返回。

如果我们需要把值回传过去呢???
  • Login.js中写个回调函数

      _register = () => {
          this.props.navigator.push({
              name: 'register',
              component: Register,
              params: {
                  name: 'ibinbin',
                  getMyName: (myName) => {
                          this.setState({
                              name: myName
                          })
                  }
              }
          });
      };
    
  • 在Register.js中设置值

      _goBack = () => {
          const {navigator} = this.props;
          this.props. getMyName(name);
          if (navigator) {
              navigator.pop();
          }
      }
    
好了到这里关于页面的跳转、传值、回传已经讲解完毕。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,265评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,274评论 1 288
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,087评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,479评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,782评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,218评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,594评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,316评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,955评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,274评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,803评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,177评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,732评论 3 229
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,953评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,687评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,263评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,189评论 2 258

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,083评论 18 139
  • 前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人...
    珍此良辰阅读 7,227评论 33 15
  • ANavigator稍微复杂点的移动应用都会有页面跳转的场景,即用户在页面A上点击某个功能,比如查看内容详情或者帮...
    conf1234阅读 1,411评论 0 3
  • 公司打算用react-native开发APP,初始RN遇到了很多坑,搭建了一个小的项目框架,结合redux根据公司...
    45b645c5912e阅读 702评论 0 5
  • 我有一个梦 向往军营身着迷彩 手握钢枪保国守家 马革裹尸征战疆场 我有一个梦 和心仪已久的姑娘 执子之手与子偕老 ...
    似冰的梦阅读 229评论 2 1