《React Native移动开发实战》一一3.1 创建新的电商App

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

3.1 创建新的电商App
之前创建了一个简单的电商项目,本节来实现对该项目的重构。
3.1.1 移植旧电商项目
(1)先创建React Native项目并安装依赖包。

react-native init ch04 // 新建React Native项目ch04
cd ch04
npm install // 或者使用cnpm安装:cnpm install
?小知识:npm install命令还可以简写成npm i,更多说明可以使用npm help install查看帮助文档。
(2)将第2章ch03项目中的index.ios.js、index.android.js以及app.js文件都复制到ch04文件夹中。完成文件复制和覆盖之后,ch04项目的结构如图3.1所示。
但是,如果这时候直接运行App,会发生应用ch04没有注册的错误,如图3.2所示。
发生错误的AppRegistry.registerComponent函数在第1章的例子中就遇到过,那么它到底有什么作用呢?
image

      
图3.1  ch04项目的结构    图3.2  应用ch04没有注册的错误

原来,AppRegistry是所有React Native应用的入口,应用的根组件通过AppRegistry. registerComponent方法注册自己,然后原生系统才可以加载React Native应用的代码并运行React Native应用。流程如图3.3所示。
image

图3.3 AppRegistry.registerComponent注册React Native应用的根组件
(3)了解AppRegistry的原理之后,就可以轻松地找到错误的原因,index.ios.js和index.android.js文件中注册的应用名称不正确,React Native应用中注册的应用是ch03,而react-native命令行工具生成的原生代码运行的应用是ch04,产生错误的代码如下:

// index.ios.js和index.android.js文件
AppRegistry.registerComponent('ch03', () => app); // React Native注册ch03

// iOS原生项目中的AppDelegate.m文件
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation

                    moduleName:@"ch04"             // 原生代码运行ch04
                    initialProperties:nil
                    launchOptions:launchOptions];    

// Android原生项目中的MainActivity.java文件
@Override
protected String getMainComponentName() {

return "ch04";                                    // 原生代码运行ch04

}

?提示:这里是我们第一次接触到React Native开发中的原生代码,通常情况下不需要修改原生代码,只要简单了解即可。
(4)将React Native代码中注册的应用名称ch03修改为ch04即可,修改index.ios.js和index.android.js代码如下:

01 AppRegistry.registerComponent('ch04', () => app);
?提示:由于iOS App和Android App的入口文件不同,分别为index.ios.js和index.android.js,所以ch04项目中的这两个文件都需要按照上述代码进行修改。
重新加载应用,效果如图3.4所示。
image

图3.4 注册正确的应用名称后的运行效果
3.1.2 重构现有的代码
在成功移植ch03项目的实现到新建的ch04项目后,我们就可以开动了:完善应用。但是,笔者在实际开发过程中总结的经验是,完善的第一步往往是从梳理和重构现有代码开始,而非立即添加新代码或功能。只有不断地重构然后添加新功能,代码的可维护性才会越好,这也是应用稳定性和扩展性的重要保证。
重新审视app.js文件的代码,从中不难发现这样的问题:ScrollView组件下所有子组件的样式都是类似的,导致很多冗余代码。ScrollView组件现有代码如下:

01 export default class app extends Component {
02 // 这里省略了没有修改的代码
03
04 render() {
05 return (
06
07 // 这里省略了没有修改的代码
08
09 10 horizontal={true}
11 showsHorizontalScrollIndicator={false}
12 pagingEnabled={true}>
13 Alert.alert

                         ('你单击了轮播图', null, null)}>

14 15 width: Dimensions.get('window').width,
16 height: 180,
17 backgroundColor: 'gray'
18 }}>广告1
19
20 Alert.alert

                         ('你单击了轮播图', null, null)}>

21 22 width: Dimensions.get('window').width,
23 height: 180,
24 backgroundColor: 'orange'
25 }}>广告2
26
27 Alert.alert

                         ('你单击了轮播图', null, null)}>

28 29 width: Dimensions.get('window').width,
30 height: 180,
31 backgroundColor: 'yellow'
32 }}>广告3
33
34
35
36 // 这里省略了没有修改的代码
37
38 );
39 }
40
41 // 这里省略了没有修改的代码
42 }

如果想更新轮播广告的高度的话,就需要修改多处代码heigh: 180。因此,可以尝试将重复的样式代码抽离出来,代码效果如下:

01 export default class app extends Component {
02 // 这里省略了没有修改的代码
03
04 render() {
05 return (
06
07 // 这里省略了没有修改的代码
08
09 10 horizontal={true}
11 showsHorizontalScrollIndicator={false}
12 pagingEnabled={true}>
13 Alert.alert

                         ('你单击了轮播图', null, null)}>

14 15 styles.advertisementContent, {
16 backgroundColor: 'gray'
17 }
18 ]}>广告1
19
20 Alert.alert

                        ('你单击了轮播图', null, null)}>

21 22 styles.advertisementContent, {
23 backgroundColor: 'orange'
24 }
25 ]}>广告2
26
27 Alert.alert

                        ('你单击了轮播图', null, null)}>

28 29 styles.advertisementContent, {
30 backgroundColor: 'yellow'
31 }
32 ]}>广告3
33
34
35
36 // 这里省略了没有修改的代码
37
38 );
39 }
40
41 // 这里省略了没有修改的代码
40 }

其中,添加的样式advertisementContent定义如下:

01 const styles = StyleSheet.create({
02 // 这里省略了没有修改的代码
03 advertisementContent: {
04 width: Dimensions.get('window').width,
05 height: 180
06 },
07 // 这里省略了没有修改的代码
08 });

