react-native--07Navigator
这一章我参考的资源很多,官网的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参数: 备注: 上面这段代码不会有任何很直观的效果,因为只有一个route,没有切换,因此感觉不出来它的特性,下面逐量去增加代码。 两条路由import React,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,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);
装饰(宽和高)--多条路由import React,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,}); }} 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,justifyContent: 'center',alignItems: 'center' } }); AppRegistry.registerComponent('rn_practice',() => SimpleNavigationApp);
装饰(material circle)--多条路由import React,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,alignItems: 'center' },}); AppRegistry.registerComponent('rn_practice',() => SimpleNavigationApp); 腾讯新闻APP中的新闻列表,当我长按某一条新闻列表是,会出现一个底色为灰色的圆圈慢慢扩大一直灰色到把整行给覆盖掉,这个特性采用的是 两个navigator一个是导航,另外一个是列表 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |