J'essaie d'utiliser React-Navigation mais je n'arrive pas à le faire fonctionner lorsque je déplace les composants de chaque écran dans plusieurs fichiers. J'obtiens toujours cette erreur: "Le composant de la route 'Home' doit être un composant React". Cette erreur ne se produit pas si je déplace tout le code dans un fichier, donc je ' Je ne sais pas quelle est la différence.
Voici mon App.js:
import React from 'react';
import { StackNavigator } from 'react-navigation';
import { AppRegistry, StyleSheet, Text, View, TouchableHighlight } from 'react-native';
import { HomeScreen } from './screens/HomeScreen';
import { JoinScreen from './screens/JoinScreen';
import { HostScreen } from './screens/HostScreen';
const Root = StackNavigator(
{
Home: {
screen: HomeScreen,
},
Details: {
screen: JoinScreen,
}
},
{
initialRouteName: 'Home',
headerMode: 'none',
}
);
export default class App extends React.Component {
render() {
return (
<Root />
)
}
}
Et voici mes .screens/HomeScreen.js
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
export default class HomeScreen extends React.Component {
render() {
const { navigate } = this.props.navigation;
return (
<View style={styles.container}>
<Text style={styles.title}>Hello World</Text>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'space-around',
}
});
Je pense que si vous changez cette ligne:
import { HomeScreen } from './screens/HomeScreen';
à:
import HomeScreen from './screens/HomeScreen';
(c'est-à-dire en supprimant les accolades autour de HomeScreen
), cela fonctionnera. Parce que vous avez utilisé export default
dans le fichier source du composant HomeScreen
, vous n'avez pas besoin de destructuring sur le import
. Cela tente d'accéder à une variable appelée HomeScreen
sur le composant, qui se résout en undefined
et provoque l'erreur que vous avez vue.
Vous pouvez également supprimer le default
de export default
et conservez le import
le même. Personnellement, je préfère supprimer les accolades car le code semble plus propre.
Il y a aussi une accolade de fermeture manquante sur cette ligne:
import { JoinScreen from './screens/JoinScreen';
Mais j'ai supposé que c'était une faute de frappe;)
Je pense que réagir a un problème pour savoir quoi importer
Puisque vous exportez une chose par défaut, vous devez remplacer
importer {HomeScreen} à partir de './screens/HomeScreen';
importer HomeScreen depuis './screens/HomeScreen';
Gardez les accolades intactes pour vos importations de fichiers d'écran externes. Faites simplement ce qui suit et il devrait fonctionner sur les deux Android et simulateurs iOS indépendamment
// HomeScreen.js
... all imports
export class HomeScreen extends React.Component {
...
Cela a résolu le problème pour moi sur les deux plates-formes.
Ajoutez ceci à votre fichier js en bas ajoutez cette ligne
export default MainActivity;
import React, { Component } from 'react';
import { createStackNavigator } from 'react-navigation-stack';
class MainActivity extends Component{
...
}
export default MainActivity;
Cela se produit également si vous n'exportez pas votre classe.
export default class HomeScreen extends React.Component {
render() {
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Home Screen</Text>
<Button
title="Go to Details"
onPress={() => this.props.navigation.navigate('Details')}
/>
</View>
);
}
}