• 使用react-native做一个简单的应用-06商品界面的实现


    商品界面实现起来很简单,其实就是一个listview的使用:

    关于listview的使用,在官方文档里面已经介绍的很详细了。在这里我要提一个坑。

    listview在Android和iOS中的效果是不一样的,listview对iOS的支持已经很好了,但是对android很多属性都不支持。有些地方官方文档也说的模棱两可的,因此如果想做炫酷的上、下拉效果的话,建议做iOS。

    下面看一下代码吧:

      1 'use strict'
      2 
      3 var React = require('react-native')
      4 import Icon from 'react-native-vector-icons/FontAwesome'
      5 import AniImage from '../components/AniImage'
      6 import AniRoll from '../components/AniRoll'
      7 var {
      8   Image,
      9   ListView,
     10   StyleSheet,
     11   Text,
     12   View,
     13   TouchableOpacity,
     14   Navigator,
     15   PropTypes
     16 } = React
     17 
     18 var REQUEST_URL = 'http://192.168.6.5:8888/getCommidity'
     19 
     20 class Commodity extends React.Component {
     21   static propTypes = {
     22     navigator: PropTypes.object,
     23     fetch: PropTypes.func
     24   };
     25   constructor (props) {
     26     super(props)
     27     this.state = {
     28       dataSource: new ListView.DataSource({
     29         rowHasChanged: (row1, row2) => row1 !== row2
     30       }),
     31       loaded: false
     32     }
     33   }
     34   componentDidMount () {
     35     this.fetchData()
     36   }
     37 
     38   fetchData () {
     39     fetch (REQUEST_URL)
     40     .then((response) => response.json())
     41     .then((responseData) => {
     42       this.setState({
     43         dataSource: this.state.dataSource.cloneWithRows(responseData),
     44         loaded: true
     45       })
     46     })
     47     .done()
     48   }
     49 
     50   render () {
     51     if (!this.state.loaded) {
     52       return this.renderLoadingView()
     53     }
     54 
     55     return (
     56       <ListView
     57         initialListSize={3}
     58         dataSource={this.state.dataSource}
     59         renderRow={this.renderCommidity.bind(this)}
     60         style={styles.listView}/>
     61     )
     62   }
     63 
     64   renderLoadingView () {
     65     return (
     66       <View style={styles.txtContainer}>
     67        <AniRoll inputRange={[0, 1]} outputRange={['0deg', '10000deg']} style={{ 50, height: 50}} />
     68         <Text>
     69           正在加载图文。。。
     70         </Text>
     71       </View>
     72     )
     73   }
     74 
     75   renderCommidity (commidities) {
     76     return (
     77       <View style={styles.container} >
     78         <Image style={styles.viewTopImage} source={require('../assets/listbg.png')}>
     79           <TouchableOpacity onPress={this.toCommodityScreen.bind(this, commidities)}>
     80             <AniImage
     81             type={'image'}
     82             inputRange={[0, 100]}
     83             outputRange={[0, 1]}
     84             style={styles.aniImage}
     85             url={'http://192.168.6.5:8888/getImage?imgName=' + commidities.imgPath1} />
     86           </TouchableOpacity>
     87         </Image>
     88         <View style={styles.viewTxtContent}>
     89           <TouchableOpacity>
     90             <Text style={styles.txtContent}>{commidities.title}</Text>
     91           </TouchableOpacity>
     92         </View>
     93         <View style={styles.viewBottom}>
     94           <View style={styles.viewBottomLeft}>
     95             <Icon name='heart-o' size={20} />
     96             <Text style={styles.txtContent} >{commidities.love}</Text>
     97           </View>
     98           <View style={styles.viewBottomRight}>
     99             <View style={styles.viewBottomRightContainer}>
    100               <Icon name='clock-o' size={20} />
    101               <Text style={styles.txtContent} >{commidities.date}</Text>
    102             </View>
    103           </View>
    104         </View>
    105         <Image source={require('../assets/splite.png')} style={styles.imageSplit}/>
    106       </View>
    107     )
    108   }
    109 
    110   toCommodityScreen (commidities) {
    111     var commodity = commidities
    112     let navigator = this.props.navigator
    113     navigator.push({id: 'CommodityScreen', sceneConfig: Navigator.SceneConfigs.HorizontalSwipeJump, passProp: {commodity}})
    114   }
    115 }
    116 
    117 var styles = StyleSheet.create({
    118   container: {
    119     flex: 1,
    120     flexDirection: 'column',
    121     backgroundColor: '#ffffff'
    122   },
    123   txtContainer: {
    124     flex: 1,
    125     alignItems: 'center',
    126     justifyContent: 'center',
    127     backgroundColor: '#fffff'
    128   },
    129   aniImage: {
    130     height: 330,
    131      null
    132   },
    133   viewTopImage: {
    134     height: 330,
    135      null,
    136     margin: 10
    137   },
    138   txtContent: {
    139     fontSize: 16,
    140     marginLeft: 5
    141   },
    142   viewTxtContent: {
    143     marginLeft: 10,
    144     marginRight: 10,
    145     marginBottom: 5,
    146     flex: 1
    147   },
    148   txtBottom: {
    149     flex: 1,
    150     fontSize: 12
    151   },
    152   viewBottom: {
    153     marginLeft: 10,
    154     marginRight: 10,
    155     marginBottom: 5,
    156     flex: 1,
    157     flexDirection: 'row'
    158   },
    159   imageSplit: {
    160     flex: 0.3,
    161     backgroundColor: '#F0F0F0'
    162   },
    163   numberText: {
    164     fontSize: 15,
    165     marginLeft: 20
    166   },
    167   viewBottomLeft: {
    168     flex: 1,
    169     flexDirection: 'row'
    170   },
    171   viewBottomRight: {
    172     flex: 1,
    173     alignItems: 'flex-end'
    174   },
    175   viewBottomRightContainer: {
    176     flex: 1,
    177     flexDirection: 'row'
    178   }
    179 })
    180 
    181 module.exports = Commodity

    一、构造方法:

    1  constructor (props) {
    2     super(props)
    3     this.state = {
    4       dataSource: new ListView.DataSource({
    5         rowHasChanged: (row1, row2) => row1 !== row2
    6       }),
    7       loaded: false
    8     }
    9   }

    dataSource就是listview的数据源,loaded则是判断数据是否加载完毕。

    二、fetchData方法

    获取listview的接口数据,数据请求完成之后,重新渲染界面将loaded设置为true

    三、toCommodityScreen方法

    进入商品的详情界面。

  • 相关阅读:
    php提示undefined index的几种解决方法
    划分树(poj2104)
    ACM-ICPC 2018 南京赛区网络预赛B
    AC Challenge(状压dp)
    UVALive5966(bfs)
    UVALive
    STL next_permutation 算法原理和实现
    凸包算法
    poj1873(枚举+凸包)
    CodeForces
  • 原文地址:https://www.cnblogs.com/weifengzz/p/5178531.html
Copyright © 2020-2023  润新知