开启RN之旅——系统组件

目录

前言

1、View

2、Text

3、Image

4、ImageBackground

5、TextInput

6、TouchableOpacity

7、TouchableHighlight

8、Button

9、Pressable

10、ScrollView

11、FlatList

12、SectionList

13、RefreshControl

14、Modal

15、StatusBar

16、Switch


前言

本篇接着前面的RN学习旅程,继续来写RN的学习笔记。

组件官方文档:https://reactnative.cn/docs/components-and-apis

1、View

  • 构建 UI 的最基础组件
  • 是一个支持flex布局、样式、一些触摸处理和无障碍控制的容器
  • 可以嵌套在其他视图内,并且可以有 0 到多个任何类型的子组件

①、flexDirection

  • flexDirection用于控制横向(row)和纵向(column)布局
  • 布局方向可通过column reverse或row reverse实现反向排列

②、flexGrow和flex

|----------|--------------|----------------|
| 属性 | 分配逻辑 | 宽度计算依据 |
| flexGrow | 按比例分配父容器剩余空间 | 自身宽度+剩余空间分配值 |
| flex | 按比例分配父容器全部空间 | 忽略自身宽度,完全按比例分配 |

③、尺寸属性传值和百分比

  • 百分比赋值需确保总和不超过100%
  • margin和padding属性支持百分比设置,例如margin-top: 12%或padding-left: 20%,百分比基于父布局的对应尺寸计算。
  • border-width属性不支持百分比赋值,如border-width: 10%会导致报错,必须使用固定数值(如10px)。

④、position absolute绝对定位

绝对定位元素需主动定义位置属性才能完全独立于父布局

|---------------------------|-----------|------------------|
| 场景 | 交叉轴表现 | 覆盖条件 |
| 父布局设置alignItems: center | 子元素水平居中 | 子元素未设置left/right |
| 父布局设置alignItems: flex-end | 子元素靠右对齐 | 子元素设置left属性后失效 |
| 子元素设置left: 30 | 强制左偏移30单位 | 优先级高于父布局对齐 |

⑤、onLayout

  • onLayout是RN核心布局回调,在元素完成布局后触发,返回其尺寸和位置信息。
  • 与原生开发机制一致,用于获取动态布局后的实际渲染参数。
  • event.nativeEvent包含关键布局数据,需重点关注而非整个event对象。
  • 原生事件封装原理:RN组件通过桥接转发原生布局事件。
  • 回调触发条件:布局参数变更必触发回调,包括width/height/x/y任一值变化。

⑥、setNativeProps

setNativeProps是性能瓶颈下的选择余地,该方法可直接动态更新视图属性。

setNativeProps适用于需要立即生效的高性能场景。通过state控制视图属性需等待重绘周期,而该方法能绕过渲染流程直接操作原生组件。性能优化时该方法可作为备选方案,尤其在动画或高频属性更新场景中。

javascript 复制代码
useEffect(() => {
  setTimeout(() => {
    viewRef.current.setNativeProps({
      style: { 
        backgroundColor: 'blue',
        width: 300 
      }
    });
  }, 2000);
});

2、Text

①、字体属性

fontsize

  • 基本用法:通过fontSize属性设置文字大小,直接写数值即可(如fontSize: 24)
  • 默认值:系统默认字体大小为14
  • 注意事项:不要使用百分比等非数值单位(如20%会导致报错)

fontWeight

  • 取值范围:
    • 数值:100-900(100的整数倍)
    • 枚举值:'normal'和'bold'
  • 平台差异:
    • 安卓仅支持两种状态:normal(400-500)和bold(600-900)
    • iOS/Web支持多级粗细
  • 开发建议:实际项目中通常只使用normal和bold两种状态

fontFamily

  • 实现步骤:
    • 在安卓工程src/main/res/font目录放入字体文件(如CustomFont.ttf)
    • 通过fontFamily: 'CustomFont'引用(不带扩展名)

②、行数及修饰模式

文本行数控制:

  • numberOfLines: 控制文本显示的行数,超出指定行数的文本会被截断

