this.props.navigation未定义不是对象

时间:2018-09-28 08:10:47

标签: react-native

我是本机反应的新手。我正在使用React导航。但是导航无法正常工作,并出现错误:-

"props.navigation undefined is
 not an object"

我正在提供我的项目结构和代码。

项目结构:-

enter image description here

  

App.js中的代码:-

    import { createStackNavigator, createDrawerNavigator  } from 'react-navigation';
import HomeLayout from './src/components/Home/Layout';
import SideMenuLayout from './src/components/DrawerMenu/SideMenu';
import { DetailsScreen } from './DetailsScreen';


const myDrawer  = createDrawerNavigator({
  Home:{
    screen: HomeLayout
  },
  Details:{
    screen: DetailsScreen
  },
},{
  contentComponent: SideMenuLayout,
  drawerWidth: 876/3

})


const native = createStackNavigator({
  Home:{
    screen: myDrawer,
   },
},{
  headerMode: 'none',
})
export default native;

SideMenu.js(抽屉导航器的布局)。在此部分中,所有菜单均已呈现。-

import React, {Component} from 'react';
import { View, StyleSheet} from 'react-native';
import DrawerHeader from './DrawerHeader';
import DrawerMenu from './DrawerMenu';
class SideMenuLayout extends Component {
    state = {
        menuNames:[{
            id:'0',
            name:'My Profile'
        },{
            id:'1',
            name:'Place Order'
        },{
            id:'2',
            name:'Order History'
        },{
            id:'3',
            name:'Payment'
        },{
            id:'4',
            name:'Recharge'
        },{
            id:'5',
            name:'Help'
        },{
            id:'6',
            name:'Logout'
        }]
    }
    render () {
        return (
            <View style={styles.container} >
               <DrawerHeader/>
               <DrawerMenu menuItems={this.state} style={{ marginTop: 106/3}}/>
            </View>
        );
    }
}

export default SideMenuLayout;

const styles = StyleSheet.create({
    container:{
        flex:1,
        backgroundColor: "#ffffff",
    }
});

DrawerMenu.js。在此部分中,所有菜单均已呈现,并希望从此处进行导航。

import React, {Component} from 'react';
import {FlatList, Text, View, StyleSheet,TouchableOpacity} from 'react-native';
import Dash from 'react-native-dash';
import { FontAwesome } from '@expo/vector-icons';
import { StackNavigator  } from 'react-navigation';
const DrawerMenu = (props)=>{
    const { navigate } = props.navigation;
        return (
            <View style={styles.menuContainer}>
                <FlatList
                    data={props.menuItems.menuNames}
                    renderItem={(info) => (
                        <View>
                            <View 
                                style={{
                                    width:690/3,
                                    backgroundColor: '#ffffff',
                                    height:141/3,
                                    paddingTop:48/3,
                                    flexDirection:'row',
                                    marginBottom:7
                                }}>
                                <View style={{position:"relative",width:390/3,height:'100%',backgroundColor:'#ffffff',alignSelf: 'flex-start'}}>
                                    <TouchableOpacity onPress={()=>navigate('Details')}>
                                        <Text style={{color:'#615b5b',fontSize:18,fontFamily:'sans-serif'}}>
                                            {info.item.name}
                                        </Text>
                                    </TouchableOpacity>
                                </View>
                                <View 
                                    style={{
                                        alignItems:"center",
                                        justifyContent:'center',
                                        position:"relative",
                                        width:300/3,
                                        backgroundColor:'#ffffff',
                                        paddingRight:10,
                                        paddingBottom:5,
                                        }}>
                                    <FontAwesome 
                                        style={{ alignSelf: 'flex-end'}} 
                                        name="angle-right" 
                                        size={18} 
                                        color="#615b5b" 
                                    />
                                </View>

                            </View>

                            <Dash dashColor = '#d6d6d6' style={{width:'100%', height:1,alignSelf: 'flex-start'}}/>
                        </View>
                    )}
                    keyExtractor={(info, index) => info.id}
                />
            </View>
        );

}

export default DrawerMenu;


const styles = StyleSheet.create({
    menuContainer:{
        width: 700/3,
        height:1425/3,
        alignSelf: 'flex-end',
        backgroundColor: '#ffffff',
        paddingTop: 61/3,
    }
});

1 个答案:

答案 0 :(得分:2)

SideMenuLayout有一个navigation道具由抽屉自动传递给它。因此,您需要将其进一步传递给您的DrawerMenu

<DrawerMenu navigation={this.props.navigation} menuItems={this.state} style={{ marginTop: 106/3}}/>

...

export default SideMenuLayout;

SideMenuLayout.propTypes = {
    navigation: PropTypes.object // Or use flow, or it does not really matter. It's just type validation.
}

您可以像现在一样使用navigate中的DrawerMenu