App.js:
import React, { Component } from 'react';
import {View,Text} from 'react-native';
import { createDrawerNavigator } from 'react-navigation-drawer';
import {createAppContainer} from 'react-navigation';
import Epics from './screens/tmp';
import Pager from './screens/Pager';
const DrawerNavigator = createDrawerNavigator({
Home: {screen: Epics},
Page: {screen: Pager}
},{initialRouteName: 'Home'});
const Stack = createAppContainer(DrawerNavigator);
export default class App extends Component {
render() {
return <Stack />;
}
}
カスタムコンポーネントを介して画面に移動しようとしています:
import { ActivityIndicator, Image, StyleSheet, View, TouchableHighlight } from 'react-native';
import PropTypes from 'prop-types';
import React from 'react';
import { useNavigation } from 'react-navigation-hooks';
import AuthorRow from './AuthorRow';
export default class Card extends React.Component {
static propTypes = {
fullname: PropTypes.string.isRequired,
image: Image.propTypes.source.isRequired,
linkText: PropTypes.string.isRequired,
onPressLinkText: PropTypes.func.isRequired,
epicId: PropTypes.string.isRequired,
};
state = {
loading: true,
};
getNav(){
return useNavigation();
}
handleLoad = () => {
this.setState({ loading: false });
};
render() {
const { fullname, image, linkText, onPressLinkText, epicId, prop } = this.props;
const { loading } = this.state;
return (
<View>
<AuthorRow
fullname={fullname}
linkText={linkText}
onPressLinkText={onPressLinkText}
/>
<TouchableHighlight onPress={() => this.getNav().navigate('Pager')} underlayColor="white">
<View style={styles.image}>
{loading && (
<ActivityIndicator style={StyleSheet.absoluteFill} size={'large'} />
)}
<Image
style={StyleSheet.absoluteFill}
source={image}
onLoad={this.handleLoad}
/>
</View>
</TouchableHighlight>
</View>
);
}
}
const styles = StyleSheet.create({
image: {
aspectRatio: 1,
backgroundColor: 'rgba(0,0,0,0.02)',
},
});
上記のコードから、次を使用してナビゲートしようとします:
import {useNavigation} from 'react-navigation-hooks';
getNav(){return useNavigation(); }
this.getNav()。navigate( 'Pager')
不変の違反:無効なフック呼び出しです。フックは関数コンポーネントの本体の内部でのみ呼び出すことができます。
「useNavigation()」を使用してナビゲートする方法、またはコンポーネントで「this.props.navigation」参照を取得するにはどうすればよいですか? (私はReactネイティブです。理解するのを手伝ってください)
ここにあなたの間違いがあります
間違い
onPress = {()=> this.getNav()。navigate( 'Pager')
と置換する
onPress = {()=> this.props.navigation.navigate( 'Pager')
ここに例があります
https://reactnavigation.org/docs/navigating/
別のコード例
class FirstScreen extends React.Component {
static navigationOptions = {
title: 'First',
}
componentDidMount(){
const {navigate} = this.props.navigation;
navigate('Second');
fetch('http://apiserver').then( (response) => {
navigate('Second');
});
}
render() {
return (
<AppLogo />
);
}
}
const AppNavigator = StackNavigator({
First: {
screen: FirstScreen,
},
Second: {
screen: SecondScreen,
},
});
@sayogあなたはフック兄弟のルールを破っています。これやってみませんか?
const [loading, setLoading] = useState(false); const navigation = useNavigation();
必ず入れてください後状態宣言
注:フックにクラスコンポーネントを使用しないでください。フックに機能コンポーネントを使用する