文档章节

react-native--07Navigator

AllenOR灵感
 AllenOR灵感
发布于 2017/09/10 01:18
字数 1368
阅读 1
收藏 0

这一章我参考的资源很多,官网的navigator、navigation、UIExplorer的navigatorExample,因此会涉及到非常多的es6语法,尽量一一记录下来。

最小化代码
import React, {Component} from 'react';
import SplashScreen from 'react-native-splash-screen';
import {AppRegistry, Text, Navigator} from 'react-native';
const sleep = require('es6-sleep').promise;

export default class NavAllDay extends Component {
    async sleep(milliansecond) {
        await sleep(milliansecond);
    }
    async componentDidMount() {
        // do anything while splash screen keeps, use await to wait for an async task.
        await sleep(2000);
        await SplashScreen.hide();
    }
    render() {
        return (<Navigator initialRoute={{ title: 'Awesome Scene', index: 0 }}
                           renderScene={(route, navigator) => <Text>Hello {route.title}!</Text> }
                           style={{padding: 100}}/> );
    }
}
AppRegistry.registerComponent('rn_practice', () => NavAllDay);

Navigator参数:
initialRoute: 类似MVC框架中的urls这一层,表明当前这个Navigator有多少个路径,每个路径表示一个可切换的场景。
renderScene: 类似MVC框架中的template这一层,每次触发场景切换时将定义的变量传递过来进行重新渲染。

备注: 上面这段代码不会有任何很直观的效果,因为只有一个route,没有切换,因此感觉不出来它的特性,下面逐量去增加代码。

两条路由
import React, {Component} from 'react';
import SplashScreen from 'react-native-splash-screen';
import {AppRegistry, Text, Navigator, TouchableHighlight} from 'react-native';
const sleep = require('es6-sleep').promise;
export default class NavAllDay extends Component {
    async sleep(milliansecond) {
        await sleep(milliansecond);
    }

    async componentDidMount() {
        // do anything while splash screen keeps, use await to wait for an async task.
        await sleep(2000);
        await SplashScreen.hide();
    }

    render() {
        const routes = [
            {title: 'First Scene', index: 0}, 
            {title: 'Second Scene', index: 1}
        ];
        return (<Navigator
                    initialRoute={routes[0]}
                    renderScene={
                        (route, navigator) =>
                        <Text onPress={() => {
                            if (route.index == 0) {
                                navigator.push(routes[route.index+1])
                            } else {
                                navigator.pop()
                            }}
                        }>
                        Hello {route.title} !
                        </Text>
                    }
                 />
        );
    }
}
AppRegistry.registerComponent('rn_practice', () => NavAllDay);

备注: 这里利用了Text组件的onPress来触发状态的切换,也就是说当我点击这个文本内容时,就会切换到另外一个文本。

多条路由
import React, {Component, PropTypes} from 'react';
import SplashScreen from 'react-native-splash-screen';
import {View, Text, TouchableHighlight, AppRegistry, Navigator} from 'react-native';
const sleep = require('es6-sleep').promise;
export default class MyScene extends Component {
    render() {
        return (
            <View>
                <Text>Current Scene: {this.props.title}</Text>
                <Text onPress={this.props.onForward}>Tap me to load the next scene</Text>
                <Text onPress={this.props.onBack}>Tap me to go back</Text>
            </View> )
    }
}
MyScene.propTypes = {
    title: PropTypes.string.isRequired,
    onForward: PropTypes.func.isRequired,
    onBack: PropTypes.func.isRequired,
};

class SimpleNavigationApp extends Component {
    async sleep(milliansecond) {
        await sleep(milliansecond);
    }

    async componentDidMount() {
        // do anything while splash screen keeps, use await to wait for an async task.
        await sleep(2000);
        await SplashScreen.hide();
    }
    render() {
        return (
            <Navigator
                initialRoute={{ title: 'My Initial Scene', index: 0 }}
                renderScene={(route, navigator) =>
                    <MyScene title={route.title}
                              onForward={() => {
                                  const nextIndex = route.index + 1;
                                  navigator.push({ title: 'Scene ' + nextIndex, index: nextIndex, }); }}
                              onBack={() => {
                                  if (route.index > 0) { navigator.pop(); }
                              }}
                     />
                }
            />
        )
    }
}
AppRegistry.registerComponent('rn_practice', () => SimpleNavigationApp);

propTypes是用来声明当前对象所需要的参数类型和是否必填,一般用于开发调试(注释掉不影像任何功能),线上产品不要使用propTypes因为它会影像性能和提出警告,官方详细说明
MyScene 这个对象内容很简单,直接就返回一个View里面包裹这三个Text,在react中,它会将MyScene当作一个组件对象,可以直接用在JSX中,例如<MyScene />。
备注: 在这个例子中,并没有提前定义总共有多少个routes,只定义了initialRoute的数据格式,然后所有的操作都在renderScene里面去动态的控制,也就是说通过这种方式可以无限点击和无限操作。

装饰(宽和高)--多条路由
import React, {Component, PropTypes} from 'react';
import SplashScreen from 'react-native-splash-screen';
import {View, Text, TouchableHighlight, AppRegistry, Navigator, StyleSheet} from 'react-native';
const sleep = require('es6-sleep').promise;
export default class MyScene extends Component {
    render() {
        return (
            <View>
                <View style={styles.row_title}>
                    <Text>Current Scene: {this.props.title}</Text>
                </View>
                <View style={styles.row_items}>
                    <Text onPress={this.props.onForward}>Tap me to load the next scene</Text>
                </View>
                <View style={styles.row_items}>
                    <Text onPress={this.props.onBack}>Tap me to go back</Text>
                </View>
            </View> )
    }
}

class SimpleNavigationApp extends Component {
    async sleep(milliansecond) {
        await sleep(milliansecond);
    }

    async componentDidMount() {
        // do anything while splash screen keeps, use await to wait for an async task.
        await sleep(2000);
        await SplashScreen.hide();
    }
    render() {
        return (
            <Navigator
                initialRoute={{ title: 'My Initial Scene', index: 0 }}
                renderScene={(route, navigator) =>
                    <MyScene title={route.title}
                              onForward={() => {
                                  const nextIndex = route.index + 1;
                                  navigator.push({ title: 'Scene ' + nextIndex, index: nextIndex, }); }}
                              onBack={() => {
                                  if (route.index > 0) { navigator.pop(); }
                              }}
                     />
                }
                configureScene={(route, navigator) => Navigator.SceneConfigs.HorizontalSwipeJump}
            />
        )
    }
}

const styles = StyleSheet.create({
    row_items: {
        padding: 20,
        borderBottomWidth: 1 / 3,
        borderBottomColor:'#CDCDCD',
    },

    row_title: {
        height: 50,
        borderBottomWidth: 1 / 3,
        borderBottomColor:'#CDCDCD',
        justifyContent: 'center',
        alignItems: 'center'
    }
});
AppRegistry.registerComponent('rn_practice', () => SimpleNavigationApp);

StyleSheet 加点样式跟没有样式,确实不一样哈,好看多了。
configureScene 这是Navigator组件其中的一个参数,它的用途是配置切换的效果,这里列出了可配置范围。

  • Navigator.SceneConfigs.PushFromRight (default)
  • Navigator.SceneConfigs.FloatFromRight
  • Navigator.SceneConfigs.FloatFromLeft
  • Navigator.SceneConfigs.FloatFromBottom
  • Navigator.SceneConfigs.FloatFromBottomAndroid
  • Navigator.SceneConfigs.FadeAndroid
  • Navigator.SceneConfigs.SwipeFromLeft
  • Navigator.SceneConfigs.==HorizontalSwipeJump== # 这个牛逼, 采用这个配置之后,在屏幕任意地方左划或又划分别标识前进和后退,但是前提是要存在多个routes,否则划不过去。
  • Navigator.SceneConfigs.HorizontalSwipeJumpFromRight
  • Navigator.SceneConfigs.HorizontalSwipeJumpFromLeft
  • Navigator.SceneConfigs.VerticalUpSwipeJump
  • Navigator.SceneConfigs.VerticalDownSwipeJump
装饰(material circle)--多条路由
import React, {Component, PropTypes} from 'react';
import SplashScreen from 'react-native-splash-screen';
import {View, Text, TouchableHighlight, AppRegistry, Navigator, StyleSheet, TouchableNativeFeedback} from 'react-native';
const sleep = require('es6-sleep').promise;

export default class MyScene extends Component {
    render() {
        return (
            <View>
                <View style={styles.row_title}>
                    <Text>Current Scene: {this.props.title}</Text>
                </View>
                <TouchableNativeFeedback
                    background={TouchableNativeFeedback.SelectableBackground()}
                    onPress={this.props.onForward}>
                    <View style={styles.row_items}>
                        <Text>
                            Enabled TouchableNativeFeedback
                        </Text>
                    </View>
                </TouchableNativeFeedback>

                <TouchableNativeFeedback
                    background={TouchableNativeFeedback.SelectableBackground()}
                    onPress={this.props.onBack}>
                    <View style={styles.row_items}>
                        <Text>Tap me to go back</Text>
                    </View>
                </TouchableNativeFeedback>
            </View> )
    }
}

class SimpleNavigationApp extends Component {
    async sleep(milliansecond) {
        await sleep(milliansecond);
    }

