《React Native移动开发实战》一一2.4 React Native的Flexbox布局

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

2.4 React Native的Flexbox布局
无论是在移动平台还是Web前端开发中,布局技术都是必不可少的。了解Web开发的读者想必都听说过著名的CSS“盒子模型”,如图2.4所示。
image

图2.4 CSS“盒子模型”
CSS“盒子模型”依赖于position属性、浮动属性以及display属性来进行布局,所以,对于一些特殊但常用的布局(例如垂直居中)实现就比较困难。
于是,在2009年,W3C提出了一种新的方案——Flexbox布局。Flexbox(Flexible Box的缩写,又称弹性盒子布局)布局旨在提供一个更加有效的方式制定、调整和分布一个容器里的项目布局,即使他们的大小是未知或者动态的。Flexbox布局的主要思想是让容器有能力让其子项目能够改变其宽度、高度(甚至顺序),以最佳方式填充可用空间(主要是为了适应所有类型的显示设备和屏幕大小)。
?小知识:W3C(World Wide Web Consortium)指万维网联盟,该组织建立于1994年,其宗旨是通过促进通用协议的发展并确保其通用型,以激发Web世界的全部潜能。
目前,主流浏览器都已经很好地支持Flexbox布局,如图2.5所示。
image

图2.5 Flexbox布局与主流浏览器的兼容性
React Native实现了Flexbox布局的大部分功能,并且在实际应用开发中也使用Flexbox来实现布局。这不仅使React Native的UI开发变得更加简单,还很好地解决了iOS、Android等屏幕适配的问题。
?提示:React Native中Flexbox布局的工作原理和Web开发基本一致,只有少许差异。例如,默认值不同,React Native中flexDirection属性的默认值是column而不是row,alignItems的默认值是stretch而不是flex-start,另外,flex只能指定一个数字值。
为了方便读者理解后面的代码,这里先简单介绍React Native开发中Flexbox布局的使用。
Flexbox布局所使用的属性,简单来说,可以分为以下两个。
? 决定子组件排列规则的属性,例如,flexDirection、flexWrap、justifyContent以及alignItems等。
? 决定组件自身显示规则的属性,例如,alignSelf以及flex等。
下面分别简单介绍这些属性。
2.4.1 flexDirection设置组件的排列
flexDirection属性表明组件中子组件的排列方向,取值有column(默认值)、row以及row-reverse。
例如,在不设置flexDirection的情况下,下面代码中的子组件view1和view2是按照默认值column纵向排列的,代码如下:

01 export default class flexbox extends Component {
02 render() {
03 return (
04 // 页面根View
05 // 子组件view1
06 // 子组件view2
07
08 );
09 }
10 }
11
12 const styles = StyleSheet.create({
13 container: {
14 flex: 1.backgroundColor:'gray',
15 },
16 view1: { //子组件view1的样式
17 height: 150,
18 width: 150,
19 backgroundColor: 'red'
20 },
21 view2: { //子组件view2的样式
22 height: 150,
23 width: 150,
24 backgroundColor: 'green'
25 }
26 });
?提示:为了节约篇幅,上述例子中只附上了关键代码,例如导入模块或组件的代码,形如import from 。但是读者在实际开发过程中,千万不要忘记先导入相关模块或组件,否则会发生错误。
效果如图2.6所示。
image

图2.6 flexDirection属性为column时的效果
当将flexDirection属性设置为row时,代码如下:

01 // 这里省略了没有修改的代码
02
03 const styles = StyleSheet.create({
04 container: {
05 flex: 1, backgroundColor.'gray',
06 flexDirection: 'row'
07 },
08 view1: { //子组件view1的样式
09 height: 150,
10 width: 150,
11 backgroundColor: 'red'
12 },
13 view2: { //子组件view2的样式
14 height: 150,
15 width: 150,
16 backgroundColor: 'green'
17 }
18 });

那么,子组件view1和view2将按照row进行横向排列,效果如图2.7所示。
image

图2.7 flexDirection属性为row时的效果
2.4.2 flexWrap设置是否换行
flexWrap属性表明子组件“溢出”父组件时是否进行换行,取值有nowrap(默认值)、wrap以及wrap-reverse。
这里,所谓的溢出是指子组件显示的区域超出了父组件的空间。为了模拟溢出的效果,下面修改view1和view2的大小,代码如下:

01 // 这里省略了没有修改的代码
02
03 const styles = StyleSheet.create({
04 container: {
05 flex: 1, backgroundColor:'gray',
06 flexDirection: 'row'
07 },
08 view1: {
09 height: 200,
10 width: 200, // 增大了view1的宽度
11 backgroundColor: 'red'
12 },
13 view2: {
14 height: 200,
15 width: 200, // 增大了view2的宽度
16 backgroundColor: 'green'
17 }
18 });

由于没有设置flexWrap,所以当view2显示不全时,会按照默认值nowrap不进行换行,效果如图2.8所示。
image

图2.8 flexWrap属性为nowrap时的效果
当将flexWrap属性设置为wrap时,代码如下:

