zoukankan      html  css  js  c++  java
  • 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
        })
    }
  • 相关阅读:
    在不同的浏览器下FORM及它的小伙伴们默认样式的CSS属性值是不全然一致
    思考博客园的机器人攻击,想到我们可能也需要开启iptables
    大数据量的Mysql数据库备份策略
    win7或win2008系统中,出现【已停止工作,联机检查解决方案并关闭该程序,关闭程序】解决方法!
    Mysql的碎片查看与处理
    "个性化空间"性能优化方案设计初步
    假期结束后的工作安排
    GZIP压缩占用CPU大吗?
    媒体云平台
    关于二级缓存的设计思路
  • 原文地址:https://www.cnblogs.com/maoyazhi/p/6474977.html
Copyright © 2011-2022 走看看