这样,当要修改轮播广告页面的高度时,只需要修改样式advertisementContent这一处,所有广告页面的样式都可以同时更新。
虽然,样式代码做到了复用,但是TouchableHighlight组件和单击事件等还是重复的,对此,可以使用JavaScript数组的map()方法来做进一步优化,修改app.js代码如下:

01 export default class app extends Component {
02 constructor(props) {
03 super(props);
04 this.state = {
05 advertisements: [ // 轮播广告数组
06 { // 数组中的每个成员描述了广告的详细信息
07 title: '广告1',
08 backgroundColor: 'gray'
09 }, {
10 title: '广告2',
11 backgroundColor: 'orange'
12 }, {
13 title: '广告3',
14 backgroundColor: 'yellow'
15 }
16 ],
17 };
18 }
19
20 // 这里省略了没有修改的代码
21
22 render() {
23 return (
24
25 // 这里省略了没有修改的代码
26
27 28 horizontal={true}
29 showsHorizontalScrollIndicator={false}
30 pagingEnabled={true}>
31 {this.state.advertisements.map((advertisement,

                         index) => {

32 return (
33

                                {() => Alert.alert('你单击了轮播图', null,
                                null)}>

34 35 styles.advertisementContent, {
36 backgroundColor: advertisement.

                                           backgroundColor

37 }
38 ]}>{advertisement.title}
39


40 );
41 })}
42
43
44 // 这里省略了没有修改的代码
45
46 );
47 }
48
49 // 这里省略了没有修改的代码
50 }

此时,如果想要修改、添加或删除广告页,对于重构后的代码就非常简单,只需要编辑this.state.advertisements数组即可。重新加载应用,效果如图3.5所示。
image

相关文章
|
机器学习/深度学习 人工智能 自然语言处理
DeepSeek Artifacts:在线实时预览的前端 AI 编程工具,基于DeepSeek V3快速生成React App
DeepSeek Artifacts是Hugging Face推出的免费AI编程工具,基于DeepSeek V3,支持快速生成React和Tailwind CSS代码,适合快速原型开发和前端组件构建。
2675 39
DeepSeek Artifacts:在线实时预览的前端 AI 编程工具,基于DeepSeek V3快速生成React App
|
XML 前端开发 JavaScript
react学习笔记一:入门级小白到脚手架(create-react-app)开发项目
这篇文章是React的学习笔记,覆盖了从React的基础用法到高级特性,包括组件化、状态管理、生命周期、虚拟DOM等主题,适合React初学者参考。
539 0
react学习笔记一:入门级小白到脚手架(create-react-app)开发项目
|
前端开发
create-react-app 如何使用 less/sass 和 react-css-modules?
本文详细介绍了在 create-react-app 项目中如何使用 less/sass 和 react-css-modules 来管理和应用样式。首先,通过安装相应依赖并配置 webpack 支持 less/sass;接着,介绍如何使用这些预处理器编写样式;最后,讲解了如何配置和使用 react-css-modules 实现样式的模块化管理,以及如何结合使用 less/sass 和 react-css-modules 提高开发效率和代码质量。
406 3
|
XML 移动开发 前端开发
使用duxapp开发 React Native App 事半功倍
对于Taro的壳子,或者原生React Native,都会存在 `android` `ios`这两个文件夹,而在duxapp中,这些文件夹的内容是自动生成的,那么对于需要在这些文件夹中修改的配置内容,例如包名、版本号、新架构开关等,都通过配置文件的方式配置了,而不需要需修改具体的文件
|
前端开发 JavaScript 中间件
React脚手架create-react-app简介
【8月更文挑战第13天】React脚手架create-react-app简介
712 4
|
移动开发 小程序 开发工具
微信支付的类型分析(JSAPI+APP+H5+NATIVE+付款码+合单)
微信支付的类型分析(JSAPI+APP+H5+NATIVE+付款码+合单)
1562 1
|
前端开发 JavaScript API
Vue和React,哪个更适合做电商
【4月更文挑战第10天】Vue和React是电商网站开发的热门框架。Vue以其简单易用、响应式数据绑定和完善的生态系统受到青睐;而React凭借强大的组件化、卓越性能及丰富生态脱颖而出。选择取决于项目需求、团队技术栈和性能要求。在决定前,可进行技术调研和原型开发。
299 3
|
前端开发 Android开发 iOS开发
应用研发平台EMAS使用 aliyun-react-native-push 库接入推送和辅助通道,推送都可以收到,但是在App切到后台或者杀掉进程之后就收不到推送了,是需要配置什么吗?
【2月更文挑战第31天】应用研发平台EMAS使用 aliyun-react-native-push 库接入推送和辅助通道,推送都可以收到,但是在App切到后台或者杀掉进程之后就收不到推送了,是需要配置什么吗?
550 2
|
JavaScript 前端开发 搜索推荐
构建一个基于React和Redux的简易电商购物车应用
构建一个基于React和Redux的简易电商购物车应用
345 0
|
前端开发
【专栏】在 create-react-app 中集成 less/sass 预处理器和 react-css-modules 的方法
【4月更文挑战第29天】本文介绍了在 create-react-app 中集成 less/sass 预处理器和 react-css-modules 的方法。首先,通过 `npm` 安装 less 或 sass 依赖,然后修改 `config-overrides.js` 配置文件以支持 less/sass 编译。接着,详细阐述如何使用 less/sass 编写样式。再者,安装 react-css-modules 并配置 webpack,使能样式模块化。最后,展示了如何结合使用 less/sass 和 react-css-modules,以提升前端开发的效率和代码质量。
823 0