本文总结:

我们学到了 React Native 的 Flexbox 布局,它让写样式变得更方便啦! Flexbox 就像一个有弹性的盒子,有主轴和交叉轴(行或列)。

在 RN 里写样式要用 StyleSheet.create 对象,属性名是驼峰命名

文章还介绍了如何用 Platform.select 给不同平台写样式,以及使用 styled-components 这个库的简单例子(虽然我们主要还是用 StyleSheet)。

文章还通过三栏布局横向布局的例子,展示了 flexDirection, alignItems, justifyContentalignSelf 这些属性的用法。

特别喜欢 alignSelf: 'stretch' 能让元素填充空间的技巧!

最后,通过抽象出 RowCol 组件,我看到了如何用 Flexbox 实现更复杂的嵌套布局。感觉 Flexbox 真的让布局变得灵活多了!

1、关于Flexbox

在将flexbox引入css前,构建布局的各种css属性都比较粗糙,而且很容易出错。而flexbox通过抽象了很多属性来解决问题。字如其名flexbox的意思就是一个具有弹性的盒子模型。我们画个图:假设你有一个容器和它的子元素,它看起来可以是这样的。

Flexbox容器有二个轴,即(向上/向下)或(左/右)。

2、实操

我们直接上代码吧,这是一个js模块,而不是css模块。如果我们要声明rn的样式,我们需要去定义一个对象然后调用StyleSheet.create()最后抛出它在你的模块中。但是我们需要注意的是rn只支持驼峰命名

import { Platform, StyleSheet, StatusBar } from 'react-native'
export default StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: 'ghostwhite',
...Platform.select({
ios: { paddingTop: 20 },
android: { paddingTop: StatusBar.currentHeight },
}),
},
box: {
width: 100,
height: 100,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: 'lightgray',
},
boxText: {
color: 'darkslategray',
fontWeight: 'bold',
},
})

然后我们看到刚才我写了这样一段代码,这里其实就是根据你的移动端去选择样式。

...Platform.select({
ios: { paddingTop: 20 },
android: { paddingTop: StatusBar.currentHeight },
}),

ok,我们看一下在rn组件中如何使用

import { Text, View } from 'react-native'
import styles from './styles'
export default function App() {
return (
<View style={styles.container}>
<View style={styles.box}>
<Text style={styles.boxText}>I'm in a box</Text>
</View>
</View>
)
}

这些样式将通过样式属性分配给每个组件。我们来看看它的表现。

3、Styled-components样式组件库使用

Styled-components是一个css-in-js的库为我们的组件去提供样式,如我们去直接看看怎么使用吧。当然只是介绍一下,我们还是使用styleSheet

首先下载依赖


yarn add styled-components

然后我们写点代码

import styled from "styled-components/native";
const Box = styled.View'
width: 100px;
height: 100px;
justify-content: center;
align-items: center;
background-color: lightgray;
';
const BoxText = styled.Text'
color: darkslategray;
font-weight: bold;
';

使用

const App = () => {
return (
<Box>
<BoxText>I'm in a box</BoxText>
</Box>
); };

4、基础Flexbox

接下来主要讲一下rn中的几种常见布局和flexbox的实战

4.1、三栏布局

普通的从上到下的三栏布局。

你可以把view理解成div,text理解成p

import { Text, View } from 'react-native'
import styles from './styles'
export default function App() {
return (
<View style={styles.container}>
<View style={styles.box}>
<Text style={styles.boxText}>#1</Text>
</View>
<View style={styles.box}>
<Text style={styles.boxText}>#2</Text>
</View>
<View style={styles.box}>
<Text style={styles.boxText}>#3</Text>
</View>
</View>
)
}

flexDirection属性是决定了主轴的方向,上到下或者左到右,而alignItemjustifyContent属性决定了元素的排列和间隔。


import { Platform, StyleSheet, StatusBar } from 'react-native'
export default StyleSheet.create({
container: {
flex: 1,
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'space-around',
backgroundColor: 'ghostwhite',
...Platform.select({
ios: { paddingTop: 20 },
android: { paddingTop: StatusBar.currentHeight },
}),
},
box: {
width: 300,
height: 100,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: 'lightgray',
borderWidth: 1,
borderStyle: 'dashed',
borderColor: 'darkslategray',
},
boxText: {
color: 'darkslategray',
fontWeight: 'bold',
},
})

而如果我们想让它左右两边填满那?就像这样

我们可以加入alignSelf这个属性,这个属性的意思是根据主轴flexDirection的方向,改变宽度或者高度(column改变的就是宽度,row改变的就是高度)去填充空白,动态计算高度或宽度。像这样就是会填满你屏幕的宽度。

  box: {
height: 100,
justifyContent: 'center',
//
alignSelf: 'stretch',
alignItems: 'center',
backgroundColor: 'lightgray',
borderWidth: 1,
borderStyle: 'dashed',
borderColor: 'darkslategray',
},

