界面结构 一个TabNavigator 一个 StackNavigator结构,参考饿了么开源框架以及相关API
MainView 和 ChatScreen同属一个 StackNavigator
MainView为一个TabNavigator
=============================================================================================================================
上代码
============================================================================================================================
app.js
import React from 'react'; //Component用括号括起来 import { StyleSheet, AppRegistry, View, Image, TextView } from 'react-native'; import { StackNavigator, TabNavigator } from 'react-navigation'; import MainPage from './page/MainContainer'; import ChatModel from './page/Chat'; import MessageModel from './page/Message'; import MeModel from './page/Me'; import ChatScreen from './page/ChatScreen'; const MainView = TabNavigator({ Main: { screen: MainPage }, ChatPage: { screen: ChatModel }, Message: { screen: MessageModel }, Me: { screen: MeModel } }, //页面配置 // { // animationEnabled: false, //切换页面是否有动画效果 // tabBarPosition: 'bottom', //显示在低端,android默认显示在顶端 // backBehavior: 'none', //默认是按back按键跳到tab页,none为不跳转 // tabBarOptions: { // activeTintColor: '#111111', //文字和图片选中颜色 // inactiveTintColor: '#666666', //文字和图片未选中颜色 // showIcon: true, //android默认不显示 // indicatorStyle: { // //Height: 0,//如果TabBar下面有一条线,就设置高度为零即可 // style: { // //backgroundColor: , // //height // }, // labelStyle: { // //fontSize: 10//文字大小 // }, // } // } // } { lazy: true, tabBarPosition: 'bottom', tabBarOptions: { activeTintColor: '#3e9ce9', inactiveTintColor: '#999999', showIcon: true, style: { backgroundColor: '#fff' }, indicatorStyle: { opacity: 0 }, tabStyle: { padding: 0 } } } ) const styles = StyleSheet.create( { container: { justifyContent: 'center', alignItems: 'center', flex: 1, }, }); const App = StackNavigator( //路由页面配置 { Home: { screen: MainView, navigationOptions: { //导航栏标题 title: '主页面', //没有header属性 // header: { // visible: true, // title: '子页面1标题', // //left : //导航栏左按钮 // //right : //导航栏右按钮 // //style : //导航栏title的style // //tintColor ://导航栏的颜色 // cardStack: { // gesturesEnable: false, // } // }, }, path: '' }, //此处相当于进行界面申请声明,在同一个StackNavigator下可以进行参数使用 Chat: { screen: ChatScreen, navigationOptions: { title: '聊天界面chatscreen' } } }, //路由参数配置 { initialRouteName: 'Home', //类名 navigationOptions: { headerStyle: { backgroundColor: '#3e9ce9' }, headerTitleStyle: { color: '#fff', fontSize: 20 }, headerTintColor: '#fff' }, mode: 'card', headerMode: 'screen', //cardStyle: //样式 //onTransitionStart: //页面切换开始回调 //onTransitionEnd: //页面切换结束回调 //headerTitleStyle: {},//导航栏标题样式 //headerStyle:{},//导航栏样式 //headertTintColor: '#fff'//颜色值 } // { // headerMode: 'screen', // navigationOptions: { // headerStyle: { // backgroundColor: '#3e9ce9' // }, // headerTitleStyle: { // color: '#fff', // fontSize: 20 // }, // headerTintColor: '#fff' // } // } ); export default App;
=================================================================================================================
MainPage.js 主页界面
import React from 'react'; import { AppRegistry, Text, View, StyleSheet, } from 'react-native'; //由于使用未定义的TextView控件导致渲染问题 class MainPage extends React.Component { constructor(props) { super(props); this.state = { testCode: '1' }; } render() { return ( <View style = {styles.container} > <Text style = {styles.container} onPress = {this.goToChat.bind(this)}> 主界面 + {this.state.testCode} </Text> </View> ); }; goToChat() { this.props.navigation.navigate('Chat', { chatName: 'fromMainPage', getResult:function(myMessage){ this.setState({ testCode:myMessage, }) } }) } // render() { // const { // params // } = this.props.navigation.state; // return ( // <View style={{backgroundColor:'#fff',flex:1}}> // <Text style={{padding:20}}>Chat with</Text> // </View> // ); // } } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center' } }); // module.exports = MainPage; export default MainPage; // export class MainPage;
============================================================================================================================
ChatModel.js 聊天界面
import React, { Component } from 'react'; import { AppRegistry, Text, View, StyleSheet, } from 'react-native'; class ChatModel extends React.Component { render() { return ( <View style = {styles.container}> <Text style = {styles.container}> 聊天界面 </Text> </View> ); }; } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center' } }); export default ChatModel;
===========================================================================================================================
MessageModel.js 消息界面
import React, { Component } from 'react'; import { AppRegistry, Text, View, StyleSheet, } from 'react-native'; class MessageModel extends React.Component { render() { return ( <View style = {styles.container}> <Text style = {styles.container}> 消息界面 </Text> </View> ); }; } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center' } }); export default MessageModel;
===================================================================================================================================
MeModel.js 我的界面
import React, { Component } from 'react'; import { AppRegistry, Text, View, StyleSheet, } from 'react-native'; class MeModel extends React.Component { render() { return ( <View style = {styles.container}> <Text style = {styles.container}> 我的界面 </Text> </View> ); }; } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center' } }); export default MeModel;
======================================================================================================================
ChatScreen.js 主界面按钮事件跳转界面
import React from 'react'; import { Button, Image, View, Text } from 'react-native'; //定义去哪聚属性 数组 普通变量 或者某个对象类型 // 类型定义 防止类型写错,在下面的propTypes有用到 // Arrays ---> React.PropTypes.array // Boolean ---> React.PropTypes.bool // Numbers ---> React.PropTypes.number // Strings ---> React.PropTypes.string // Objects ---> React.PropTypes.object // Functions ---> React.PropTypes.func // let tempTypeIds = []; // let maxCategory = 5; // 默认最多5个类别,远端可配置 // 由于是块级有效,所以在下面console看不到变量的值 // let TAG = 'CMCtag'; //变量声明,但是在class中无法看到其值,需要再进行赋值 var TAG = 'CMCtagVar'; //================================================================================================================== // 2.变量声明 // ES5只有2种声明变量的方法:var、function。 // ES6共有6种声明变量的方法:var、function、let 块级有效{}适合for、const只读属性、import(require)、class。 // const propTypes = { // categoryActions: PropTypes.object, // category: PropTypes.object.isRequired // }; class ChatScreen extends React.Component { constructor(props) { super(props); //声明可以进行动态改变的变量,其中在navigation中的setParams方法就可以改变这个变量=====相当于一个类改变另一个类的某个变量======================= this.state = { isRight: false }; //这种方式的变量声明可以直接在底部看到其值========================================================================================== // this.TAG = 'CMC'; } static navigationOptions = { title: '聊天', }; setRightState() { this.setState({ isRight: true }) console.log(TAG + ' isRight : ' + this.state.isRight); //==============================================================================================setParams回传改值待续 // this.props.navigation.setParams({ // testCode: '2' // }); // this.props.navigation.params.getResult("This is from SecondPageComponent"); // this.props.getResult("This is from SecondPageComponent"); } // {params.user} render() { //在方法中获取上个界面传递变量======================================================================================================== const { params } = this.props.navigation.state; //TAG 标识我们用的是 顶部var声明的变量,如果用 this.TAG则是相当于当前class中声明了一个变量============================================ TAG = 'CMC RENDER'; // alert(params.chatName); console.log( TAG + params.chatName); return ( <View style={{backgroundColor:'#fff',flex:1}}> <Text style={{padding:20}} onPress = {this.setRightState.bind(this)}>Chat with {params.chatName}</Text> </View> ); } }; export default ChatScreen; // AppRegistry.registerComponent('ChatScreen', () => ChatScreen);