DrawerNavigator
を使用しており、3つのページがあります:Router page
、mainScreen
、およびphotos page
、
ヘッダーnavbar領域を作成し、この<TouchableHighlight onPress={() => this.props.navigation.navigate('DrawerOpen')}>
を使用してmainScreenでDrawerメニューを開き、写真ページでもメニューを使用できますが、写真ページで<TouchableHighlight onPress={() => this.props.navigation.navigate('DrawerOpen')}>
をクリックすると、このエラーが発生しました。
それを修正するにはどうすればよいですか?
私の写真ページ:
import React from 'react';
import { Button, ScrollView, View, Text, StyleSheet, TouchableHighlight } from 'react-native';
import { DrawerNavigator } from 'react-navigation';
import MaterialIcons from 'react-native-vector-icons/MaterialIcons';
import Icon from 'react-native-vector-icons/FontAwesome'
const MyNavScreen = ({ navigation }) => (
<View>
<View style={styles.containerNavbar}>
<TouchableHighlight onPress={() => this.props.navigation.navigate('DrawerOpen')}>
<Icon name="bars" size={30} color="#fff" />
</TouchableHighlight>
<Text style={styles.navbarTitle}>Photos</Text>
</View>
<ScrollView>
<View><Text>photo</Text></View>
<Button onPress={() => navigation.goBack(null)} title="Go back" />
</ScrollView>
</View>
);
const MyPhotosHomeScreen = ({ navigation }) => (
<MyNavScreen navigation={navigation} />
);
MyPhotosHomeScreen.navigationOptions = {
title: 'Photos',
drawerIcon: ({ tintColor }) => (
<MaterialIcons
name="photo"
size={24}
style={{ color: tintColor }}
/>
),
};
export default MyPhotosHomeScreen;
mainScreen:
export default class MainScreen extends React.Component {
static navigationOptions = {
drawerLabel: 'Home',
drawerIcon: ({ tintColor }) => (
<MaterialIcons
name="home"
size={24}
style={{ color: tintColor }}
/>
)
};
render() {
return (
<View>
<View style={styles.containerNavbar}>
<TouchableHighlight onPress={() => this.props.navigation.navigate('DrawerOpen')}>
<Icon name="bars" size={30} color="#fff" />
</TouchableHighlight>
<Text style={styles.navbarTitle}>mainScreen</Text>
</View>
<View>
<View style={styles.containerFooter}>
<Text style={styles.footerTitle}>Footer</Text>
</View>
</View>
</View>
)
}
}
おそらく何かを見落としているかもしれませんが、単純なJavascriptエラーのように見えます。純粋なコンポーネントMyNavScreen
で小道具を破壊しています:
const MyNavScreen = ({ navigation }) => (
これは、this.props
にアクセスできないことを意味します。破壊されたプロップnavigation
にアクセスするだけです。したがって、これは実際には未定義であるため、未定義エラーの理由は次のとおりです。
<TouchableHighlight onPress={() => this.props.navigation.navigate('DrawerOpen')}>
代わりにnavigation
を直接使用するように変更すると、動作するはずです。
<TouchableHighlight onPress={() => navigation.navigate('DrawerOpen')}>
mainScreen
では、構造化されていない引数を持つ純粋なコンポーネントではないので問題ありません。したがって、render()
のthis.props
に引き続きアクセスできます。
これが問題を引き起こしている場合は、 破壊 をブラッシュアップする必要があります。
私の場合、コンストラクターでthis
itを呼び出すメソッドにprop
をバインドすると機能しました。
constructor(props){
super(props);
this.showDetails = this.showDetails.bind(this);// you should bind this to the method that call the props
}
showDetails(_id){
this.props.navigation.navigate('Details');
}
showDetails = (_id) => {
this.props.navigation.navigate('Details');
}
式関数を使用している間、独自のスコープを作成するためです。
子要素でTouchableOpacity/Heightを使用する場合、次のようにthis.props.onPress
を渡します。
<TouchableOpacity onPress={this.props.onPress}/>
次に、次のように親コンポーネントでonPress関数を呼び出します。
<Parent onPress={this.Handlepress} />
<ChildComponent navigation={this.props.navigation}/>
props.navigation.navigate("ScreenName")
これを試して:
import { withNavigation } from 'react-navigation';
withNavigation
はプロジェクト/アプリ全体で小道具を提供します。どこからでもナビゲーション小道具にアクセスできます。
そして
onPress={() => this.props.navigation.navigate('DrawerOpen')}
最後に、
export default withNavigation(MyPhotosHomeScreen);
これを確認してください https://reactnavigation.org/docs/en/connecting-navigation-prop.html
これがReact Navigation 2リリースでの方法です。StackNavigator
の子ナビゲーターであるDrawerNavigator
からopenDrawer()
メソッドを呼び出します。
これは私のDrawerNavigator
です:
export const Drawer = DrawerNavigator(
{
MyAccount: {screen: TabsStack},
});
export const TabsStack = StackNavigator({
Tabs: {
screen: Tabs, navigationOptions: ({navigation}) => ({
headerLeft: (
<TouchableOpacity style={{marginLeft: 10, marginTop: 3}}
onPress={() => navigation.openDrawer()}>
<Image source={require('./assets/menu_h.png')}/>
</TouchableOpacity>)
})
ヘッダーコンポーネントを使用していたときに同じ問題が発生しました
これで、このような他のコンポーネントでナビゲーション変数を使用できます
<TouchableOpacity onPress={() => { this.props.navigation.navigate("Play");}}>
ハッピーコディング:)
機能コンポーネントは、引数として小道具を取ります。これを試してみてください
const MyNavScreen = ({props}) =>
そして、このキーワードなしで小道具を呼び出します
onPress = {() => props.navigation.navigate('DrawerOpen')}
同じ問題が発生しました。それが私がそれを解決した方法です:
this.props.navigation.navigate
を使用して関数をバインドします:this.your_function = this.your_function.bind(this)
createStackNavigatorで画面を定義すると、デフォルトでは、ナビゲーションと呼ばれる小道具が渡されます。これは次のようなものです=> navigation={this.props.navigation}
ただし、this.props.navigation.navigator("YOUR SCREEN ")
を使用し、createStackNavigatorでこの画面を定義しなかった場合は、createStackNavigatorで定義した画面からnavigation={this.props.navigation}
を渡す必要があり、コンポーネントで使用できます。