当我们把手机横过去

我们稍微优化一下,正好也写一下横向的布局,上面的样式太`抽象`了写得。


import { Text, View, StatusBar } from 'react-native'
import styles from './styles'
import Box from './Box'
export default function App() {
return (
<View style={styles.container}>
<Box>#1</Box>
<Box>#2</Box>
</View>
)
}

import { PropTypes } from 'prop-types'
import { View, Text } from 'react-native'
import styles from './styles'
export default function Box({ children }) {
return (
<View style={styles.box}>
<Text style={styles.boxText}>{children}</Text>
</View>
)
}
Box.propTypes = {
children: PropTypes.node.isRequired,
}

这个就是会拉伸至整个屏幕高度的横向布局


import { Platform, StyleSheet, StatusBar } from 'react-native'
export default StyleSheet.create({
container: {
flex: 1,
flexDirection: 'row',
backgroundColor: 'ghostwhite',
alignItems: 'center',
justifyContent: 'space-around',
...Platform.select({
ios: { paddingTop: 20 },
android: { paddingTop: StatusBar.currentHeight },
}),
},
box: {
width: 100,
justifyContent: 'center',
alignSelf: 'stretch',
alignItems: 'center',
backgroundColor: 'lightgray',
borderWidth: 1,
borderStyle: 'dashed',
borderColor: 'darkslategray',
},
boxText: {
color: 'darkslategray',
fontWeight: 'bold',
},
})

我们来看看它的表现

当我们把手机横过去

5、稍微复杂一点的flexBox

假设我们要实现这样一个效果,我们该如何实现?

在我们的意识中,整个布局有。那我们同样也可以抽象出colrow组件分别代表行列。我们直接上代码吧。

可以看到我们分别确定了colrow的方向和排列。

import { Platform, StyleSheet, StatusBar } from 'react-native'

export default StyleSheet.create({
container: {
flex: 1,
flexDirection: 'column',
backgroundColor: 'ghostwhite',
alignItems: 'center',
justifyContent: 'space-around',
...Platform.select({
ios: { paddingTop: 40 },
android: { paddingTop: StatusBar.currentHeight },
}),
}, box: {
height: 100,
width: 100,
justifyContent: 'center',
alignItems: 'center',
borderWidth: 1,
borderStyle: 'dashed',
borderColor: 'darkslategray',
backgroundColor: 'lightgray',
}, boxText: {
color: 'darkslategray',
fontWeight: 'bold',
}, row: {
flex: 1,
flexDirection: 'row',
justifyContent: 'space-around',
alignSelf: 'stretch',
}, column: {
flex: 1,
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'space-around',
alignSelf: 'stretch',
},
})

组件部分

app

import { View, StatusBar } from 'react-native'
import styles from './styles'
import Row from './Row'
import Col from './Col'
import Box from './Box'
export default function App() {
return (
<View style={styles.container}>
<StatusBar hidden={false} />
<Row>
<Col>
<Box>#1</Box>
<Box>#2</Box>
</Col>
<Col>
<Box>#3</Box>
<Box>#4</Box>
</Col>
</Row>
<Row>
<Col>
<Box>#5</Box>
<Box>#6</Box>
</Col>
<Col>
<Box>#7</Box>
<Box>#8</Box>
</Col>
</Row>
<Row>
<Col>
<Box>#9</Box>
<Box>#10</Box>
</Col>
<Col>
<Box>#11</Box>
<Box>#12</Box>
</Col>
</Row>
</View>
)
}

col


import PropTypes from 'prop-types'
import { View } from 'react-native'
import styles from './styles'
export default function Column({ children }) {
return <View style={styles.column}>{children}</View>
} Column.propTypes = {
children: PropTypes.node.isRequired,
}

row


import PropTypes from 'prop-types'
import { View } from 'react-native'
import styles from './styles'
export default function Row({ children }) {
return <View style={styles.row}>{children}</View>
} Row.propTypes = {
children: PropTypes.node.isRequired,
}

import React from 'react'
import PropTypes from 'prop-types'
import { View, Text } from 'react-native'
import styles from './styles'
export default function Box({ children }) {
return (
<View style={styles.box}>
<Text style={styles.boxText}>{children}</Text>
</View>
)
} Box.propTypes = {
children: PropTypes.node.isRequired,
}

6、总结

欢迎加入群聊,我们一起讨论一些更有趣的技术、商业、闲聊。

