RN(react native)入坑指南-07,使用navigator实现页面跳转
前言
此文完全参考React-Native中文社区的博客新手理解navigator的教程而来,建议直接跳转链接进行详细学习,为防止链接失效或不可抗力因素无法访问,个人整理简单记录如下.
开始
由于前一篇文章将代码进行了分层整理,所以我们的index.android.js
已经变得相对简洁
index.android.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| 'use strict';
import React,{Navigator,AppRegistry} from 'react-native';
{} import Login from './src/login/Login.js';
class TaraRn extends React.Component { render() { {} let defaultName = "Login"; let defaultComponent = Login; return ( <Navigator //初始化组件 initialRoute={{ name: defaultName, component: defaultComponent }} //页面切换效果 configureScene={(route) => { return Navigator.SceneConfigs.VerticalDownSwipeJump; }} renderScene={(route, navigator) => { let Component = route.component; return <Component {...route.params} navigator={navigator} /> }} /> ) } } AppRegistry.registerComponent('TaraRn', () => TaraRn);
|
这里来解释一下代码:
第三行: 一个初始首页的component名字,比如我写了一个component叫HomeComponent,那么这个name就是这个组件的名字【HomeComponent】了。
第四行: 这个组件的Class,用来一会儿实例化成 <Component />
标签
第七行:
1
| initialRoute={{ name: defaultName, component: defaultComponent }}
|
这个指定了默认的页面,也就是启动app之后会看到界面的第一屏。 需要填写两个参数: name 跟 component。
第八,九,十行:
1
| configureScene={() => {return Navigator.SceneConfigs.VerticalDownSwipeJump;}}
|
这个是页面之间跳转时候的动画,具体有哪些?
- Navigator.SceneConfigs.PushFromRight (默认)
- Navigator.SceneConfigs.FloatFromRight
- Navigator.SceneConfigs.FloatFromLeft
- Navigator.SceneConfigs.FloatFromBottom
- Navigator.SceneConfigs.FloatFromBottomAndroid
- Navigator.SceneConfigs.FadeAndroid
- Navigator.SceneConfigs.HorizontalSwipeJump
- Navigator.SceneConfigs.HorizontalSwipeJumpFromRight
- Navigator.SceneConfigs.VerticalUpSwipeJump
- Navigator.SceneConfigs.VerticalDownSwipeJump
最后的几行:
1 2 3 4 5
| renderScene={(route, navigator) => { let Component = route.component; return <Component {...route.params} navigator={navigator} /> }} /> );
|
这里是每个人最疑惑的,我们先看到回调里的两个参数:route, navigator。通过打印我们发现route里其实就是我们传递的name,component这两个货,navigator是一个Navigator的对象,为什么呢,因为它有push pop jump…等方法,这是我们等下用来跳转页面用的那个navigator对象。
return <Component {...route.params} navigator={navigator} />
这里有一个判断,也就是如果传递进来的component存在,那我们就是返回一个这个component,结合前面 initialRoute 的参数,我们就是知道,这是一个会被render出来给用户看到的component,然后navigator作为props传递给了这个component。
- getCurrentRoutes() - 获取当前栈里的路由,也就是push进来,没有pop掉的那些。
- jumpBack() - 跳回之前的路由,当然前提是保留现在的,还可以再跳回来,会给你保留原样。
- jumpForward() - 上一个方法不是调到之前的路由了么,用这个跳回来就好了。
- jumpTo(route) - 跳转到已有的场景并且不卸载。
- push(route) - 跳转到新的场景,并且将场景入栈,你可以稍后跳转过去
- pop() - 跳转回去并且卸载掉当前场景
- replace(route) - 用一个新的路由替换掉当前场景
- replaceAtIndex(route, index) - 替换掉指定序列的路由场景
- replacePrevious(route) - 替换掉之前的场景
- immediatelyResetRouteStack(routeStack) - 用新的路由数组来重置路由栈
- popToRoute(route) - pop到路由指定的场景,其他的场景将会卸载。
- popToTop() - pop到栈中的第一个场景,卸载掉所有的其他场景。
Login.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| 'use strict';
{} import styles from './Login.style.js'; {} import Icon from 'react-native-vector-icons/FontAwesome'; {} import Home from '../home/Home.js';
import React, { Component, TouchableHighlight, Text, } from 'react-native';
export default class Login extends Component { constructor(props){ super(props); this.state = { name : null } } _onLogin(){ this.props.navigator.push({ title : 'homepage', component:Home, params : { name : 'Tom' } }) } render() { return ( <View style={styles.container}> <TouchableHighlight style={styles.th} underlayColor="rgb(210, 230, 255)" onPress = {this._onLogin.bind(this)}> <View> <Text>登录</Text> </View> </TouchableHighlight> </View> ); }
|
Home.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| 'use strict'
import React,{ Component, TouchableOpacity, View, Text } from 'react-native'
import styles from './Home.style.js';
export default class Home extends Component{ constructor(props){ super(props); this.state = { name : 'Frank' }; } componentDidMount(){ this.setState({ name : this.props.name }) } _onBack(){ const { navigator } = this.props; if(navigator) { navigator.pop(); } } render(){ return ( <View style={styles.container}> <Text>Hello.{this.state.name}</Text> <TouchableOpacity style={styles.th} onPress={this._onBack.bind(this)}> <Text>点我返回</Text> </TouchableOpacity> </View> ) } }
|