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

简介: 本节书摘来自华章出版社《React Native移动开发实战》一 书中的第3章,第3.4节,作者:袁林 著 ,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

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所示。
image

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

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

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所示。
image

图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所示。
image

图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所示。
image

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

相关文章
|
9月前
|
缓存 前端开发 JavaScript
React Hooks深度解析与最佳实践:提升函数组件能力的终极指南
🌟蒋星熠Jaxonic,前端探索者。专注React Hooks深度实践,从原理到实战,分享状态管理、性能优化与自定义Hook精髓。助力开发者掌握函数组件的无限可能,共赴技术星辰大海!
React Hooks深度解析与最佳实践:提升函数组件能力的终极指南
|
缓存 前端开发 数据安全/隐私保护
如何使用组合组件和高阶组件实现复杂的 React 应用程序?
如何使用组合组件和高阶组件实现复杂的 React 应用程序?
445 68
|
缓存 前端开发 Java
在 React 中,组合组件和高阶组件在性能方面有何区别?
在 React 中,组合组件和高阶组件在性能方面有何区别?
394 67
|
前端开发 JavaScript 安全
除了高阶组件和render props,还有哪些在 React 中实现代码复用的方法?
除了高阶组件和render props,还有哪些在 React 中实现代码复用的方法?
495 62
|
前端开发
React 中高阶组件的原理是什么?
React 中高阶组件的原理是什么?
319 57
|
移动开发 前端开发 JavaScript
React音频播放列表组件:常见问题、易错点与解决方案
本文介绍了在React中实现音频播放列表时常见的挑战及解决方案。通过基础实现、常见问题分析和最佳实践,帮助开发者避免状态管理、生命周期控制和事件处理中的陷阱。关键点包括使用`useRef`操作音频元素、`useState`同步播放状态、全局状态管理防止多音频同时播放、以及通过`useEffect`清理资源。还提供了代码示例和跨浏览器兼容性处理方法,确保高效实现功能并减少调试时间。
466 30
|
移动开发 前端开发 UED
React 音频音量控制组件 Audio Volume Control
在现代Web应用中,音频播放功能不可或缺。React以其声明式编程和组件化开发模式,非常适合构建复杂的音频音量控制组件。本文介绍了如何使用HTML5 `&lt;audio&gt;`元素与React结合,实现直观的音量控制系统,并解决了常见问题如音量范围不合理、初始音量设置及性能优化等,帮助开发者打造优秀的音频播放器。
502 27
|
编解码 前端开发 开发者
React 图片组件样式自定义:常见问题与解决方案
在 React 开发中,图片组件的样式自定义常因细节问题导致布局错乱、性能损耗或交互异常。本文系统梳理常见问题及解决方案,涵盖基础样式应用、响应式设计、加载状态与性能优化等,结合代码案例帮助开发者高效实现图片组件的样式控制。重点解决图片尺寸不匹配、边框阴影不一致、移动端显示模糊、加载失败处理及懒加载等问题,并总结易错点和最佳实践,助力开发者提升开发效率和用户体验。
640 22
|
移动开发 前端开发 开发者
React 音频播放控制组件 Audio Controls
本文介绍了如何使用React构建音频播放控制组件,涵盖HTML5 `&lt;audio&gt;`标签和React组件化思想的基础知识。针对常见问题如播放状态管理、进度条更新不准确及跨浏览器兼容性,提供了详细的解决方案和代码示例。同时,还总结了易错点及避免方法,如确保音频加载完成再操作、处理音频错误等,帮助开发者实现稳定且功能强大的音频播放器。
544 11
|
移动开发 前端开发 UED
React 音频进度条组件 Audio Progress Bar
在现代Web开发中,音频播放功能不可或缺。使用React构建音频进度条组件,不仅能实现播放控制和拖动跳转,还能确保代码的可维护性和复用性。本文介绍了如何利用HTML5 `&lt;audio&gt;`标签的基础功能、解决获取音频时长和当前时间的问题、动态更新进度条样式,并避免常见错误如忘记移除事件监听器和忽略跨浏览器兼容性。通过这些方法,开发者可以打造高质量的音频播放器,提升用户体验。
641 6