react-native构建基本页面4---渲染电影列表

电影列表

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 
      {this.renderList()}
    
  }

  // 根据页码获取电影列表
  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 
    }
    return  i} // 解决 key 问题
      renderItem={({ item }) => this.renderItem(item)} // 调用方法,去渲染每一项
      ItemSeparatorComponent={this.renderSeparator} //渲染分割线的属性方法
      onEndReachedThreshold={0.5} // 距离底部还有多远的时候,触发加载更多的事件
      onEndReached={this.loadNextPage} // 当距离不足 0.5 的时候,触发这个方法,加载下一页数据
    />
  }

  // 渲染每项电影
  renderItem = (item) => {
    return  { Actions.moviedetail({ id: item.id }) }}>
      
        
        
          电影名称:{item.title}
          电影类型:{item.genres.join(',')}
          制作年份:{item.year}年
          豆瓣评分:{item.rating.average}分
        
      
    
  }

  // 渲染分割线
  renderSeparator = () => {
    return 
  }

  // 加载下一页
  loadNextPage = () => {
    // 如果下一页的页码值,大于总页数了,直接return
    if ((this.state.nowPage + 1) > this.state.totalPage) {
      return
    }

    this.setState({
      nowPage: this.state.nowPage + 1
    }, function () {
      this.getMoviesByPage()
    })
  }
}

电影详情

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 
      {this.renderInfo()}
    
  }

  renderInfo = () => {
    if (this.state.isloading) {
      return 
    }
    return 
      
        {this.state.movieInfo.title}

        
          
        

        {this.state.movieInfo.summary}
      
    
  }
}

你可能感兴趣的:(react-native构建基本页面4---渲染电影列表)