ReactNative Navigator

https://facebook.github.io/react-native/docs/navigator.html

Navigator实现了页面之间的跳转。

Demo描述:打开即进入“课程”页面,点击详情按钮,进入“课程详情”页面,“课程详情”页面点击头部返回按钮返回“课程”页面。

Navigator简单使用

添加 Navigator 的组件<Navigator/>。

设置方法: 初始化路由(initialRoute),配置场景动画(configureScene),渲染场景(renderScene),初始化路由(initialRoute),使用CourseListView页面作为首页。

//主模块
render() {
    const routes = [
        {component: CourseListView, name: ‘CourseList‘}
    ];
    return (
        <Navigator
            style={{flex:1}}
            configureScene={this.configureScene}
            initialRoute={routes[0]}
            renderScene={this.renderScene}/>
    );
}

配置场景动画(configureScene): 根据路由的type属性, 判断使用的动画样式, 底部弹出或右侧弹出,或者官网介绍的其他样式。

configureScene(route, routeStack) {
    if (route.type == ‘Bottom‘) {
        return Navigator.SceneConfigs.FloatFromBottom; // 底部弹出
    }
    return Navigator.SceneConfigs.PushFromRight; // 右侧弹出
}

渲染场景(renderScene): 使用动态加载组件的方式。 设置加载页面的navigator参数, 其余使用route.passProps属性传递其他参数。可以动态加载组件,也可以静态加载组件。

//使用动态加载组件
renderScene(route, navigator) {
    return <route.component navigator={navigator}  {...route.passProps} />;
}

//使用静态加载组件,不是特别灵活,还需要预定义组件
renderScene(route, navigator) {
    if (route.name == ‘CourseList‘) {
      return <CourseListView navigator={navigator} {...route.passProps}/>
    } else if (route.name == ‘CourseDetail‘) {
      return <CourseDetailView navigator={navigator} {...route.passProps}/>
    }
}

以上是介绍index.ios.js设置默认路由的方法。

CourseListView.js

/**
 * Created by myz on 16/12/8.
 */
‘use strict‘;

import React, { Component } from ‘react‘;
import {
    Navigator,
    Text
} from ‘react-native‘;
import {
    Button,
    Container,
    Content,
    Header,
    Title
} from ‘native-base‘;

import CourseDetailView from ‘./CourseDetailView.js‘;

export default class CourseListView extends Component {
    _navigate(name, type = ‘Normal‘) {
        this.props.navigator.push({
            component: CourseDetailView,
            name: ‘CourseDetail‘,
            passProps: {
                name: name
            },
            type: type
        })
    }

    render() {
        return (
            <Container>
                <Header>
                    <Title>课程</Title>
                </Header>
                <Content>
                    <Button block style={{marginTop:30}} onPress={()=>this._navigate(‘CourseDetail‘)}>
					<Text>我是课程</Text>
					</Button>
                </Content>
            </Container>
        );
    }
}

之后再定义CourseDetailView组件,这样就可以实现页面跳转了。

_navigate()方法导航跳转, 调用navigator.push()方法。 传递参数passPropsname属性, type动画类型, component跳转组件。
跳到指定页面是调用navigator.push()方法;
返回第一页是调用this.props.navigator.pop(),使当前页面出栈,显示上一个栈内页面。

统一导航栏

额外添加navigationBar的属性, 自定义设置导航栏, 保持所有页面的导航栏一致. 属性添加<NavigationBar/>标签, 通过routeMapper控制导航栏的功能和样式。

<Navigator
    style={{flex:1}}
    configureScene={this.configureScene}
    initialRoute={routes[0]}
    renderScene={this.renderScene}
    navigationBar={
      <Navigator.NavigationBar
        routeMapper={NavigationBarRouteMapper}/>}
/> 


NavigationBarRouteMapper用来设置左键LeftButton,右键RightButton,标题Title。

var NavigationBarRouteMapper = {
    // 左键
    LeftButton(route, navigator, index, navState) {
        if (index > 0) {
            return (
                <Button transparent onPress={() => {if (index > 0) {navigator.pop()}}}>
                    <Icon name=‘ios-arrow-back‘/>
                </Button>
            );
        }
    },
    // 右键
    RightButton(route, navigator, index, navState) {
        if (route.onPress)
            return (
                <Button onPress={() => route.onPress()}>
                    <Text> {route.rightText || ‘右键‘}</Text>
                </Button>
            );
    },
    // 标题
    Title(route, navigator, index, navState) {
        return (
            <Title>{route.name}</Title>
        );
    }
};

同时,当“课程”页面跳转的时候,传递的路由信息有些变化,控制“课程详情”页面导航栏的显示信息。