    async componentDidMount() {
        // do anything while splash screen keeps, use await to wait for an async task.
        await sleep(2000);
        await SplashScreen.hide();
    }
    render() {
        return (
            <Navigator
                initialRoute={{ title: 'My Initial Scene', index: 0 }}
                renderScene={(route, navigator) =>
                    <MyScene title={route.title}
                              onForward={() => {
                                  const nextIndex = route.index + 1;
                                  navigator.push({ title: 'Scene ' + nextIndex, index: nextIndex, }); }}
                              onBack={() => {
                                  if (route.index > 0) { navigator.pop(); }
                              }}
                     />
                }
                configureScene={(route, navigator) => Navigator.SceneConfigs.HorizontalSwipeJump}
            />
        )
    }
}

const styles = StyleSheet.create({
    row_items: {
        padding: 20,
        borderBottomWidth: 1 / 3,
        borderBottomColor:'#CDCDCD',
    },

    row_title: {
        height: 50,
        borderBottomWidth: 1 / 3,
        borderBottomColor:'#CDCDCD',
        justifyContent: 'center',
        alignItems: 'center'
    },
});
AppRegistry.registerComponent('rn_practice', () => SimpleNavigationApp);

腾讯新闻APP中的新闻列表,当我长按某一条新闻列表是,会出现一个底色为灰色的圆圈慢慢扩大一直灰色到把整行给覆盖掉,这个特性采用的是TouchableNativeFeedback,是google的material设计风格。
注意: 我在调试这个功能,代码已经写好了但是一直都没有出现NativeFeedback这个特效,反复折腾了好久才发现原来是我在Text组件中用了onPress,导致与TouchableNativeFeedback相互冲突了,所以我把Text中的onPress移除掉,将相关的状态切换代码写到TouchableNativeFeedback组件的onPress中。

两个navigator

一个是导航,另外一个是列表

本文转载自:http://www.jianshu.com/p/e13cc375a0de

共有 人打赏支持
AllenOR灵感
粉丝 10
博文 2635
码字总数 83001
作品 0
程序员
React Native 学习指南

本指南汇集React-Native各类学习资源,给大家提供便利。指南正在不断的更新,大家有好的资源欢迎Pull Requests! 原文地址:https://github.com/ele828/react-native-guide 同时还有Awesome...

OSC编辑部
2015/07/09
4.8K
9
《React-Native系列》React-Native实战系列博客汇总

从2016年7月份开始,坚持写ReactNative系列博客,记录工作中遇到的点滴。 今天把博客汇总如下: 《React-Native系列》1、初探React-Native 《React-Native系列》2、RN与native交互与数据传递...

hsbirenjie
2016/11/07
0
0
React Native 相关资源汇总

原文地址:https://github.com/jondot/awesome-react-native 文章 React Native: Bringing modern web techniques to mobile First impressions using React Native React Packager README.......

OSC编辑部
2015/07/21
1K
1
React-Native学习资源

React-Native学习资源 官网文档:https://facebook.github.io/react-native/docs/getting-started.html#content 中文文档:http://reactnative.cn/ 目录 教程 React Native React.js ES6 系列教......

啊莫
2016/03/27
288
0
整理了一份React-Native学习指南

自己在学习React-Native过程中整理的一份学习指南,包含 教程、开源app和资源网站等,还在不断更新中。欢迎pull requests! React-Native学习指南 本指南汇集React-Native各类学习资源,给大...

太阳黑子
2016/11/03
34
0

没有更多内容

加载失败,请刷新页面

加载更多

虚拟机学习之二:垃圾收集器和内存分配策略

1.对象是否可回收 1.1引用计数算法 引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时候计数器值为0的对象就是不可能...

贾峰uk
17分钟前
0
0
smart-doc特殊功能使用介绍

smart-doc从8月份底开始开源发布到目前为止已经迭代了几个版本。在这里非常感谢那些敢于用smart-doc去做尝试并积极提出建议的社区用户。因此决定在本博客中重要说明下smart-doc的功能,包括使...

上官胡闹
昨天
1
0
JavaEE——Junit

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 Junit Junit又名单元测试,Junit是用来测试Jav...

凯哥学堂
昨天
1
0
读《美丽新世界》

一、背景 十一国庆节从重庆回深圳的时候,做得绿皮车,路上看了两本书:李笑来的《韭菜的自我修养》和禁书《美丽新世界》。 上篇文章已经分享了 读《韭菜的自我修养》,这篇文章来记录一下《...

tiankonguse
昨天
1
0
archlinux下基于Jenkins,docker实现自动化部署(持续交互)

本文永久更新地址:https://my.oschina.net/bysu/blog/2250954 【若要到岸,请摇船:开源中国 不最醉不龟归】 -----------------------------------第一部分Jenkins的安装与使用-----------...

不最醉不龟归
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部