- UI组件
- 移动开发
- 前端
【免费下载链接】react-native-elements
Cross-Platform React Native UI Toolkit
Badge 是 React Native Elements 中用于向用户传达数值或条目状态的小型组件,本文以 version-2.3.2/badge.md 文档为骨架,结合仓库内packages/base/src/Badge/的源码实现与测试用例,系统讲解标准徽标、Mini 状态点、withBadge 高阶组件的全部 Props、定位参数与底层渲染原理。读完本文,你将能够在消息列表、购物车、头像与图标上快速构建带角标的状态指示方案。
一、Badge 是什么,何时使用
Badge 是典型用于向用户传达数值(如未读消息数 "99+")或条目状态(如在线、离线)的小型组件。在 React Native Elements 中它由三个导出成员组成:
Badge:基础组件本身;withBadge:高阶组件(HOC),用于给任意组件(图标、按钮等)快捷附加角标;BadgeProps:类型定义,供 TypeScript 用户扩展。
三者均从 packages/base/src/Badge/index.tsx 导出,并在 packages/themed/src/Badge/index.tsx 中通过withTheme包装后作为主题化组件对外使用。
二、安装与导入
从react-native-elements(或@rneui/themed)导入:
import { Text, View } from 'react-native'; import { Avatar, Badge, Icon, withBadge } from 'react-native-elements';当前仓库示例应用 example/src/views/badge.tsx 中使用的则是@rneui/themed导入路径,二者导出同名 API。
三、标准徽标(Standard Badge)
标准徽标通过value展示文本(字符串或数字),通过status控制背景色:
<Badge value="99+" status="error" /> <Badge value={<Text>My Custom Badge</Text>} />value的类型非常灵活:字符串、数字或任意 React Native 组件均可。当传入 React 组件时,Badge.tsx 内部会调用renderNode(Text, value, {...})把它渲染到徽标内部——renderNode是仓库 packages/base/src/helpers/renderNode.tsx 提供的通用节点渲染工具,会自动把字符串包装成Text、把元素直接复用、把组件实例化,并在未传任何值时返回null(这正是 Mini Badge 的触发条件)。
status可取四个枚举值:primary、success、warning、error,默认primary。在源码中背景色取自已注入的主题:
backgroundColor: theme?.colors?.[status],也就是说,颜色并非写死的常量,而是跟随主题色板(lightColors/darkColors)动态解析,这在 packages/base/src/Badge/tests/Badge.test.tsx 的 Mini badge 用例中得到验证:测试逐一断言四种status渲染出的背景色与lightColors[status]完全一致。
四、Mini Badge:不带 value 的状态点
当不提供value属性时,Badge 自动退化为更小的圆点形态,适合表达"在线/离线/有通知"等纯状态语义:
<Badge status="success" /> <Badge status="error" /> <Badge status="primary" /> <Badge status="warning" />两种形态的尺寸差异在源码中定义得很明确(Badge.tsx):
| 形态 | 尺寸常量 | 实际尺寸 | 触发条件 |
|---|---|---|---|
| 标准徽标 | size = 18 | 最小宽度/高度 18,圆角18 / 2 | 存在value渲染结果 |
| Mini Badge | miniSize = 8 | 最小宽度/高度 8,圆角8 / 2 | renderNode返回null |
具体逻辑为:
{!element && styles.miniBadge}即value为空时额外套用styles.miniBadge(去除水平/垂直内边距并缩小到 8×8)。
五、Badge as Indicator:叠加到头像与任意元素上
将 Badge 与containerStyle中的绝对定位结合,即可让它"挂"在任意组件角落作为指示器。官方示例:
<View> <Avatar rounded source={{ uri: 'https://randomuser.me/api/portraits/men/41.jpg' }} size="large" /> <Badge status="success" containerStyle={{ position: 'absolute', top: -4, right: -4 }} /> </View>这里的关键是理解 Badge 的 DOM 结构:外层是containerStyle作用的外壳View(testID 为RNE__Badge__Container),内层才是badgeStyle作用的徽标本体。因此:
containerStyle负责外部布局(绝对定位、偏移、与宿主元素的相对关系);badgeStyle负责徽标本体视觉(背景色、尺寸、圆角)。
在 example/src/views/badge.tsx 中,同一个思路还被用于头像叠加value={10}的数字角标,以及配合withBadge生成带数字的图标。
六、withBadge 高阶组件:一键给图标/按钮加角标
withBadge让你无需手写绝对定位,直接包装任意组件即可获得角标:
const BadgedIcon = withBadge(1)(Icon); <BadgedIcon type="ionicon" name="ios-chatbubbles" />它同样支持函数形式的 value——函数接收被包装组件的props作为参数,返回值作为徽标内容,非常适合从 Redux 等状态容器动态计算未读数量:
// 使用装饰器提案(babel-plugin-transform-decorators-legacy) @connect(state => ({ notifications: state.notifications, })) @withBadge(props => props.notifications.length) export default class MyDecoratedIcon extends React.Component { render() { return ( <Icon type="ionicon" name="md-cart" /> ); } }withBadge的签名与实现位于 packages/base/src/Badge/withBadge.tsx:
withBadge(value, options)(WrappedComponent)其内部做了四件关键工作:
- 解构定位参数:
bottom、left、right、top、hidden、containerStyle从options中取出,其余字段全部作为BadgeProps透传给内部<Badge>; - 按形态切换默认偏移:当存在
value时默认right = -16、top = -1;当value为空(Mini 形态)时自动改为right = -3、top = 3,使小圆点贴合宿主元素右上角; - 动态求值:
const badgeValue = typeof value === 'function' ? value(props) : value;; - 条件渲染:
hidden为true时不渲染徽标,但保留被包装组件。
此外它还会生成可读的显示名:WithBadge(Icon)这样的displayName(基于WrappedComponent.displayName || WrappedComponent.name),便于调试与 React DevTools 排查。
withBadge 的 options 参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
bottom | number(可选) | undefined | 徽标距底部的偏移 |
left | number(可选) | undefined | 徽标距左侧的偏移 |
right | number(可选) | -16(Mini 形态为-3) | 徽标距右侧的偏移 |
top | number(可选) | -1(Mini 形态为3) | 徽标距顶部的偏移 |
hidden | boolean(可选) | false | 为true时隐藏徽标 |
containerStyle | View style(可选) | 内部样式 | 附加到徽标外层容器 |
options同时接收 [Badge 的全部 Props](#badge 组件 Props 全表)(见 website/versioned_docs/version-2.3.2/badge.md#props)。
例如,自定义偏移与显式 value 的写法:
const BadgedComponent = withBadge(1, { top: 0, bottom: 5 })(TouchableOpacity);这正是 packages/themed/src/Badge/tests/withBadge.test.tsx 中验证的场景:测试断言最终渲染出的RNE__Badge__Container样式对象包含top: 0与bottom: 5,确认 options 的定位参数被正确应用。
七、Badge 组件 Props 全表
badgeStyle
附加到徽标(背景)视图的样式,可选。
| 类型 | 默认值 |
|---|---|
| View style(对象) | 内部样式 |
containerStyle
外层容器的样式,可选,常用于绝对定位角标。
| 类型 | 默认值 |
|---|---|
| View style(对象) | 内部样式 |
onPress
点击徽标时触发的回调函数。
| 类型 | 默认值 |
|---|---|
| function | 无 |
status
决定指示点的颜色。
| 类型 | 默认值 |
|---|---|
primary、success、warning、error | primary |
textProps
透传给内部Text组件的额外属性,可选(如testID、numberOfLines等)。
| 类型 | 默认值 |
|---|---|
| Text props(对象) | 无 |
textStyle
徽标内文本的额外样式,可选。内部默认文本样式为fontSize: 12、color: 'white'、paddingHorizontal: 4,传入的textStyle会与之合并。
| 类型 | 默认值 |
|---|---|
| Text style(对象) | 内部样式 |
value
徽标显示的内容,缺省时呈现 Mini 形态。
| 类型 | 默认值 |
|---|---|
| String / Number / React Native Component | 无 |
Component
用于替换徽标外层组件的自定义组件。
| 类型 | 默认值 |
|---|---|
| React Native Component | View;若传入onPress等按压回调则自动切换为可点击组件 |
需要说明:当前仓库源码(Badge.tsx)中该默认值已演进为——
Component = onPress || onLongPress || onPressIn || onPressOut ? Pressable : View,即同时监听onPress、onLongPress、onPressIn、onPressOut四个按压回调中的任意一个,就会把默认外壳从View切换为 React Native 的Pressable。早期 2.3.x 文档描述的默认值为TouchableOpacity,实际以你安装版本对应的源码为准。自定义组件示例:
<Badge value={10} Component={TouchableWithoutFeedback} />对应测试见 packages/base/src/Badge/tests/Badge.test.tsx。
八、源码实现细节:从渲染到测试
8.1 内部结构
Badge 采用"容器 + 徽标"两层结构(Badge.tsx):
- 外层
View:testIDRNE__Badge__Container,应用containerStyle; - 内层
Component:testIDRNE__Badge,应用内联基础样式(alignSelf: 'center'、minWidth: size、height: size、borderRadius: size / 2、主题背景色、白色 hairline 边框)后再合并badgeStyle。
8.2 按压交互
传递onPress后组件变为可点击,测试用例 Badge.test.tsx 通过fireEvent.press断言回调被调用一次,验证了交互链路可用。
8.3 主题化封装
@rneui/themed的 Badge 通过withTheme<BadgeProps>(Badge, 'Badge')接入全局主题系统(packages/themed/src/Badge/index.tsx),因此status颜色会随应用主题(浅色/深色)自动切换。
8.4 完整实战示例
仓库示例应用 example/src/views/badge.tsx 一次性覆盖了本文全部三种形态:一行value="3"等数字徽标、一行无value的四色 Mini 点、以及"头像 + 角标 + BadgedIcon"的组合布局,可直接作为复制起点运行查看效果。
九、总结
围绕 version-2.3.2/badge.md 的核心能力,可以总结出三条实践准则:
- 表达数量用标准徽标:给
value传字符串/数字/组件,用status选择语义色; - 表达状态用 Mini Badge:不给
value,组件自动缩为 8×8 状态点,配合containerStyle绝对定位即可叠加到头像、列表项等任意宿主上; - 批量接入用 withBadge:静态值、基于 props 的函数值、
hidden开关与四向偏移(top/left/right/bottom)覆盖了绝大多数角标需求,还能与装饰器语法、Reduxconnect组合使用。
相关源码与测试文件:组件实现 packages/base/src/Badge/Badge.tsx、HOC 实现 packages/base/src/Badge/withBadge.tsx、单元测试 packages/base/src/Badge/tests/Badge.test.tsx、示例页面 example/src/views/badge.tsx。
- UI组件
- 移动开发
- 前端
【免费下载链接】react-native-elements
Cross-Platform React Native UI Toolkit
相关推荐
如何用ok-ww实现《鸣潮》全自动化:新手终极指南
如何用ok ww实现《鸣潮》全自动化:新手终极指南 想象一下这样的场景:忙碌的工作日晚上,你刚刚结束一天的工作,身心疲惫地坐在电脑前,看着《鸣潮》中堆积如山的日
UI组件移动开发前端tldr-pages仪表盘:可视化监控界面
tldr pages仪表盘:可视化监控界面 tldr pages作为一个社区维护的命令行工具速查手册项目,拥有海量的命令示例和多语言支持。为了更好地监控项目状态
UI组件移动开发前端KoELECTRA-small-v3-modu-ner应用场景大全:从新闻分析到智能客服的5个实用方向
KoELECTRA small v3 modu ner应用场景大全:从新闻分析到智能客服的5个实用方向 KoELECTRA small v3 modu ner是
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考