01 // 这里省略了没有修改的代码
02
03 const styles = StyleSheet.create({
04 container: {
05 flex: 1, backgroundColor:'gray',
06 flexDirection: 'row',
07 flexWrap: 'wrap'
08 },
09 view1: {
10 height: 200,
11 width: 200,
12 backgroundColor: 'red'
13 },
14 view2: {
15 height: 200,
16 width: 200,
17 backgroundColor: 'green'
18 }
19 });

此时,由于view2和view1的总宽度(200 + 200 = 400)大于屏幕的宽度(使用的iPhone 7宽度=375),所以view2将会换行显示,效果如图2.9所示。
image

图2.9 flexWrap属性为wrap时的效果
2.4.3 justifyContent设置横向排列位置
justifyContent属性表明组件中子组件横向排列在其父容器的哪个位置,取值有flex-start、flex-end、center、space-between以及space-around。
例如,想要实现子组件水平居中的效果,就可以将justifyContent的值设置为center,代码如下:

01 // 这里省略了没有修改的代码
02
03 const styles = StyleSheet.create({
04 container: {
05 flex: 1, backgroundColor.'gray',
06 flexDirection: 'row',
07 justifyContent: 'center'
08 },
09 view1: {
10 height: 150,
11 width: 150,
12 backgroundColor: 'red'
13 },
14 view2: {
15 height: 150,
16 width: 150,
17 backgroundColor: 'green'
18 }
19 });

效果如图2.10所示。
image

图2.10 justifyContent属性为center时的效果
2.4.4 alignItems设置纵向排列位置
alignItems属性表明组件中子组件纵向排列在其父容器的哪个位置,取值有flex-start、flex-end、center、baseline以及stretch。
alignItems属性和justifyContent的作用相似,只是justifyContent决定了子组件横向排列的位置,而alignItems决定了子组件纵向排列的位置。
如果想要实现子组件垂直居中的效果,那么就可以将alignItems的值设置为center,代码如下:

01 // 这里省略了没有修改的代码
02
03 const styles = StyleSheet.create({
04 container: {
05 flex: 1, backgroundColor:'gray',
06 flexDirection: 'row',
07 alignItems: 'center'
08 },
09 view1: {
10 height: 150,
11 width: 150,
12 backgroundColor: 'red'
13 },
14 view2: {
15 height: 150,
16 width: 150,
17 backgroundColor: 'green'
18 }
19 });

效果如图2.11所示。
image

图2.11 alignItems属性为center时的效果
在了解了justifyContent和alignItems属性的用法之后,想必读者很容易就能够自己实现水平垂直居中的效果了,代码如下:

01 // 这里省略了没有修改的代码
02
03 const styles = StyleSheet.create({
04 container: {
05 flex: 1, backgroundColor:'gray',
06 flexDirection: 'row',
07 justifyContent: 'center',
08 alignItems: 'center'
09 },
10 view1: {
12 height: 150,
12 width: 150,
13 backgroundColor: 'red'
14 },
15 view2: {
16 height: 150,
17 width: 150,
18 backgroundColor: 'green'
19 }
20 });

水平垂直居中的效果如图2.12所示。
image

图2.12 使用justifyContent和alignItems属性实现水平垂直居中效果
2.4.5 alignSelf设置特定组件的排列
alignSelf属性表明某个特定组件的排列情况,取值有auto、flex-start、flex-end、center以及stretch。
这里以center为例,代码如下:

01 // 这里省略了没有修改的代码
02
03 const styles = StyleSheet.create({
04 container: {
05 flex: 1, backgroundColor:'gray',
06 },
07 view1: {
08 height: 150,
09 width: 150,
10 backgroundColor: 'red'
11 },
12 view2: {
13 height: 150,
14 width: 150,
15 backgroundColor: 'green',
16 alignSelf: 'center'
17 }
18 });

效果如图2.13所示。
image

图2.13 alignSelf属性为center时的效果
2.4.6 flex设置组件所占空间
flex属性可以让组件动态计算和配置自己所占用的空间大小,取值是数值。
如果想要view1和view2填满父组件,并且view1和view2的大小相同,使用flex就很容易实现,代码如下:

01 // 这里省略了没有修改的代码
02
03 const styles = StyleSheet.create({
04 container: {
05 flex: 1
06 },
07 view1: {
08 flex: 1,
09 backgroundColor: 'red'
10 },
11 view2: {
12 flex: 1,
13 backgroundColor: 'green'
14 }
15 });

效果如图2.14所示。
flex属性使用如此简单,但表现力却非常强大,它是Flexbox布局实现自适应设备和屏幕尺寸的核心,读者需要在后面的React Native开发中逐步熟练掌握flex属性的使用。
image

图2.14 使用flex属性实现自适应屏幕的尺寸大小