_onPress() {
    alert("我是导航栏右边按钮!");
}

_navigate(name, type = ‘Normal‘) {
    this.props.navigator.push({
        component: CourseDetailView,
        name: ‘课程详情‘,
        passProps: {
            name: name
        },
        onPress: this._onPress,
        rightText: ‘右边‘,
        type: type
    })
}
时间: 2024-10-12 22:51:03

ReactNative Navigator的相关文章

基于 react-navigation 父子组件的跳转链接

在父组件中引入子组件,这个时候通常直接使用 onPress 的跳转就会不起作用 正确的处理方法是,在组件中封装一个点击事件,然后在父组件中执行跳转的函数 正常的跳转方法是: import React from 'react'; import { StyleSheet, Text, View, Image, TouchableOpacity, ScrollView, } from 'react-native'; // navigator import { StackNavigator } from

react-native http请求之后navigator导航跳转

琢磨react-native有一段时间了.对于我来说,它的确是前端开发工作者的福音,因为我可以利用它来写app的代码,而且基本可以一套代码,多个平台使用. 早就想写一篇随笔记录一下react native的学习历程了,可是最近在navigator(导航,可以理解为‘页面’跳转)这里遇到了一个比较棘手的问题,所以耽搁了两天,中途甚至产生过放弃的念头,还一度去看了ionic以及QT的demo,思前想后,经过对比,发现还是react-native比较自己.刚好今天也将困扰已久额问题解决了,心情大好啊.

React-Native组件之 Navigator和NavigatorIOS

对于app而言,一款应用往往涉及到很多的页面,而页面之间的跳转Android和iOS实现也各不相同.在iOS上,系统为我们提供了UINavigationController控件用来专门控制页面的跳转,iOS的实现思路很清晰,为按钮添加action事件,点击之后跳转到指定的页面即可.例如: //定义一个Button,点击后跳转到另一个页面 UIButton * button=[UIButton buttonWithType:UIButtonTypeSystem]; button.frame=CGR

reactnative(2) - Navigator 使用案例

'use strict'; import React, { Component } from 'react'; import { AppRegistry, ScrollView, StyleSheet, Text, View, TouchableHighlight, Navigator, } from 'react-native'; class NavButton extends React.Component{ render(){ return( <TouchableHighlight sty

React-Native到0.44版本后Navigator 不能用的问题

新升级  到0.46版本以后 Navigator 不能使用报错. 'Navigator is deprecated and has been removed from this package. It can now be installed ' +           'and imported from `react-native-deprecated-custom-components` instead of `react-native`. ' +          'Learn abou

【REACT NATIVE 系列教程之五】NAVIGATOR(页面导航)的基本使用与传参

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2248.html 今天介绍一种应用开发中常用的负责页面切换及导航功能的组件:Navigator 一:Navigator 对于页面导航其实主要功能就是:每个页面都知道本身应该切换到哪个页面,并且切到的页面会记录从哪里来,如果要返回的话,知道返回到哪个页面.这一切都不需要再用逻辑管理!而且每个页面之间也可以进行参数传递,

react-native开发经验

# **RN开发经验** ## 一.环境配置关于环境配置,前辈已有完整的总结:http://tvrn.devops.letv.com/docs/Environment.html **IDE准备:** [AndroidStudio](https://developer.android.com/studio/index.html),[VisualStudioCode](https://code.visualstudio.com/) 如何打造现代化RN开发环境:http://tvrn.devops.l

ReactMix框架,让你实现一套js代码,基于ReactNative在H5,App都能完美跑起来,Write Once,Run Anywhere

ReactNative框架推出已经有一段时间了,相信很多小伙伴都在尝试实现Write Once, Run Anywhere的梦想,比如淘宝的ReactWeb等等,但是这些框架都局限于因为ReactNative本省的局限性,比如不支持CSS,不支持DOM操作,不支持选择器等等,而没有办法实现Js代码的全平台统一,现在通过全新的ReactMix框架,你可以让你的代码不仅可以在ReactNative上跑起来,实现安卓和iOS代码的统一,而且同样一份代码也可以在PC,H5上跑起来,到底有多神气?让我们来

react-native学习笔记二

今天来写一个组件,相信很多人都会用到的——ViewStack. ViewStack组件无疑是UI中很重要的一个组件,可惜react-native并没有内嵌进去,需要开发者自己去实现. 实现原理很简单,就是根据索引来显示一个子视图,用一个render即可完成: 1 render(){ 2 return( 3 <View> 4 {this.props.children[this.props.index]} 5 </View> 6 ); 7 } 这样,一个最简单的ViewStack就完成