React Native 的 Navigator 组件使用方式
React Native的编程思想类似于
本文源码的GitHub下载地址
关于React Native项目的启动,参考1,参考2. 基本功能Navigator添加 Navigator 的组件 // 主模块
class SimpleView extends Component {
// ...
render() {
return (
<Navigator style={{flex:1}} initialRoute={{component: FirstPage}} configureScene={this.configureScene} renderScene={this.renderScene}/> ); } }
配置场景动画(configureScene): 根据路由的 /** * 配置场景动画 * @param route 路由 * @param routeStack 路由栈 * @returns {*} 动画 */
configureScene(route,routeStack) {
if (route.type == 'Bottom') {
return Navigator.SceneConfigs.FloatFromBottom; // 底部弹出
}
return Navigator.SceneConfigs.PushFromRight; // 右侧弹出
}
渲染场景(renderScene): 使用动态加载组件的方式. 设置加载页面的 /** * 使用动态页面加载 * @param route 路由 * @param navigator 导航器 * @returns {XML} 页面 */
renderScene(route,navigator) {
return <route.component navigator={navigator} {...route.passProps} />;
}
也可以使用 /** * 渲染场景,通过不同参数,设置不同页面 * @param route 路由,场景信息 * @param navigator 导航器 * @returns {XML} 页面 */
renderScene(route,navigator) {
if (route.name == 'FirstPage') {
return <FirstPage navigator={navigator} {...route.passProps}/> } else if (route.name == 'SecondPage') { return <SecondPage navigator={navigator} {...route.passProps}/> } }
第一页FirstPage组件: 包含导航栏标题和两个跳转按钮. 提供两种跳转动画,右出和底部. 点击按钮调用 // 第一页. 使用Component可以自动生成注释,符合标准
class FirstPage extends Component {
// ...
render() {
return (
<View style={styles.container}> <View style={styles.heading}> <Text style={styles.headText}> {'第一页'} </Text> </View> <TouchableOpacity style={styles.button} onPress={()=>this._navigate('你好! (来源第一页:右出)')}> <Text style={styles.buttonText}> {'跳转至第二页(右出)'} </Text> </TouchableOpacity> <TouchableOpacity style={styles.button} onPress={()=>this._navigate('你好! (来源第一页:底出)','Bottom')}> <Text style={styles.buttonText}> {'跳转至第二页(底部)'} </Text> </TouchableOpacity> </View> ); } }
/** * 给Navigator传递参数. * @param name 参数 * @private */
_navigate(name,type = 'Normal') {
this.props.navigator.push({
component: SecondPage,passProps: {
name: name
},type: type
})
}
第二页SecondPage组件: 第二页,跳出返回第一页. 调用 // 第二页,点击跳出返回第一页
class SecondPage extends Component {
render() {
return (
<View style={styles.container}> <View style={styles.heading}> <Text style={styles.headText}> 第二页: {this.props.name} </Text> </View> <TouchableOpacity style={styles.button} onPress={()=>this.props.navigator.pop()}> <Text style={styles.buttonText}> 返回上一页 </Text> </TouchableOpacity> </View> ); } }
Navigator的主要功能,是管理页面栈,控制页面的跳入跳出. 统一导航栏对于应用而言,需要统一的导航栏,Navigator 组件也提供导航栏的定制. Navigator与上文类似,额外添加 // 主模块
class UniformView extends Component {
//...
render() {
return (
<Navigator style={{flex:1}} initialRoute={{name: 'FirstPage',component: FirstPage}} configureScene={this.configureScene} renderScene={this.renderScene} navigationBar={ <Navigator.NavigationBar style={styles.navContainer} routeMapper={NavigationBarRouteMapper}/>} /> ); } }
RouteMapperNavigationBarRouteMapper: 导航栏路由映射器,设置左键LeftButton,右键RightButton,标题Title. // 导航栏的Mapper
var NavigationBarRouteMapper = {
// 左键
LeftButton(route,navigator,index,navState) {
// ...
},// 右键
RightButton(route,// 标题
Title(route,navState) {
return (
<View style={styles.navContainer}> <Text style={styles.title}> 应用标题 </Text> </View> ); } };
左键LeftButton: // 左键
LeftButton(route,navState) {
if (index > 0) {
return (
<View style={styles.navContainer}> <TouchableOpacity underlayColor='transparent' onPress={() => {if (index > 0) {navigator.pop()}}}> <Text style={styles.leftNavButtonText}> 后退 </Text> </TouchableOpacity> </View> ); } else { return null; } },
右键RightButton: 点击调用路由(route)的 // 右键
RightButton(route,navState) {
if (route.onPress)
return (
<View style={styles.navContainer}> <TouchableOpacity onPress={() => route.onPress()}> <Text style={styles.rightNavButtonText}> {route.rightText || '右键'} </Text> </TouchableOpacity> </View> ); },
第一页/第二页第一页与第二页与上文类似,当第一页跳转时,传递的路由信息有些变化,控制第二页与导航栏的显示信息. // 填出提示框
onPress() {
alert("我是Spike!");
}
/** * 跳转页面至SecondPage * @param name 传递参数 * @param type 动画类型 */
gotoNext(name,passProps: {
id: name
},onPress: this.onPress,rightText: 'ALERT!',type: type
})
}
React Native 路由的基本功能就是这些,控制页面的切换,控制导航栏的功能. 导航栏作为应用最重要的组件之一,一定要熟练掌握. OK,that’s all ! Enjoy it!
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |