4

Я новичок в реакции-native. Я видел пример в https://facebook.github.io/react-native/docs/sample-application-movies.html. Он создает приложение для видео, которое извлекает фильмы и отображает их в ListView. Как мы можем выбрать строку, чтобы получить подробные данные и отобразить ее в другом представлении? Пожалуйста помоги. спасибо :)Выберите строку в ListView, чтобы получить детальную информацию.

Вот что я сделал до сих пор:

/** 
 
* 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

Share, что вы пробовали до сих пор –

+0

редактировать и совместно. – sptra

ответ

3

В вашем методе renderRow (в вашем случае renderMovie), просто передать фильм в onPress подпорки TouchableOpacity, что-то вроде этого:

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}); 
    }, 

Тогда вы можете делать все, что хотите, с помощью movie.

Надеюсь, это полезно.

+0

Что я должен изменить в методе '_handlePressList() {...}'? Я изменил его на '_handlePressList (фильм) {....}' и попытался получить movie.title. Когда я запускаю его, он показывает мне «не могу найти переменную: _handlePressList» – sptra

+0

@sptra см. Меня редактировать, но вам нужно изменить исходную реализацию функции «renderRow» на стрелку, чтобы она связывалась для u – gran33

+0

решена! Я использую '' Большое спасибо @ 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}); 
}, 

Это позволит решить проблему