文本截断模式:ellipsizeMode: 决定被截断文本的显示方式,有四种模式:

  • tail(默认):在文本末尾显示省略号(...)
  • head:在文本开头显示省略号
  • middle:在文本中间显示省略号
  • clip:直接裁剪不显示省略号(不推荐使用)

③、选中及色号

selectable: 控制文本是否可选择

  • 默认值为false(不可选择)
  • 设置为true时允许用户选择文本

selectionColor: 设置文本选中时的背景颜色

  • 可接受颜色名称(如'red')或十六进制值(如'#c0c0c0')

④、点击和长按

事件支持:React Native的Text组件支持点击(onPress)和长按(onLongPress)事件

⑤、跟随系统字号

  • 控制机制: allowFontScaling属性决定文本是否跟随系统字体大小设置进行缩放
  • 默认值: 该属性默认为true,即默认跟随系统字体缩放

⑥、文字嵌套

  • 嵌套特性:在React Native中,Text组件可以嵌套使用,这是许多开发者不知道的特性。
  • 基本结构:外层Text组件包裹内层Text组件,内层Text可以有自己的样式。
  • 限制:嵌套Text组件无法使用margin和padding属性,可通过添加空格字符实现间距效果
  • 继承:未指定的样式属性会继承外层Text的样式,显式定义的样式会覆盖继承的样式

⑦、文本对齐

垂直方向:通过textAlignVertical: 'top'等属性控制垂直对齐方式,主要用于非嵌套的独立文本元素

水平方向:不加后缀的textAlign指水平方向对齐,值:left、right、center、justify(两端对齐)

⑧、文本装饰

基本属性:

  • textDecorationStyle:定义装饰线的样式
  • textDecorationLine:定义装饰线的类型,这两个属性必须搭配使用才能生效

样式类型:

  • solid:实线

线型选择:

  • underline:下划线
  • line-through:删除线(文字中间的横线)

⑨、文字阴影

  • 核心属性:文字阴影需要三个属性联合使用:textShadowColor(阴影颜色)、textShadowOffset(阴影偏移)、textShadowRadius(阴影半径)
  • 使用限制:这三个属性必须同时使用才能生效,单独使用任一属性都不会产生阴影效果

3、Image

Image是React Native中用于加载图片的核心组件,现代APP开发中图片展示是必备功能,通过source属性指定图片源,支持两种类型。

①、图片源

本地图片:

  • 存储位置:存放在项目的assets/images目录下
  • 导入方式:
    • 使用ES6的import语法导入:import avatar from '../assets/images/avatar.png'
    • 直接赋值给source属性:<Image source={avatar}/>
  • 通过style属性设置样式,如:{width:120, height:120},未设置样式时图片显示原始尺寸

网络图片:

  • 通常将URL保存在constants目录的配置文件中,示例:export const imageUri = 'https://profile-avatar.csdnimg.cn/'
  • <Image source={{uri: imageUri}}/>
  • 必须显式设置图片尺寸样式

②、缩放模式

  • 生效条件:当图片源宽高与Image组件宽高不等比/不等大时生效
  • 核心作用:控制图片在容器中的显示方式和比例关系
  • contain:等比例拉伸至至少一边撑满容器
  • center:图片小于容器:保持原尺寸居中,图片大于容器:等比例缩小至完全容纳
  • conver:等比例放大至完全覆盖容器,图片可能被裁剪,始终填满整个容器
  • stretch:非等比例拉伸至完全填充,图片会变形,强制适应容器尺寸
  • repeat:在XY轴重复平铺至填满容器

③、模糊半径

  • 属性名:blurRadius
  • 取值效果:1:轻微模糊,20:完全模糊

④、占位图片

  • 属性名:defaultSource
  • 作用:网络图片加载失败时的备用本地图
  • 必要性:网络请求不可靠时的容错方案
  • 实现方式:同时指定source和defaultSource属性

⑤、渐入动画时间

fadeDuration控制图片加载完成后的渐显动画时长,单位毫秒,大面积图片建议设置200ms过渡。