相关文章
|
12月前
|
移动开发 前端开发 数据可视化
React 拖拽布局组件 Drag & Drop Layout
本文介绍了如何在React中构建拖拽布局组件,涵盖基础知识、常见问题及解决方案。首先解释了拖拽操作的三个阶段:开始、过程中和结束。接着推荐了几个常用的拖拽库,如`react-beautiful-dnd`,并详细展示了如何使用该库创建基础拖拽组件,包括安装依赖、初始化容器和处理拖拽结束事件。文章还探讨了常见问题,如拖拽不生效、性能优化、嵌套拖拽和跨浏览器兼容性,并提供了进阶技巧,如自定义样式、多列布局和集成其他UI组件。通过这些内容,读者可以掌握构建高效拖拽布局的方法。
870 16
|
开发框架 Dart 前端开发
【Flutter前端技术开发专栏】Flutter与React Native的对比与选择
【4月更文挑战第30天】对比 Flutter(Dart,强类型,Google支持,快速热重载,高性能渲染)与 React Native(JavaScript,庞大生态,热重载,依赖原生渲染),文章讨论了开发语言、生态系统、性能、开发体验、学习曲线、社区支持及项目选择因素。两者各有优势,选择取决于项目需求、团队技能和长期维护考虑。参考文献包括官方文档和性能比较文章。
747 0
【Flutter前端技术开发专栏】Flutter与React Native的对比与选择
|
前端开发
使用 React Router v6 进行布局
【8月更文挑战第27天】
177 1
|
Dart 前端开发 JavaScript
探索移动应用开发中的跨平台解决方案:Flutter与React Native的比较
在移动应用开发领域,选择合适的跨平台解决方案是关键。本文将深入分析Flutter和React Native这两大主流框架,从性能、开发效率、社区支持等方面进行比较,帮助开发者做出明智的选择。
414 27
|
前端开发 JavaScript Android开发
React Native跨平台开发实战
【7月更文挑战第21天】React Native为跨平台移动应用开发提供了一种高效且强大的解决方案。通过本文的学习,你应该能够掌握React Native的基本概念和实战步骤,并开始在你的项目中使用React Native进行开发。随着你对React Native的深入理解,你将能够利用其强大的功能来构建更加复杂和高效的移动应用。
|
开发框架 移动开发 前端开发
【Uniapp 专栏】Uniapp 与 React Native 的对比分析
【5月更文挑战第14天】Uniapp和React Native是热门的跨平台移动开发框架。Uniapp以其一套代码多端运行、丰富的组件生态和较低的学习曲线受到青睐,适合快速开发简单应用。React Native基于React,拥有活跃社区和优秀性能,适合复杂应用。React Native在性能上略胜一筹,尤其在需要接近原生体验的场景。Uniapp的官方组件弥补了社区资源不足。选择时需考虑开发效率、性能需求、团队技术栈和社区支持。
3227 1
【Uniapp 专栏】Uniapp 与 React Native 的对比分析
|
前端开发 自动驾驶 程序员
鸿蒙? 车载?Flutter? React Native? 为什么我劝你三思,说点不一样的
本文探讨了在信息技术快速发展的背景下,开发者如何选择学习路径。作者提倡使用终局思维来规划职业发展,考虑技术的长远影响。终局思维注重长远目标、系统分析、反向规划和动态调整。以车载开发为例,预测未来智能汽车可能由语音助手主导,而非依赖平板界面。此外,作者建议不要过分投入打工状态,应思考创建自己的产品,如App,以实现技能补充和额外收入。选择对未来发展和自主性有益的技术,如Kotlin,比盲目追求热点更为重要。做减法和有标准的选择,能帮助减轻焦虑,实现更高效的成长。关注公众号“AntDream”获取更多相关内容。
378 1
|
开发框架 前端开发 JavaScript
移动应用开发中的跨平台策略:Flutter与React Native的比较
在移动应用领域,跨平台解决方案已成为开发者追求高效、成本效益和广泛覆盖的关键。本文深入探讨了两种领先的跨平台框架——Flutter和React Native,从技术架构、性能、社区生态及实际应用案例四个维度进行全面对比分析。通过这一比较,旨在为移动应用开发者提供选择合适框架的参考依据,帮助他们根据项目需求做出明智的决策。
|
前端开发 iOS开发 Android开发
React Native跨平台开发实战:从零到一
学习React Native跨平台开发,首先安装Node.js和React Native CLI,设置Android/iOS环境。使用CLI创建项目,如`npx react-native init MyProject`。运行应用:`npx react-native run-android`或`run-ios`。编写组件,如在App.js中创建Hello World。添加样式,安装第三方库如react-native-vector-icons,使用react-navigation进行路由和导航。
353 2
|
前端开发 JavaScript Android开发
使用React Native开发跨平台移动应用的技术详解
【5月更文挑战第22天】本文详述了使用React Native开发跨平台移动应用的技术,该框架由Facebook推出,基于JavaScript,支持iOS和Android。React Native通过JNI/JSI实现JavaScript到原生代码的转换,提供高效性能和原生体验。其优势包括跨平台性、原生体验、开发速度及社区支持。开发流程涉及环境搭建、项目创建、编码、调试与测试,以及构建与发布。注意事项包括性能优化、平台适配、利用第三方库和持续学习。React Native为开发者构建高质量跨平台应用提供了便捷途径,未来潜力无限。