電影列表react
import React, { Component } from 'react' import { View, Image, Text, ActivityIndicator, FlatList, StyleSheet, TouchableHighlight } from 'react-native' const styles = StyleSheet.create({ movieTitle: { fontWeight: 'bold' } }) // 導入路由的組件 import { Actions } from 'react-native-router-flux' export default class MovieList extends Component { constructor(props) { super(props) this.state = { movies: [], // 電影列表 nowPage: 1, // 當前的頁碼 totalPage: 0, // 總頁數 pageSize: 15, // 每頁顯示的記錄條數 isloading: true // 是否正在加載數據 } } componentWillMount() { this.getMoviesByPage() } render() { return <View> {this.renderList()} </View> } // 根據頁碼獲取電影列表 getMoviesByPage = () => { const start = (this.state.nowPage - 1) * this.state.pageSize const url = `https://api.douban.com/v2/movie/in_theaters?start=${start}&count=${this.state.pageSize}` fetch(url) .then(res => res.json()) .then(data => { this.setState({ isloading: false, movies: this.state.movies.concat(data.subjects), totalPage: Math.ceil(data.total / this.state.pageSize) }) }) /* setTimeout(() => { this.setState({ isloading: false, movies: require('./test_list.json').subjects, totalPage: 1 }) }, 1000) */ } // 渲染電影列表的方法 renderList = () => { if (this.state.isloading) { return <ActivityIndicator size="large"></ActivityIndicator> } return <FlatList data={this.state.movies} keyExtractor={(item, i) => i} // 解決 key 問題 renderItem={({ item }) => this.renderItem(item)} // 調用方法,去渲染每一項 ItemSeparatorComponent={this.renderSeparator} //渲染分割線的屬性方法 onEndReachedThreshold={0.5} // 距離底部還有多遠的時候,觸發加載更多的事件 onEndReached={this.loadNextPage} // 當距離不足 0.5 的時候,觸發這個方法,加載下一頁數據 /> } // 渲染每項電影 renderItem = (item) => { return <TouchableHighlight underlayColor="#fff" onPress={() => { Actions.moviedetail({ id: item.id }) }}> <View style={{ flexDirection: 'row', padding: 10 }}> <Image source={{ uri: item.images.small }} style={{ width: 100, height: 140, marginRight: 10 }}></Image> <View style={{ justifyContent: 'space-around' }}> <Text><Text style={styles.movieTitle}>電影名稱:</Text>{item.title}</Text> <Text><Text style={styles.movieTitle}>電影類型:</Text>{item.genres.join(',')}</Text> <Text><Text style={styles.movieTitle}>製做年份:</Text>{item.year}年</Text> <Text><Text style={styles.movieTitle}>豆瓣評分:</Text>{item.rating.average}分</Text> </View> </View> </TouchableHighlight> } // 渲染分割線 renderSeparator = () => { return <View style={{ borderTopColor: '#ccc', borderTopWidth: 1, marginLeft: 10, marginRight: 10 }}></View> } // 加載下一頁 loadNextPage = () => { // 若是下一頁的頁碼值,大於總頁數了,直接return if ((this.state.nowPage + 1) > this.state.totalPage) { return } this.setState({ nowPage: this.state.nowPage + 1 }, function () { this.getMoviesByPage() }) } }
電影詳情json
import React, { Component } from 'react' import { View, Image, Text, ActivityIndicator, ScrollView } from 'react-native' export default class MovieDetail extends Component { constructor(props) { super(props) this.state = { movieInfo: {}, // 電影信息 isloading: true } } componentWillMount() { fetch('https://api.douban.com/v2/movie/subject/' + this.props.id) .then(res => res.json()) .then(data => { this.setState({ movieInfo: data, isloading: false }) }) } render() { return <View> {this.renderInfo()} </View> } renderInfo = () => { if (this.state.isloading) { return <ActivityIndicator size="large"></ActivityIndicator> } return <ScrollView> <View style={{ padding: 4 }}> <Text style={{ fontSize: 25, textAlign: 'center', marginTop: 20, marginBottom: 20 }}>{this.state.movieInfo.title}</Text> <View style={{ alignItems: 'center' }}> <Image source={{ uri: this.state.movieInfo.images.large }} style={{ width: 200, height: 280 }}></Image> </View> <Text style={{ lineHeight: 30, marginTop: 20 }}>{this.state.movieInfo.summary}</Text> </View> </ScrollView> } }