这个问题困扰了我多时,重点不是我不知道缘由,而是不知道怎么解决,花费了我很长时间,可是最终解决了,如今把整个过程记录在这里:javascript
react native 中的navigator组件的使用:html
import{ Navigator } from 'react-native'
<Navigator initialRoute={{ id: 'Home', params: { message: 'travel页面' } }} configureScene={(route) => { if (route.sceneConfig) { return route.sceneConfig } return Navigator.SceneConfigs.FloatFromRight } } renderScene={this.renderView} />
具体能够移步这里 下面开始讲述个人踩坑之旅 能够下载个人项目源码进行详细查看,github地址java
import * as React from "react"; import { AppRegistry, StyleSheet, Text, View, Navigator, NavigatorIOS } from 'react-native'; import { HomeView, SpotsView, TravelsView, WriteView, UserView } from './views' class myApp extends React.Component<any, any>{ constructor(props: any) { super(props) } /** *页面跳转 */ renderView(route: any, navigator: any) { let routeId = route.id; switch (routeId) { case 'Home': return ( <HomeView navigator={navigator} /> ); case 'Spots': return ( <SpotsView {...route.params} navigator={navigator} /> ) case 'Travels': return ( <TravelsView {...route.params} navigator={navigator} /> ) case 'Write': return ( <WriteView {...route.params} navigator={navigator} /> ) case 'User': return ( <UserView {...route.params} navigator={navigator} /> ) } } render() { return ( <Navigator initialRoute={{ id: 'Home', params: { message: 'home页面' } }} configureScene={(route) => { if (route.sceneConfig) { return route.sceneConfig } return Navigator.SceneConfigs.FloatFromBottom } } renderScene={(route, navigator) => this.renderView(route, navigator)} /> ) } } export default () => myApp
(2)定义了一个footerBar组件react
import * as React from 'react' import { View, Text, Image, Touchable, TouchableOpacity, Navigator, Dimensions, StyleSheet } from 'react-native' import * as CONST from '../../CONST' import { HomeView } from '../../views/home/home.view' import { SpotsView } from '../../views/spots/spots.view' import { TravelsView } from '../../views/travels/travels.view' import { WriteView } from '../../views/write/write.view' import { UserView } from '../../views/user/user.view' /**图片的统一引入 */ const homeImg = require('../../../public/index.png') const spotsImg = require('../../../public/spots.png') const writeImg = require('../../../public/write.png') const travelImg = require('../../../public/travels.png') const userImg = require('../../../public/user.png') export class FooterBar extends React.Component<any, any>{ constructor(props: any) { super(props) } /** *页面跳转 */ navigator() { this.props.navigator.push({ id: 'User', params: { messgage: 'User page' } }) } render() { return ( <View style={[styles.footerBarContainer, { width: CONST.WIDTH }]}> <TouchableOpacity style={[styles.footerBarItem, { width: CONST.WIDTH / 5 }]}> <Image source={homeImg} style={styles.itemImg} /> <Text style={styles.itemText}>首页</Text> </TouchableOpacity> <TouchableOpacity style={[styles.footerBarItem, { width: CONST.WIDTH / 5 }]}> <Image source={spotsImg} style={styles.itemImg} /> <Text style={styles.itemText}>景点</Text> </TouchableOpacity> <TouchableOpacity style={[styles.footerBarItem, { width: CONST.WIDTH / 5 }]}> <Image source={writeImg} style={styles.itemImg} /> <Text style={styles.itemText}>记录</Text> </TouchableOpacity> <TouchableOpacity style={[styles.footerBarItem, { width: CONST.WIDTH / 5 }]}> <Image source={travelImg} style={styles.itemImg} /> <Text style={styles.itemText}>游记</Text> </TouchableOpacity> <TouchableOpacity style={[styles.footerBarItem, { width: CONST.WIDTH / 5 }]} onPress={this.navigator}> <Image source={userImg} style={styles.itemImg} /> <Text style={styles.itemText}>个人</Text> </TouchableOpacity> </View> ) } }
而后在其中一个页面的代码以下:git
import * as React from 'react' import { View, Text, Image, Dimensions ,Navigator} from 'react-native' import { FooterBar } from '../../components' export class UserView extends React.Component<any, any>{ constructor(props: any) { super(props) } render() { console.warn(this.props, 'uuuu') return ( <View> <Text>this is the user page</Text> <FooterBar /> </View> ) } }
可是在运行项目的时候,老是提示错误:undefined is not an object (evaluating 'this.props.navigator.push')
github
google了一下,是由于没有正确绑定this对象的缘由,因而按照网上的解决方案试了一下:npm
<TouchableOpacity style={[styles.footerBarItem, { width: CONST.WIDTH / 5 }]} onPress={this.navigator.bind(this)}>
constructor(props: any) { super(props) this.navigator = this.navigator.bind(this) }
onPress={()=>this.navigator}
autobind-decorator
模块,详细步骤能够移步这里可是这四种方案都以失败了结,那个错误仍是稳妥当当地出现,我在facebook
的react-native github
上提了issue
也没人,鸟,issue地址react-native
最后的最后,我仔细地研究了一下facebook的f8app这个开源项目的navigator使用,最终发现是由于我在使用footerBar组件的时候没有传入navigator props
app
因而作了以下更改:函数
export interface propsType { navigator: Navigator }
<FooterBar navigator={this.props.navigator} />
自此,问题解决了,虽然是一个不太难的bug,可是仍是记录一下,在这过程当中学到了不少