典型值建议:

  • 默认值:300ms(未明确说明但实际效果)
  • 推荐值:200ms(平衡流畅度与等待时间)
  • 极端值:可设为0ms(立即显示)或3000ms(明显过渡)

⑥、加载成功和失败

  • onLoad: 图片加载成功时触发的回调
  • onError: 图片加载失败时触发的回调
  • 需要传入箭头函数作为回调处理
  • nativeEvent: 包含图片加载后的详细信息
    • 示例值: {"height":200,"uri":"https://...","width":200}
    • source: 包含uri(图片地址)、width(宽度)、height(高度)等关键信息

⑦、加载开始与结束

回调配对机制:onLoadStart和onLoadEnd是成对出现的回调函数,分别标记网络图片加载过程的开始和结束时间点

  • 成功加载流程:
    • 最后触发onLoadEnd
    • 加载成功后触发onLoad
    • 触发onLoadStart
  • 失败加载流程:
    • 不会触发onLoadEnd回调
    • 加载失败时触发onError
    • 触发onLoadStart

⑧、着色

tintColor

  • 基本用法:在Image组件的style中添加tintColor: 'red',图片非透明区域会立即着色为指定颜色
  • 属性特点:支持所有CSS颜色值,包括十六进制、RGB、颜色名称等
  • 实际应用:比如在dark/light模式切换时动态改变图标颜色

⑨、Image组件API

Image.getSize

  • 功能作用:用于获取网络图片的尺寸信息,包含成功和失败两个回调函数
  • 参数说明:第一个参数:远程图片的URI地址、第二个参数:成功回调函数,返回图片的width和height、第三个参数:失败回调函数,返回错误信息error
  • 使用步骤:创建imgRef引用:const imgRef=useRef(null); 在useEffect中调用API

Image.prefetch

  • 功能特点:预加载网络图片到本地缓存,返回Promise对象
  • 优点:提前下载大图片到本地磁盘,后续加载时直接从本地读取,速度快于网络下载

4、ImageBackground

ImageBackground是一个复合组件,结合了View和Image的功能。该组件主要用于实现支持布局的图片加载功能。核心属性如下:

  • style:用于定义组件布局样式
  • imageStyle:用于定义内部图片样式
  • ref:指向组件实例的引用
  • imageRef:指向内部图片实例的引用

style属性控制组件布局特征:

  • 支持所有View组件的布局属性(如width、height、flexDirection等)
  • imageStyle属性控制图片渲染特征:
  • 支持resizeMode(如cover/stretch)
  • 支持borderRadius等图片特有样式
  • 典型配置示例:
javascript 复制代码
style={{ width: '100%', height: 150 }}  
imageStyle={{ resizeMode: 'cover', borderRadius: 12 }}

ref和imageRef

|----------|--------|-------------------------|
| 引用类型 | 指向对象 | 典型应用场景 |
| ref | 组件布局实例 | 调用View相关API(如measure) |
| imageRef | 内部图片实例 | 调用Image相关API(如prefetch) |

5、TextInput

①、字体样式属性