React-native之Flexbox的更多相关文章

  1. React Native之FlexBox介绍和使用

    # 前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会 ...

  2. React Native之FlexBox布局

    参考原文链接:https://www.cnblogs.com/wujy/p/5841685.html 弹性盒模型(The Flexible Box Module),又叫Flexbox,意为“弹性布局” ...

  3. React Native,flexbox布局

    Flexbox布局 flex:使组件在可利用的空间内动态地扩张或收缩.flex:1会使组件撑满空间.当有多个组件都指定了flex的值,那么谁的flex值大谁占得空间就大,占得大小的比例就是flex值的 ...

  4. React Native填坑之旅--布局篇

    代码在这里: https://github.com/future-challenger/petshop/tree/master/client/petshop/src/controller 回头看看RN ...

  5. React Native创建一个APP

    React Native 结合了 Web 应用和 Native 应用的优势,可以使用 JavaScript 来开发 iOS 和 Android 原生应用.在 JavaScript 中用 React 抽 ...

  6. React Native布局

    一款好的APP离不了一个漂亮的布局,本文章将向大家分享React Native中的布局方式FlexBox. 在React Native中布局采用的是FleBox(弹性框)进行布局. FlexBox提供 ...

  7. React Native FlexBox

    FlexBox 是React Native布局的一种算法,目的是为了适配不同尺寸的屏幕而设计的. 使用时最关键的就是flex关键字的用法. flex用于修饰当前View在父视图中的占比. 占比如何计算 ...

  8. React Native 开发之 (05) flexbox布局

    一  flexbox布局 1 flex布局 flexbox是ReactNative 应用开发中必不可少的内容,也是最常用的内容. 传统的页面布局是基于盒子模型,依赖定位属性,流动属性和显示属性来解决. ...

  9. React Native 弹性布局FlexBox

    React Native采用一中全新的布局方式:FlexBox(弹性布局).可以很方便的实现各种复杂布局,是全新的针对web和移动开发布局的一种实现方式. 何为FlexBox? 完整名称为:the f ...

  10. React Native学习(九)—— 使用Flexbox布局

    本文基于React Native 0.52 Demo上传到Git了,有需要可以看看,写了新内容会上传的.Git地址 https://github.com/gingerJY/React-Native-D ...

随机推荐

  1. js回忆录(4) -- 对象,构造函数

    1.对象 && 构造函数 js是一门基于对象的语言,里边所有的数据类型都可以当对象使唤(当然null和undefined除外),当我们在v8引擎里声明一个对象时会发现每个对象属性里边都 ...

  2. 5个步骤完成 Vue3 开发调试工具安装教程

    Vue3 开发调试工具安装教程 5个步骤 第一步:点击浏览器右上角,更多工具 – 扩展程序 第二步:点击右上角 – 开发者模式 开关 第三步:点击 "添加已解压的扩展程序" 第四步 ...

  3. k8s v1.16.3,Unable to connect to the server: x509: certificate has expired or is not yet valid

    前言 kubernetes 版本为 v1.16.3 使用 kubelet get node 后报错: x509: certificate has expired or is not yet valid ...

  4. Ubuntu安装配置redis

    更新安装相关依赖库 下面步骤一步一步来 sudo apt update sudo apt install build-essential sudo apt-get install manpages-d ...

  5. 栈的应用(后进先出 LIFO)--括号匹配问题

    博客地址:https://www.cnblogs.com/zylyehuo/ # -*- coding: utf-8 -*- class Stack: def __init__(self): self ...

  6. Linux性能分析-CPU上下文切换

    前言 在Linux性能分析-平均负载中,提到过一种导致平均负载升高的情况,就是有大量进程或线程等待cpu调度. 为什么大量进程或者线程等待CPU调度会导致负载升高呢? 当大量进程或者线程等待调度时,c ...

  7. layui table表格中点击图片放大

    {field:'plateNoPicUri', title: '图片' ,width:"10%" ,templet:function(data){ if("" ...

  8. 超简单电脑本地部署deepseek,另附”一键使用脚本“撰写与联网使用方法

    在电脑上部署deepseek,总共分三步 1.打开ollama官网点击Download按钮 2.在ollama官网搜索deepseek-r1模型,选择对应规模,并复制ollama命令,比如这里,我的o ...

  9. GitOps

    什么是GitOps 持续的GitOps,新时代的DevOps实践,通过Kubernetes集群来实现基于git的全自动化的流程来提高交付速度.简单地说,GitOps是使用Git拉请求管理基础设施部署和 ...

  10. FastAPI依赖注入系统及调试技巧

    title: FastAPI依赖注入系统及调试技巧 date: 2025/04/11 15:00:50 updated: 2025/04/11 15:00:50 author: cmdragon ex ...