4

Je suis nouveau dans react-native. J'ai vu un exemple dans https://facebook.github.io/react-native/docs/sample-application-movies.html. Il construit une application de films qui va chercher des films et les afficher dans un ListView. Comment pouvons-nous sélectionner une ligne pour obtenir ses données de détail et l'afficher dans une autre vue? S'il vous plaît aider. merci :)Sélectionnez une ligne dans ListView reac-native pour obtenir des détails

Voici ce que je l'ai fait jusqu'à présent:

/** 
 
* Sample React Native App 
 
* https://github.com/facebook/react-native 
 
*/ 
 

 
import React, { 
 
    Component, 
 
} from 'react'; 
 
import { 
 
    AppRegistry, 
 
    Image, 
 
    ListView, 
 
    StyleSheet, 
 
    Text, 
 
    View, 
 
    Navigator, 
 
    TouchableOpacity, 
 
} from 'react-native'; 
 

 
var REQUEST_URL = 'https://raw.githubusercontent.com/facebook/react-native/master/docs/MoviesExample.json'; 
 

 
var SCREEN_WIDTH = require('Dimensions').get('window').width; 
 
var BaseConfig = Navigator.SceneConfigs.FloatFromRight; 
 

 
var CustomLeftToRightGesture = Object.assign({}, BaseConfig.gestures.pop, { 
 

 
    snapVelocity: 8, 
 
    edgeHitWidth: SCREEN_WIDTH, 
 
}); 
 

 
var CustomSceneConfig = Object.assign({}, BaseConfig, { 
 
    springTension: 100, 
 
    springFriction: 1, 
 
    gestures: { 
 
    pop: CustomLeftToRightGesture, 
 
    } 
 
}); 
 

 
var PageOne = React.createClass({ 
 
    getInitialState:function(){ 
 
    return{ 
 
     dataSource: new ListView.DataSource({ 
 
     rowHasChanged: (row1, row2) => row1 !== row2, 
 
     }), 
 
     loaded: false, 
 
    } 
 
    }, 
 

 
    componentDidMount() { 
 
    this.fetchData(); 
 
    }, 
 

 
    fetchData() { 
 
    fetch(REQUEST_URL) 
 
     .then((response) => response.json()) 
 
     .then((responseData) => { 
 
     this.setState({ 
 
      dataSource: this.state.dataSource.cloneWithRows(responseData.movies), 
 
      loaded: true, 
 
     }); 
 
     }) 
 
     .done(); 
 
    }, 
 

 
    render() { 
 
    if (!this.state.loaded) { 
 
     return this.renderLoadingView(); 
 
    } 
 

 
    return (
 
     <ListView 
 
     dataSource={this.state.dataSource} 
 
     renderRow={this.renderMovie} 
 
     style={styles.listView} 
 
     /> 
 
    ); 
 
    }, 
 

 
    renderLoadingView() { 
 
    return (
 
     <View style={styles.container}> 
 
     <Text> 
 
      Loading movies... 
 
     </Text> 
 
     </View> 
 
    ); 
 
    }, 
 

 
    renderMovie(movie) { 
 
    title1 = movie.title; 
 
    year1 = movie.year; 
 

 
    return (
 
    <TouchableOpacity onPress={this._handlePressList}> 
 
     <View style={styles.container}> 
 
     <Image 
 
      source={{uri: movie.posters.thumbnail}} 
 
      style={styles.thumbnail} 
 
     /> 
 
     <View style={styles.rightContainer}> 
 
      <Text style={styles.title}>{movie.title}</Text> 
 
      <Text style={styles.year}>{movie.year}</Text> 
 
     </View> 
 
     </View> 
 
    </TouchableOpacity> 
 
    ); 
 
    }, 
 

 
    _handlePressList(){ 
 
    this.props.navigator.push({id: 2, title1, year1}); 
 
    }, 
 
}); 
 

 
var PageTwo = React.createClass({ 
 
    render(){ 
 
    return(
 
     <View style={styles.rightContainer}> 
 
      <Text style={styles.title}>{title1}</Text> 
 
      <Text style={styles.year}>{year1}</Text> 
 
     </View> 
 
    ) 
 
    } 
 
}) 
 
class SampleAppMovies extends Component{ 
 
    _renderScene(route, navigator) { 
 
    if (route.id === 1) { 
 
     return <PageOne navigator={navigator} /> 
 
    } else if (route.id === 2) { 
 
     return <PageTwo navigator={navigator} /> 
 
    } 
 
    } 
 

 
    _configureScene(route) { 
 
    return CustomSceneConfig; 
 
    } 
 

 
    render() { 
 
    return (
 
     <Navigator 
 
     initialRoute={{id: 1, }} 
 
     renderScene={this._renderScene} 
 
     configureScene={this._configureScene} /> 
 
    ); 
 
    } 
 
} 
 

 
var styles = StyleSheet.create({ 
 
    container: { 
 
    flex: 1, 
 
    flexDirection: 'row', 
 
    justifyContent: 'center', 
 
    alignItems: 'center', 
 
    backgroundColor: '#F5FCFF', 
 
    }, 
 
    rightContainer: { 
 
    flex: 1, 
 
    }, 
 
    title: { 
 
    fontSize: 20, 
 
    marginBottom: 8, 
 
    textAlign: 'center', 
 
    }, 
 
    year: { 
 
    textAlign: 'center', 
 
    }, 
 
    thumbnail: { 
 
    width: 53, 
 
    height: 81, 
 
    }, 
 
    listView: { 
 
    paddingTop: 20, 
 
    backgroundColor: '#F5FCFF', 
 
    }, 
 
}); 
 

 
module.exports = SampleAppMovies;

+0

Partager ce que vous avez essayé jusqu'à présent –

+0

Edité et partagiez. – sptra

Répondre

3

Dans votre méthode renderRow (dans votre cas renderMovie), il suffit de passer le film dans onPress prop de TouchableOpacity, quelque chose comme ceci:

renderMovie(movie) { 
    title1 = movie.title; 
    year1 = movie.year; 

    return (
    <TouchableOpacity onPress={() => _handlePressList(movie)}> // SEE HERE!! 
     <View style={styles.container}> 
     <Image 
      source={{uri: movie.posters.thumbnail}} 
      style={styles.thumbnail} 
     /> 
     <View style={styles.rightContainer}> 
      <Text style={styles.title}>{movie.title}</Text> 
      <Text style={styles.year}>{movie.year}</Text> 
     </View> 
     </View> 
    </TouchableOpacity> 
    ); 
    }, 

_handlePressList(movie){ 
    this.props.navigator.push({id: 2, movie.title1, movie.year1}); 
    }, 

Ensuite, vous pouvez faire ce que vous voulez avec le movie.

J'espère que c'est utile.

+0

que devrais-je changer dans la méthode '_handlePressList() {...}'? Je l'ai changé en '_handlePressList (film) {....}' et j'essaie d'obtenir movie.title. Quand je l'exécute, il me montre "ne peut pas trouver la variable: _handlePressList" – sptra

+0

@sptra me voir éditer, mais, vous devez changer l'implémentation originale du 'renderRow' à la fonction de flèche pour le faire lier pour vous – gran33

+0

résolu! J'utilise '' Merci beaucoup @ gran33 – sptra

0
renderMovie(movie) { 
title1 = movie.title; 
year1 = movie.year; 

return (
<TouchableOpacity onPress={this._handlePressList.bind(this, movie)} 
    <View style={styles.container}> 
    <Image 
     source={{uri: movie.posters.thumbnail}} 
     style={styles.thumbnail} 
    /> 
    <View style={styles.rightContainer}> 
     <Text style={styles.title}>{movie.title}</Text> 
     <Text style={styles.year}>{movie.year}</Text> 
    </View> 
    </View> 
</TouchableOpacity> 
); 
}, 

_handlePressList(movie){ 
this.props.navigator.push({id: 2, movie.title1, movie.year1}); 
}, 

Cela permettra de résoudre le problème