与Text组件一致

  • 字号:fontSize(如20、24)
  • 颜色:color(如red、#333)
  • 加粗:fontWeight: 'bold'
  • 包括下划线等装饰属性均相同

②、自动聚焦

  • 属性:autoFocus
    • true:页面加载后自动聚焦,键盘弹出
    • false:默认不聚焦
  • API:focus()
    • 需配合ref:useRef 构建 inputRef
    • 示例:useEffect + setTimeout 2秒后调用 inputRef.current.focus()
    • 效果:2秒后主动聚焦,键盘弹出

③、自动失焦

  • 属性:blurOnSubmit
    • true:点击提交(如"勾")后自动失焦,键盘收起
    • false:点击提交后键盘不收起
  • API:blur()
    • 示例:useEffect + setTimeout 2秒后调用 inputRef.current.blur()
    • 效果:2秒后主动失焦,键盘收起
  • 补充:后续可操作 Keyboard API 直接控制键盘

④、隐藏光标

  • 属性:caretHidden
    • true:隐藏光标,仍可输入
    • 默认值:false(显示光标)
  • 使用场景:不常用

⑤、默认输入

  • 属性:defaultValue
    • 设置默认内容:如"默认内容"
    • 效果:页面加载后自动显示,无需聚焦

⑥、可编辑性

  • 属性:editable
    • true:可编辑,可聚焦输入
    • false:不可编辑,无法调起键盘
  • 使用场景:控制输入框业务逻辑(如用户禁言、违规处罚)

⑦、键盘类型

  • default:常规文字输入
  • number pad / decimal pad:数字输入
  • email-address:邮箱输入(也可用 default)
  • phone-pad:手机号输入(也可用 number pad)

⑧、确定键配置

returnKeyType 属性

  • 功能:配置键盘右下角"确定键"的 图标与语义
  • 作用:向用户直观提示 下一步动作

⑨、最大长度

maxLength 属性

  • 功能:限制输入框的 最大字符数
  • 示例:maxLength={11} 限制输入11位手机号
  • 重要程度:极高,几乎每个 TextInput 组件都会使用,用于防止无限输入

⑩、多行输入

多行输入相关属性

  • 属性:multiline、numberOfLines

  • 作用:控制 TextInput 组件的多行输入与显示行为

  • multiline属性:允许输入多行,true:允许 输入多行文本,false:禁止 换行,始终单行输入

  • 对齐方式:多行输入时,内容默认 垂直居中,设置 textAlignVertical: 'top',使内容从 顶部 开始输入

  • numberOfLines属性:控制显示行数

⑪、相关回调:

焦点回调属性

  • 属性:onFocus、onBlur
  • 功能:监听输入框的 聚焦 与 失焦 事件

内容回调属性

  • 属性:onChange、onChangeText
  • 区别:
    • onChange:回调参数为 原生事件对象(含 target 等)
    • onChangeText:回调参数为 纯文本内容(更常用)

⑫、安全模式

属性定义

  • secureTextEntry:布尔值(true)
  • 功能:输入内容自动转为圆点(•••),隐藏明文
  • 限制:不可与 multiline=true 同时使用

6、TouchableOpacity

相当于一个 支持点击事件的 View,可包含多个子节点

属性:activeOpacity

  • 值范围:0 ~ 1
  • 含义:不透明度变化范围(从设定值变化到1)
    • 不透明度=1:完全不透明
    • 不透明度=0:完全透明

事件列表

  • onPress:点击事件(最常用)
  • onLongPress:长按事件(生产中使用较少,但会用到)
  • delayLongPress:长按延迟时间(number类型)

事件拆分

  • onPressIn:手指按下时触发
  • onPressOut:手指抬起时触发
  • 事件触发顺序:
    • 点击:onPressIn → onPressOut → onPress
    • 长按:onPressIn → onLongPress → onPressOut
  • 使用场景:大多数情况使用合成事件(onPress / onLongPress),极少数情况使用拆分事件

布局特性

  • 与 View 完全一致:可包含多个子元素,支持 flexbox 布局

7、TouchableHighlight

该组件具有高亮效果但使用频率较低

  • 子节点限制:仅支持单个React元素作为子节点
  • 必须实现onPress方法:否则无法触发点击效果
  • 样式控制:通过underlayColor属性设置点击高亮颜色,通过activeOpacity控制透明度变化阈值

8、Button

  • 特点:使用简单但样式固定,是React Native提供的标准点击组件
  • 优势:无需设置样式即可显示,比Touchable系列组件更便捷
  • 局限:无法自定义UI样式,只能使用系统默认样式

基本属性:

  • title属性:
    • 必需属性,类型必须为字符串
    • 设置按钮显示文字,如title="按 钮"
    • 不设置会报错"title prop must be a string"
  • color属性:
    • 设置按钮文字颜色,如color="green"
    • 接受颜色名称字符串或十六进制颜色值
  • onPress属性:
    • 点击回调函数,如onPress={()=>console.log('onPress')}
    • 点击时触发,与Touchable系列组件行为一致
  • disabled属性:
    • 布尔值,控制按钮是否可点击
    • true时按钮变灰不可点击,false可正常交互

9、Pressable

①、点击类事件与其他组件一致

  • 事件回调: 与其他点击组件相同,Pressable也使用onPress回调来处理点击事件
  • 兼容性: 是React Native新版本提供的组件

②、带状态样式与子节点

  • 状态回调: 样式可以写成回调函数形式,接收state参数,其中state.pressed表示按压状态
  • 子节点状态: 子节点也可以根据状态动态变化,通过回调函数返回不同的子组件

总结:

  • 适用场景: 当需要实现点击状态和非点击状态UI有明显差异时使用
  • 优势: 相比TouchableOpacity等组件,可以更灵活地实现复杂的状态切换效果
  • 选择建议: 简单效果使用Button或TouchableOpacity即可,复杂状态切换才使用Pressable
  • 实现原理: 通过state.pressed状态和样式回调实现UI的动态变化

10、ScrollView

①、ScrollView添加子节点的三种方式:

  • 固定子元素:直接编写静态子组件,例如多个<Text>标签
  • 列表渲染:通过map方法动态生成子组件,需为每个子项添加唯一key属性以优化性能
  • 数组渲染:通过函数返回预构建的组件数组,适用于动态生成大量子组件

②、contentContainerStyle属性功能:

  • 控制ScrollView内容容器的样式,支持所有View样式属性
  • 常用场景:
    • 设置内边距(如paddingHorizontal: 16)

③、滚动键盘消失keyboardDismissMode属性

|-------------|---------------------|--------------|
| 选项 | 行为 | 适用场景 |
| none | 滚动时键盘不消失 | 需保持输入状态时使用 |
| on-drag | 开始滚动时立即隐藏键盘 | 多数列表场景的默认选择 |
| interactive | iOS专属:滚动后键盘随手势交互式隐藏 | 仅需适配iOS平台时使用 |

④、点击收起键盘keyboardShouldPersistTaps属性

控制点击非输入区域时键盘的显隐行为

|--------|-------------|-----------------|
| 属性 | 键盘行为 | 按钮响应 |
| never | 首次点击按钮时收起键盘 | 第二次点击才触发onPress |
| handed | 点击按钮不收起键盘 | 立即触发onPress |

⑤、滚动相关

  • 滚动监听方法:
    • onMomentumScrollBegin:松手后滚动开始时触发
    • onMomentumScrollEnd:滚动停止时触发(可能多次回调)
  • 滚动距离监听onScroll方法:(iOS中scrollEventThrottle必须设置)
    • 监听内容:滚动距离(通过nativeEvent.contentOffset获取)
    • 参数解析:垂直滚动取y值,水平滚动取x值
  • 超出滚动:
    • never:滚动到头后禁止继续拖动
    • always:允许轻微弹性拉伸
  • 分页滚动和滚动方向:
    • horizontal属性:实现横向滚动列表
    • 分页滚动配置:
      • pagingEnabled:使滚动按整页停顿
      • 子元素宽度:需设置为屏幕宽度(通过Dimensions.get获取)
    • 分页滚动效果:松手后自动吸附到最近整页位置
    • 实现要点:子元素宽度必须与滚动容器宽度一致
    • 注意事项:实际开发应避免内联样式
  • 滚动开关:
    • scrollEnabled属性控制滚动开关,布尔值决定ScrollView是否允许交互滚动。true为启用滚动,false为禁用滚动。该属性功能单一但实用性强
  • 初始滚动:
    • contentOffset属性设置初始滚动位置,需传入包含x/y坐标的对象。纵向列表指定y值(如100),横向列表指定x值。该属性适用于需要默认定位到特定内容的场景,例如长列表的初始展示位置优化。
  • 是否展示滚动条:
    • showVerticalScrollIndicator:控制垂直滚动条
    • showHorizontalScrollIndicator:控制水平滚动条
      • 设置false可隐藏平台默认样式的滚动条。纵向列表示例中,showVerticalScrollIndicator设为false后右侧滚动条消失。
  • 吸顶元素:stickyHeaderIndices属性实现元素吸顶,需传入目标元素的索引数组。
    • 索引0使第一个元素(红色输入框)吸顶
    • 索引1使第二个元素(按钮)吸顶
    • 吸顶效果在滚动时会固定指定元素,后续将介绍更强大的SectionList组件实现分组吸顶。

⑥、核心API

  • scrollTo:滚动到指定坐标(需通过useRef获取组件实例)
  • scrollToEnd:滚动至列表末尾
  • 调用示例:scrollViewRef.current.scrollTo({y: 300, animated: true})

11、FlatList

①、基础使用

  • 组件特点:FlatList是React Native提供的高性能列表组件,相比ScrollView更适合渲染大量数据
  • 优化原理:采用局部渲染机制,仅创建当前屏幕可见区域元素,其他区域会进行回收和复用
  • 核心属性:必须配置三个基础属性才能正常使用:data、renderItem和keyExtractor

②、滚动属性(参考ScrollView)

  • contentContainerStyle与style的区别:
    • style属性用于设置整个FlatList的样式
    • contentContainerStyle用于设置FlatList内容容器的样式,与ScrollView的用法相同
  • 隐藏垂直滚动条:
    • 使用showsVerticalScrollIndicator={false}属性
  • 滚动监听:
    • 使用onScroll事件回调
    • 通过event.nativeEvent.contentOffset获取滚动位置
  • horizontal属性:
    • 控制列表是横向(true)还是纵向(false)滚动
    • 默认值为false(纵向滚动)

③、表头、表尾、空元素

ListHeaderComponent和ListFooterComponent:头部始终显示在首项之前,尾部固定在内容末尾,不受滚动影响。ListEmptyComponent用于在列表数据为空时显示占位内容。它们都是直接返回React元素即可。

④、分隔线:ItemSeparatorComponent属性

⑤、多列布局:通过numColumns指定列数

⑥、可见元素回调

  • 当需要实时获取列表当前滚动位置对应的元素时使用,特别是在元素高度不一致或需要精确跟踪滚动位置的情况下
  • 与onScroll区别:onScroll只能获取像素级偏移量,而onViewableItemsChanged可以直接获取元素索引,无需计算元素高度
  • 回调参数:接收info对象,可通过解构获取viewableItems数组
  • 数组第0个元素:当前可视区域最顶部的可见项
  • 数组最后一个元素:当前可视区域最底部的可见项

⑦、滚动API

  • scrollToIndex():推荐使用,通过索引定位元素
  • 参数配置:
    • index: 指定目标元素的索引(从0开始)
    • viewPosition: 控制元素在视口中的位置(0顶部,0.5居中,1底部)
    • animated: 是否启用动画过渡效果(true/false)
  • scrollToOffset():按像素值滚动指定距离,精确控制滚动位置时使用
  • scrollToEnd():快速滚动到列表底部

12、SectionList

  • 核心组件:SectionList是React Native提供的多类型分组列表组件,继承自FlatList但增加了分组功能
  • 数据特点:支持不同类型数据的分组显示,常用于通讯录、分类商品等场景
  • 数据结构:必须是一个数组,每个元素是对象且必须包含data属性

①、renderItem

参数解构:可获取item(当前项)、index(在分组中的索引)、section(所属分组对象)

②、keyExtractor

  • 作用机制:与FlatList相同,为列表项生成唯一key
  • 推荐方案:组合item内容和index生成key,如{item}-{index}
  • 注意事项:必须保证key的唯一性,否则会导致渲染错误

③、分组头部

renderSectionHeader:通过{section}参数可获取当前分组数据

④、分组吸顶

  • 属性:stickySectionHeadersEnabled
  • 效果说明:当前分组头部会固定在顶部直到被下一分组头部顶替
  • 使用建议:在需要分组导航的场景都应开启此属性
  • 启用方式:只需设置为true即可stickySectionHeadersEnabled={true}

⑤、滚动API

scrollToLocation()

  • 特殊参数:需要同时指定sectionIndex和itemIndex
  • 定位规则:
    • sectionIndex:分组索引(从0开始)
    • itemIndex:包含分组头部的完整索引(头部为0)

13、RefreshControl

①、下拉刷新

RefreshControl组件核心属性

  • refreshing:布尔值,表示当前是否正在刷新
    • 状态管理:useState → const refreshing, setRefreshing = useState(false)
    • 初始值:false(默认未刷新)

onRefresh 逻辑

  • 触发时机:下拉松手后
  • 核心操作:请求最新数据
  • 流程:
    • 设置 setRefreshing(true)(标记刷新中)
    • 发起网络请求(request new data)
    • 请求完成 → setRefreshing(false)(结束刷新状态)

②、上拉加载

属性说明

  • 归属:onEndReached 和 onEndReachedThreshold 属于列表组件,非RefreshControl
  • 关联性:上拉加载与下拉刷新成对出现
  • onEndReached:回调函数,列表滚动到底部时触发 → 加载下一页数据

onEndReached 逻辑

  • 触发时机:列表滚动至尾部
  • 核心操作:请求下一页数据(request next page data)

onEndReachedThreshold 属性

  • 作用:定义触底阈值(何时触发 onEndReached)
  • 取值范围:0 ~ 1
  • 含义:距离底部占屏幕高度的比例
    • 例如: 0.1 → 距离底部还剩10%屏幕高度时触发

14、Modal

  • Modal组件:特殊组件,用于承载弹窗内容,实现自定义弹窗
  • 本质:容器,自身不显示UI,用于承载子元素

①、控制显示

  • 核心属性:visible
  • 作用:控制弹窗的显示/关闭状态

②、关闭弹窗

onRequestClose:

  • onRequestClose:回调方法,非关闭Modal本身
  • 关闭方式:通过 setVisible(false) 或调用 hideModal 方法
  • 安卓:点击物理返回键,触发 onRequestClose 回调
  • iOS:无物理返回键,不走 onRequestClose,通过UI交互关闭

③、背景透明

  • 属性:transparent
  • 作用:使Modal背景透明,露出底层页面内容

④、状态栏透明

  • 解决方案:设置属性 statusBarTranslucent = true
  • 效果:
    • 状态栏与Modal内容融为一体
    • 状态栏背景透明度与弹窗半透明背景一致
    • 避免UI从状态栏处割裂

⑤、动画方式

  • 属性:animationType
  • 三种选项:
    • none:无动画,直接弹出(默认,效果突兀)
    • fade:渐变效果,渐隐渐现,较为柔和
    • slide:滑动效果,从底部拉出/拉下,更自然
  • 选型建议:
    • 底部弹窗(列表、半页面):推荐 slide
    • 中间弹窗(对话框):推荐 fade

⑥、状态回调

  • 回调方法:
    • onShow:Modal出现时触发
    • onDismiss:Modal隐藏时触发

15、StatusBar

①、深浅模式

  • 模式选择: 提供三种选项:dark-content(深色内容)、default(默认)和light-content(浅色内容)
  • 作用对象: 控制状态栏上文字/图标的颜色,而非状态栏背景色
  • 颜色限制: 仅支持黑白两色,不支持自定义其他颜色(如红色/蓝色)
  • 效果对比:
    • dark-content:深灰色文字(默认效果)
    • light-content:白色文字(需搭配深色背景)

②、背景颜色

  • 搭配原则: 必须与barStyle形成对比
    • dark-content + 浅色背景(如白色)
    • light-content + 深色背景(如#303030)
  • 透明度支持: 支持半透明(如#60303030)和全透明(transparent)
  • 动态修改: 可通过backgroundColor属性或setBackgroundColor()API修改

③、透明悬浮

  • 平台差异:
    • Android默认独占位置
    • iOS默认悬浮显示
  • translucent属性:
    • true:状态栏悬浮,页面内容可穿透到状态栏区域
    • false:状态栏独占顶部区域(Android默认)
  • 沉浸式实现: 需配合translucent=true和透明背景色
  • 布局调整: 启用后页面布局从屏幕最顶端开始

④、隐藏状态栏

  • hidden属性:
    • true:完全隐藏状态栏
    • false:显示状态栏
  • 动画效果: 显示/隐藏时有平滑过渡动画
  • 使用场景: 适用于全屏拍照/录像等特殊页面

⑤、API

  • 对应关系:
    • setBackgroundColor() ↔ backgroundColor属性
    • setBarStyle() ↔ barStyle属性
    • setHidden() ↔ hidden属性
    • setTranslucent() ↔ translucent属性
  • 调用方式: 通过ref引用组件后调用
  • 等效性: API与属性设置效果完全相同

16、Switch

①、开关切换

  • value控制:通过value属性控制开关状态,true表示开启,false表示关闭
  • 状态回调:使用onValueChange回调函数获取状态变化,回调参数为新的value值

②、设置不可用

  • disabled属性:设置为true时组件变为灰色不可操作状态
  • 应用场景:当用户无权限或功能过期时禁用开关
  • 注意:禁用状态仍需保持value值的正确性

③、背景颜色

  • trackColor:需设置为对象格式 {true: '开状态颜色', false: '关状态颜色'}
  • 实现原理:背景轨道颜色会随开关状态自动切换

④、前景颜色

  • thumbColor:控制开关滑块的圆形背景颜色
  • 特殊性质:与trackColor不同,只接受单一颜色值
  • 动态实现:可通过三元运算符实现状态相关颜色

到这里本篇笔记就结束了,简单做个总结吧:

|--------------------------|--------|----------------|---------|
| 组件类型 | 核心功能 | 关键特性 | 应用场景 |
| View | UI构建基石 | 基础容器组件 | 所有页面布局 |
| Text | 文本显示 | 使用简单但深度复杂 | 文字内容展示 |
| Image | 图片加载 | 支持静态/网络资源 | UI视觉元素 |
| ImageBackground | 背景图片 | View+Image组合优化 | 带背景的容器 |
| TextInput | 输入交互 | 官方唯一输入组件 | 表单/搜索框 |
| TouchableOpacity | 点击反馈 | 透明度变化效果 | 通用按钮交互 |
| TouchableHighlight | 高亮反馈 | 多样化视觉效果 | 特殊按钮需求 |
| TouchableWithoutFeedback | 无效果点击 | 无视觉反馈 | 特殊场景交互 |
| Button | 标准按钮 | 预设样式 | 基础表单提交 |
| Pressable | 高级交互 | 支持复杂手势 | 自定义交互组件 |
| ScrollView | 内容滚动 | 基础滚动容器 | 长内容展示 |
| FlatList | 高性能列表 | 自动内存优化 | 大数据量渲染 |
| SectionList | 分组列表 | 多类型数据支持 | 分类数据展示 |
| RefreshControl | 刷新控制 | 下拉刷新功能 | 列表数据更新 |
| Modal | 弹窗组件 | 浮动内容容器 | 对话框/浮层 |
| StatusBar | 状态栏适配 | 系统状态栏控制 | 界面沉浸式适配 |
| Switch | 开关切换 | 二进制选择器 | 设置选项切换 |

下期再会!

相关推荐
杉氧3 小时前
打破边界(二):在 React Native 中嵌入原生 UI 组件 (Native UI Components)
android·前端·react native
光影少年1 天前
如何做大型React+RN 项目架构设计、目录规范
前端·react native·react.js
不爱吃糖的程序媛1 天前
从 0 到 1:react-native-transformer-text-input 鸿蒙化适配实录
react native·transformer·harmonyos
不爱吃糖的程序媛1 天前
React Native 三方库鸿蒙适配实战:react-native-emoji-popup(Fabric 自定义组件)从 0 到 1
react native·harmonyos·fabric
搬砖的kk1 天前
从 0 到 1:react-native-screenshot-aware 鸿蒙适配实战(RNOH 0.84)
react native·华为·harmonyos
光影少年1 天前
从输入URL到页面渲染,React/RN 整体加载流程
前端·javascript·react native·react.js·前端框架
光影少年2 天前
react navite 简单原生方法双向调用示例
javascript·react native·react.js