《React Native移动开发实战》一一3.4 完善商品列表——ListView组件

3.4 完善商品列表——ListView组件
在完善了搜索框和轮播广告之后,对电商应用的首页的改造已经初见成效。最后,我们要让商品列表的内容也变得更加丰富。
3.4.1 对图片资源进行重构
添加商品图片到ch04项目中,相对ch04根目录的文件路径为./product-image-01.jpg。此时,如果不断地添加图片文件的话,根目录的结构会变得越来越“糟糕”,如图3.16所示。
这时需要对图片资源进行一次重构,将所有图片放至专门的image文件夹中。重构之后,ch04项目的文件结构如图3.17所示。

![image](https://yqfile.alicdn.com/b3db345cf037e9be19fac908c451a0294c07fb1a.png)

图3.16  根目录文件越来越多的ch04项目    图3.17  重构图片资源后的ch04项目结构

由于图片文件的路径发生了变更,所以还需要修改引用图片的代码如下:

01 export default class app extends Component {
02 constructor(props) {
03 super(props);
04 this.state = {
05 advertisements: [
06 {
07 image: require('./images/advertisement-image-

                     01.jpg')

08 }, {
09 image: require('./images/advertisement-image-

                    02.jpg')

10 }, {
11 image: require('./images/advertisement-image-

                    03.jpg')

12 }
13 ],
14 };
15 }
16
17 // 这里省略了没有修改的代码
18 }
3.4.2 重新定义商品模型
在添加好商品图片之后,第一步就是要修改和重新定义商品模型,修改app.js代码如下。
?提示:在实际开发中,一般都是先定义数据模型,然后再考虑具体功能的实现。
01 const ds = new ListView.DataSource({ // 创建ListView.DataSource数据源
02 rowHasChanged: (r1, r2) => r1 !== r2
03 });
04
05 export default class app extends Component {
06 constructor(props) {
07 super(props);
08 this.state = {
09 dataSource: ds.cloneWithRows([ // 为数据源传递一个数组
10 {
11 image: require('./images/advertisement-image-01.jpg'),
12 title: '商品1',
13 subTitle: '描述1'
14 }, {
15 image: require('./images/advertisement-image-01.jpg'),
16 title: '商品2',
17 subTitle: '描述2'
18 }, {
19 // 这里省略了重复的代码
20 }, {
21 image: require('./images/advertisement-image-01.jpg'),
22 title: '商品10',
23 subTitle: '描述10'
24 }
25 ],
26 };
27 }
28
29 // 这里省略了没有修改的代码
30 }

然后,在ListView组件的_renderRow()函数中添加Image组件,修改app.js代码如下:

01 export default class app extends Component {
02 // 这里省略了没有修改的代码
03
04 _renderRow = (rowData, sectionID, rowID) => {
05 return (
06 Alert.alert('你单击了商

              品列表', null, null)}>

07
08 09 style={styles.productImage}>
10
11 {rowData.title}

                      </Text>

12 {rowData.subTitle}

                      </Text>

13
14
15 );
16 }
17 }
18
19 const styles = StyleSheet.create({
20 // 这里省略了没有修改的代码
21 row: {
22 height: 60,
23 flexDirection: 'row',
24 alignItems: 'center'
25 },
26 productImage: {
27 marginLeft: 10,
28 width: 40,
29 height: 40
30 },
31 productText: {}, // 这里暂时未用到,且未设置样式
32 productTitle: {}, // 这里暂未设置样式
33 productSubTitle: {} // 这里暂未设置样式
34 });

此时,商品列表的运行效果如图3.18所示。

图3.18 添加了图片和描述的商品列表
3.4.3 商品布局的优化
列表的雏形实现之后,就可以在此基础上做一些样式和布局上的优化了。优化的目标效果如图3.19所示。

按照上述结构,修改组件代码如下:

01 export default class app extends Component {
02 // 这里省略了没有修改的代码
03
04 _renderRow = (rowData, sectionID, rowID) => {
05 return (
06 Alert.alert('你单击了商

              品列表', null, null)}>

07
08 09 style={styles.productImage}>
10
11 // flexDirection

                      默认为"column"

12 {rowData.title}

                          </Text>

13
14 {rowData.subTitle}
15
16
17
18
19 );
20 }
21
22 // 这里省略了没有修改的代码
23 }

此时,应用的运行效果如图3.20所示。

图3.20 优化后的商品列表
完成了列表的基本布局之后,接着优化样式。修改app.js代码如下。
?提示:在实际开发中,先搭好架子再优化细节是一个良好且高效的开发习惯。
01 const styles = StyleSheet.create({
02 // 这里省略了没有修改的代码
03 row: {
04 height: 60,
05 flexDirection: 'row',
06 backgroundColor: 'white'
07 },
08 productImage: {
09 width: 40,
10 height: 40,
11 marginLeft: 10,
12 marginRight: 10,
13 alignSelf: 'center'
14 },
15 productText: {
16 flex: 1,
17 marginTop: 10,
18 marginBottom: 10
19 },
20 productTitle: {
21 flex: 3,
22 fontSize: 16
23 },
24 productSubTitle: {
25 flex: 2,
26 fontSize: 14,
27 color: 'gray'
28 }
29 });

优化列表样式和布局后的效果如图3.21所示。

图3.21 优化样式和布局后的商品列表
最后,为列表添加分割线。幸运的是,ListView组件已经为开发者提供了方法,即renderSeparator()函数,所以只要实现该函数即可。修改app.js代码如下:

01 export default class app extends Component {
02 // 这里省略了没有修改的代码
03
04 render() {
05 // 这里省略了没有修改的代码
06
06 return (
07
08 // 这里省略了没有修改的代码
09
10 11 renderRow={this._renderRow}
12 renderSeparator={this._renderSeperator}/>

                         // 渲染分割线

13
14
15 );
16 }
17
18 // 这里省略了没有修改的代码
19
20 _renderSeperator(sectionID, rowID, adjacentRowHighlighted) {
21 return (
22 ${sectionID}-${rowID}} style={styles.divider}>

             </View>

23 );
24 }
25 }
26
27 const styles = StyleSheet.create({
28 // 这里省略了没有修改的代码
29 divider: {
30 height: 1,
31 width: Dimensions.get('window').width - 5,
32 marginLeft: 5,
33 backgroundColor: 'lightgray'
34 },
35 // 这里省略了没有修改的代码
36 }

重新加载应用,添加分割线的商品列表效果如图3.22所示。

图3.22 添加分割线的商品列表
至此,电商App的首页已经焕然一新。

时间: 2024-10-03 17:06:01

《React Native移动开发实战》一一3.4 完善商品列表——ListView组件的相关文章

《React Native移动开发实战》一一导读

前言 随着手机和移动互联网技术的日益成熟,移动应用的领域也从如何开发,发展到如何更高效.更低成本地开发.传统的原生平台(iOS.Android)开发技术虽然比较成熟,但由于开发效率和成本的限制,已经越来越无法满足移动互联网应用的开发需求. 所以,具有简单.迅速.跨平台的优势,而且基于Web开发语言和布局技术的React Native得以迅速流行,并一举夺得跨平台开发技术的头筹. 目前市场上大多数React Native书籍主要以翻译和讲解官方文档为主,并未从开发实际应用出发,通过典型案例来指导读

《React Native移动开发实战》出版啦

对不起,我来晚了 首先要感谢支持和关注我的朋友,感谢人邮的赵老师,还有公司的领导和同事,他们在我写作的过程中给了很多有用的信息,也给了很多有用的建议,为本书的写作提供了很大帮助.感谢,再次感谢!!! 工作6年多以来,一直想写一本自己的书,一方面是对自己工作经历的一个总结,也是对希望写一本书给曾经的自己一个交代,毕竟30岁的人了,搞不了几年的技术了. 我一直有写博客的习惯,喜欢将自己工作和生活的点滴写成博客,分享给大家.说说我写书的缘由吧,最近几年,特别是15年和16年,我朋友圈的好友陆续出了自己

《React Native移动开发实战》一一1.3 搭建React Native开发环境

1.3 搭建React Native开发环境 "磨刀不误砍柴工",在正式开发React Native应用之前,需要先搭建好React Native的开发环境.搭建React Native开发环境有以下几个主要步骤. 原生开发工具:iOS开发使用Xcode,Android开发使用Android Studio and SDK Tools. Node.js(https://nodejs.org/):React Native是借助Node.js,即JavaScript运行时来创建JavaScr

《React Native移动开发实战》一一1.1 看透React Native

1.1 看透React Native React Native(http://facebook.github.io/react-native/)第一次进入公众的视野是在2015年1月的React.js Conf(http://conf.reactjs. org/)上,随后,同年5月份,Facebook在F8 Conference(https://www. fbf8.com/)上正式宣布:React Native项目(如图1.1所示) 在Github开源.结果一天之内,就收获了5000多颗星,受关

《React Native移动开发实战》一一1.2 React Native的特点

1.2 React Native的特点 那么,作为跨平台应用开发的"新贵",React Native相比其他跨平台技术到底有哪些优势呢?1.2.1 其一:Learn Once, Write Anywhere 这句话是React Native官网(http://facebook.github.io/react-native/)对React Native的概述,简单明了地概括了React Native的最大特点和优点. 只需要学习React Native这一种开发方式(包括平台.语言和开发

《React Native移动开发实战》一一1.5 小试牛刀——更改React Native项目源码

1.5 小试牛刀--更改React Native项目源码 应用虽然已经运行起来了,但是到现在还没有看到或修改任何代码,读者是不是觉得意犹未尽呢?下面就来看看React Native项目的源码吧. 打开index.ios.js文件,可以看到与显示在设备上内容直接相关的代码: 01 export default class ch02 extends Component { // 每个页面可以理解成一个组件 02 render() { // 渲染页面的函数 03 return ( 04 // 页面根V

《React Native移动开发实战》一一3.5 拖曳刷新列表——RefreshControl组件

3.5 拖曳刷新列表--RefreshControl组件 在3.4节中,我们完善了商品列表的功能:不仅优化了列表的布局,还添加了分割线等效果.不过,该App还缺少一个常用的功能,那就是拖曳刷新.虽然也可以添加一个"刷新"按钮用于响应用户请求,但是用户体验却没有拖曳好,而且,由于现在移动开发设备屏幕通常较小,额外添加按钮对界面设计影响也较大. ?小知识:用户体验(User Experience,简称UX或UE)是涉及一个人使用一个特定产品或系统或服务的有关行为.态度与情绪.用户体验包括实

《React Native移动开发实战》一一3.3 完善轮播广告——Image组件

3.3 完善轮播广告--Image组件 之前的轮播广告页面显示的是简单的文字和背景色,接下来添加一些好看的图片作为轮播广告. React Native中用于图片显示的组件是Image.Image组件可以显示多种不同类型图片,包括网络图片.静态资源.临时的本地图片,以及本地磁盘上的图片(如相册)等.3.3.1 使用网络图片 这里先使用网络图片来看看Image的用法和效果.修改app.js代码如下: 01 export default class app extends Component { 02

《React Native移动开发实战》一一1.4 第一个React Native应用

1.4 第一个React Native应用 颇费一番周折搭建好环境之后,终于可以长舒一口气,来开发第一个React Native应用了.1.4.1 初始化项目 首先,使用React Native命令行工具来初始化一个新的项目: react-native init ch02 等待工程创建成功并安装好所有依赖后,使用Atom打开ch02项目,来仔细瞧一瞧React Native项目结构,如图1.21所示. 图1.21 React Native项目结构 其中目录和文件的详细说明如表1.1所示. 回答: