S'il vous plaît, regardez le débogueur et l'écran pour ce qui pourrait être un problème. Cependant, le code est fortement affiché ci-dessous pour votre lecture. De plus, je visais à naviguer vers une autre page en fonction de l'identifiant du contenu sélectionné.
App.js
Le App.js est l'endroit où j'ai défini mon stackNavigator
import React, { Component } from 'react'; import { StyleSheet, View, Text } from 'react-native'; import axios from 'axios'; export default class Post extends Component{ constructor(props){ super(props); } render(){ return ( <View> <Text>My text</Text> </View> ); } } const styles = StyleSheet.create({ });
Post.js
J'ai essayé de supprimer alignItem = center. En fait, j'ai supprimé mon style pour voir s'il y a un blocage de l'écran.
import React, { Component } from 'react'; import { ScrollView, StyleSheet, View, Text, InputText, TouchableOpacity } from 'react-native'; import axios from 'axios'; export default class Post extends Component{ constructor(props){ super(props); this.state = { posts: [] } } readMore = () => { ()=> this.props.navigation.navigate('PostSingleScreen'); debugger; } componentDidMount(){ axios.get(`http://localhost/rest_api_myblog/api/post/read.php`) //.then(json => console.log(json.data.data[0].id)) .then(json => json.data.data.map(mydata =>( { title: mydata.title, body: mydata.body, author: mydata.author, category_name: mydata.category_name, id: mydata.id } ))) //.then(newData => console.log(newData)) .then(newData => this.setState({posts: newData})) .catch(error => alert(error)) } render(){ return ( <View> <ScrollView style={styles.scrollContent}> <View style={styles.header}> <Text style={styles.headerText}>Gist Monger</Text> </View> { this.state.posts.map((post, index) =>( <View key={index} style={styles.container}> <Text style={styles.display}> Author: {post.author} </Text> <Text style={styles.display}> Category: {post.category_name} </Text> <Text style={styles.display}> Title: {post.title} </Text> <Text style={{overflow:'hidden'}}> Id: {post.id} </Text> <TouchableOpacity style={styles.buttonContainer} onPress = {() => this.readMore()} > <Text style={styles.buttonText}> Read More </Text> </TouchableOpacity> </View> )) } </ScrollView> <View style={styles.footer}></View> </View> ); } } const styles = StyleSheet.create({ header: { flex: 1, height:40, marginTop:50, marginBottom:10, flexDirection: 'row', justifyContent:'center', }, display: { margin: 3, fontSize: 16 }, headerText: { fontWeight: 'bold', fontSize: 40, color: '#6200EE' }, container: { backgroundColor:'#efefef', padding: 20, margin: 5, borderRadius:20, justifyContent: 'center', alignItems: 'center' }, footer: { flex: 1, backgroundColor:'#000', marginBottom:50 }, buttonContainer:{ height: 30, width: 200, marginTop: 15, justifyContent: 'center', alignItems: 'center', borderRadius: 15, backgroundColor:'#6200EE' }, buttonText: { alignContent: 'center', color: 'white' } });
PostSingle.js
import React, {Component} from 'react'; import { StyleSheet, Text, View} from 'react-native'; import Post from './components/Post'; import PostSingle from './components/PostSingle'; import { createStackNavigator, createAppContainer } from 'react-navigation'; const RootStack = createStackNavigator( { PostScreen: { screen: Post}, PostSingleScreen:{screen: PostSingle}, }, { initialRouteName: "PostScreen" } ); const AppNavigator = createAppContainer(RootStack); export default class App extends Component { constructor(props) { super(props); }; render() { return ( <View style={styles.container}> <AppNavigator/> </View> ); } } const styles = StyleSheet.create({ container: { backgroundColor: '#F3F3F3', } });
3 Réponses :
Je n'ai pas testé ce code, mais j'ai essayé d'ajouter flex: 1
à votre style de conteneur. les conteneurs / composants principaux ne s'étirent pas si vous ne leur dites pas de
this.props.navigation.navigate('PostSingleScreen', { params })
également, pour vérifier si les composants sont rendus (aide à déboguer où se trouve le problème), écrivez un journal de console componentDidMount
de chaque composant. s'ils montent, mais que rien n'est visible, c'est probablement un problème CSS. Si ce n'était pas le cas, cela générerait des erreurs au lieu d'un écran vide.
Le deuxième problème est que lorsque vous naviguez, vous devez avoir des paramètres avec react-navigation. la syntaxe est la suivante:
const styles = StyleSheet.create({ container: { backgroundColor: '#F3F3F3', flex: 1, } });
donc, si vous avez {id: someId} dans vos paramètres, dans le composant vers lequel vous avez navigué, vous aurez { this.props.navigation.state.params.id}
. donc fondamentalement, ces paramètres sont à l'intérieur de navigation.state.params
où vous naviguez
laissez-moi essayer et vous en parler. Merci
Cela fonctionne comme un charme ... S'il vous plaît, il y a deux questions que j'ai posées. J'ai un problème pour obtenir l'ID de l'élément sur lequel j'ai cliqué pour récupérer le contenu d'un seul article sur une page différente. C'est pourquoi j'ai utilisé la navigation
@ Payne Je modifierai ma réponse et rédigerai également la solution à votre deuxième problème. seconde
Merci beaucoup. Je suis assez nouveau pour javascript et je réagis nativement. Y a-t-il un bon tutoriel à lire
Je n'ai pas l'air de comprendre. Regardez mon Post.js. J'ai l'id = post.id mais je ne peux pas utiliser dans readMore () et plus encore, si this.props.navigation.state.params.id est ce que j'obtiens sur la nouvelle page, comment l'aurais-je utilisé obtenir quelque chose comme localhost / rest_api_myblog / api / post / read_single.php? id = 1
Merde, ça ne m'a pas informé que tu avais posté le style ... j'allais dire la même chose: "U ... salut. J'étais en retard
@ Payne dans Post.js, vous avez une navigation en savoir plus. là, vous devez passer l'ID en tant que paramètre comme j'ai écrit, et vous pouvez l'utiliser dans readMore. votre identifiant de publication est dans l'état tel que this.state.id
Je suggérerais d'utiliser flaltist pour cela, et non this.state.map. cela devrait vous donner le même résultat
readMore(id){ //do whatever you want with the id this.props.navigation.navigate('PostSingleScreen',{id:id}); //or pass it as a prop debugger; } renderItem = ({ item, index }) => { return ( <View key={index} style={styles.container}> <Text style={styles.display}> Author: {item.author} </Text> <Text style={styles.display}> Category: {item.category_name} </Text> <Text style={styles.display}> Title: {item.title} </Text> <Text style={{overflow:'hidden'}}> Id: {item.id} </Text> <TouchableOpacity style={styles.buttonContainer} onPress = {() => this.readMore(item.id)} > <Text style={styles.buttonText}> Read More </Text> </TouchableOpacity> </View> ); }; render(){ return ( <View style={{flex:1}}> <FlatList style={{flex:1}} data={this.state.posts} renderItem={this.renderItem} numColumns={1} keyExtractor={(item, index) => item.id} //this needs to be a unique id ListHeaderComponent = { <View style={styles.header}> <Text style={styles.headerText}>Gist Monger</Text> </View>} /> <View style={styles.footer}/> </View> ); }
Comment le transmettre à localhost / rest_api_myblog / api / post / read_single.php? Id = 1 au lieu d'un puis {id: id}
Vous pouvez créer une chaîne et l'utiliser là-bas
À l'intérieur de la fonction readmore, ajoutez var p = "localhost / rest_api_myblog / api / post / read_single.php? Id =" + id
et vous devriez avoir la sortie attendue, faites ce que vous voulez avec ce lien, vous pouvez même naviguer avec
Permettez-moi de vous aider avec votre deuxième question. Tout d'abord, c'est plus facile comme dit en spécifiant simplement des paramètres dans votre navigation. Par exemple,
import React, { Component } from 'react'; import { StyleSheet, View, Text, Button } from 'react-native'; import axios from 'axios'; class PostSingle extends Component{ constructor(props){ super(props); this.state = { posts: [] } } componentDidMount() { const id = this.props.navigation.state.params.id; axios.get(`http://localhost/rest_api_myblog/api/post/read_single.php?id=${id}`) .then(json => json.data) .then(newData => this.setState({posts: newData})) .catch(error => alert(error)) } render(){ return ( <View style={styles.container}> <Text style={styles.display}> {this.state.posts.title} </Text> <Text style={styles.display}> {this.state.posts.author} </Text> <Text style={styles.display}> {this.state.posts.category_name} </Text> <Text style={styles.display}> {this.state.posts.body} </Text> </View> ); } }
Cependant, dans votre TouchableOpacity, méthode onPress ie onPress = {() => this.readMore (post.id)}
Dans votre PostSingle. js
readMore = (id) => { this.props.navigation.navigate('PostSingleScreen', {id:id}) }
J'espère que cela aide
Wow, c'est exactement ce dont j'avais besoin. Merci beaucoup
veuillez poster le code styles.container