《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代码,适合快速原型开发和前端组件构建。
2477 39
DeepSeek Artifacts:在线实时预览的前端 AI 编程工具,基于DeepSeek V3快速生成React App
|
XML 前端开发 JavaScript
react学习笔记一:入门级小白到脚手架(create-react-app)开发项目
这篇文章是React的学习笔记,覆盖了从React的基础用法到高级特性,包括组件化、状态管理、生命周期、虚拟DOM等主题,适合React初学者参考。
456 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 提高开发效率和代码质量。
346 3
|
开发框架 移动开发 JavaScript
SpringCloud微服务实战——搭建企业级开发框架(四十七):【移动开发】整合uni-app搭建移动端快速开发框架-添加Axios并实现登录功能
在uni-app中,使用axios实现网络请求和登录功能涉及以下几个关键步骤: 1. **安装axios和axios-auth-refresh**: 在项目的`package.json`中添加axios和axios-auth-refresh依赖,可以通过HBuilderX的终端窗口运行`yarn add axios axios-auth-refresh`命令来安装。 2. **配置自定义常量**: 创建`project.config.js`文件,配置全局常量,如API基础URL、TenantId、APP_CLIENT_ID和APP_CLIENT_SECRET等。
916 60
|
XML 移动开发 前端开发
使用duxapp开发 React Native App 事半功倍
对于Taro的壳子,或者原生React Native,都会存在 `android` `ios`这两个文件夹,而在duxapp中,这些文件夹的内容是自动生成的,那么对于需要在这些文件夹中修改的配置内容,例如包名、版本号、新架构开关等,都通过配置文件的方式配置了,而不需要需修改具体的文件
|
前端开发 JavaScript 中间件
React脚手架create-react-app简介
【8月更文挑战第13天】React脚手架create-react-app简介
644 4
|
Dart 前端开发 JavaScript
探索移动应用开发中的跨平台解决方案:Flutter与React Native的比较
在移动应用开发领域,选择合适的跨平台解决方案是关键。本文将深入分析Flutter和React Native这两大主流框架,从性能、开发效率、社区支持等方面进行比较,帮助开发者做出明智的选择。
414 27
|
前端开发 JavaScript Android开发
React Native跨平台开发实战
【7月更文挑战第21天】React Native为跨平台移动应用开发提供了一种高效且强大的解决方案。通过本文的学习,你应该能够掌握React Native的基本概念和实战步骤,并开始在你的项目中使用React Native进行开发。随着你对React Native的深入理解,你将能够利用其强大的功能来构建更加复杂和高效的移动应用。
|
前端开发 自动驾驶 程序员
鸿蒙? 车载?Flutter? React Native? 为什么我劝你三思,说点不一样的
本文探讨了在信息技术快速发展的背景下,开发者如何选择学习路径。作者提倡使用终局思维来规划职业发展,考虑技术的长远影响。终局思维注重长远目标、系统分析、反向规划和动态调整。以车载开发为例,预测未来智能汽车可能由语音助手主导,而非依赖平板界面。此外,作者建议不要过分投入打工状态,应思考创建自己的产品,如App,以实现技能补充和额外收入。选择对未来发展和自主性有益的技术,如Kotlin,比盲目追求热点更为重要。做减法和有标准的选择,能帮助减轻焦虑,实现更高效的成长。关注公众号“AntDream”获取更多相关内容。
378 1
|
开发框架 前端开发 JavaScript
移动应用开发中的跨平台策略:Flutter与React Native的比较
在移动应用领域,跨平台解决方案已成为开发者追求高效、成本效益和广泛覆盖的关键。本文深入探讨了两种领先的跨平台框架——Flutter和React Native,从技术架构、性能、社区生态及实际应用案例四个维度进行全面对比分析。通过这一比较,旨在为移动应用开发者提供选择合适框架的参考依据,帮助他们根据项目需求做出明智的决策。