name: fexd-mobile description: >- React 移动端 H5 组件库 @fexd/mobile 的完整使用指南。涵盖 127 个公开导出/工具的用法、 代码片段、主题定制、样式修改、架构设计。当用户使用 @fexd/mobile 开发页面、查找组件 用法、定制主题、修改样式、查询 API 时使用。触发词:fexd、@fexd/mobile、fexd-mobile。
metadata: author: FEXD Team version: '2026.06.02' source: packages/mobile/src/exports/
@fexd/mobile 使用指南
文档基于 @fexd/mobile v0.1.34,更新于 2026-06-02。
React 移动端 H5 组件库,127 个公开导出,覆盖输入、反馈、布局、展示、导航等场景。
Skill 导览
按任务场景选择对应文档,避免全量阅读:
| 场景 | 应读文件 |
|---|---|
| 选组件 / 不确定用哪个 | decision-map.md → catalog.md |
| 使用某个组件 | references/{ComponentName}.md |
| 理解组件家族(IO/Modal/Picker 变体) | families/ 目录 |
| 弹层 / Modal 相关 | systems/modal-system.md → 具体 reference |
| 表单开发 | systems/form-system.md → references/Form.md |
| 选择器相关 | systems/picker-system.md → 具体 reference |
| IO 控制机制 | systems/io-control-system.md |
| 业务场景模式(表单页/弹窗组合/三态处理) | recipes/ 目录 |
| 查完整 Props | references/{ComponentName}.md 或 source-navigation.md → 源码 type.tsx |
| 改主题 / 样式 | theming.md + references/{ComponentName}.md 样式定制章节 |
| 理解架构 | architecture.md |
| 使用 hooks / 工具 | utilities.md |
Skill 注册
消费项目安装 @fexd/mobile 后,通过 @fexd/tools 统一注册 skill 到各 AI Agent:
fexd-tools skills install
该方法会扫描 node_modules 和 workspace 包中所有符合规范的 skills/*/SKILL.md,同时注册 fexd-mobile、fexd-tools 及其他依赖包发布的 skills。也可在 package.json 中添加 prepare:skills 脚本实现自动化注册。
推荐实践
- 新建应用入口时用
<Provider>包裹根组件(已有项目中无需重复提及) - 表单输入场景使用 IO 变体(
Line*/Block*/Cell*),具体选哪种跟随项目已有风格;如果项目中没有先例,查看设计稿或问用户偏好 - 简单确认对话用
showDialog,复杂面板用showPopup,不需要阻断交互的反馈用toast - 命令式 API(showModal / toast / loading)优先于声明式,减少状态管理
- 样式定制首选 Less 变量覆盖,避免直接写 CSS 选择器覆盖
- 禁止使用有
.developing标记的组件(未导出、API 不稳定)
反幻觉规则
生成 @fexd/mobile 代码时必须遵守:
- 不要按其他组件库的习惯幻觉 Props:@fexd/mobile 不是 antd-mobile、Ant Design、MUI 或 React Native。不要假设 Button 有
danger属性(用type="danger")、不要假设 Form 有Form.Item(用Form.Field)、不要假设 Dialog 有Dialog.confirm(用showDialog)。 - 不确定的 Prop 先查证:如果某个 Prop 没有在 reference 文档中找到,按 source-navigation.md 去源码
type.tsx确认。仍然找不到则声明不确定,不要猜。 - 不要编造不存在的组件:开发中组件清单在下方「不可用组件」一节,如果用户要用的组件在此清单中,必须明确告知不可用并推荐替代方案。
- 不要假设行为与 Ant Design 一致:
Form.useForm()返回实例而非数组、Form.Field用 render prop 而非Form.Item、校验规则是函数而非规则对象。
需求澄清
当用户需求包含以下模糊词时,先给出选型分析和推荐方案,再编码。如果你有足够上下文判断意图,可直接给出推荐方案并说明理由,无需反复追问。
- "弹窗" → 确认操作?用
showDialog。复杂内容面板?用showPopup。多选项操作菜单?用showActionSheet。不确定?列出三种方案让用户选。 - "选择" → 单列选项?
Picker。多级联动(如省市区)?CascadePicker。日期?DatePicker。时间?TimePicker。具体 IO 变体(Line*/Block*/Cell*)跟随项目已有风格。 - "输入" → 单行文本?
Input。多行?TextArea。密码?Input+type: 'password'。数值?Stepper或Input+inputMode: 'decimal'。具体 IO 变体跟随项目已有风格。 - "表单" → 先确认字段列表和类型,再选用对应的 IO 变体。提交目标(接口/本地)影响提交逻辑。
- "列表" → 静态数据直接 map 渲染。需要下拉刷新/无限滚动?
ScrollView。带分组?Cell.Group。
多步骤任务
遇到以下复杂场景时,按步骤执行,每步确认后再进入下一步。
搭建表单页面:
- 确认字段列表和类型 → 查看项目已有 IO 变体风格,对每个字段选用对应变体
- 搭建骨架 →
<Form form={Form.useForm()}>+ 每个字段的<Form.Field> - 绑定控制器 →
field.value/field.setValue/field.validate()/field.error - 提交逻辑 →
await form.validate()→form.getValues()→ 调接口 →toast.success - 样式定制 → Less 变量覆盖或 className
弹窗交互流程(按钮 → 确认 → 操作 → 反馈):
- 选弹窗类型 →
showDialog(确认)/showPopup(复杂内容)/showActionSheet(多选项) - 触发逻辑 →
const dialogController = showDialog({ actions: [{ content: '确认', onClick: () => { dialogController.close(); ... } }] }) - 异步操作 →
loading.show()→try { await action() } finally { loading.hide() }(成对调用) - 结果反馈 →
toast.success('完成')或toast.fail('失败')
组件文档
每个组件的详细用法、Props、代码示例、样式定制均在 references/ 目录中,按组件名命名:
references/{ComponentName}.md # 基础用法 + Props + 样式定制
references/{ComponentName}-advanced.md # 高级用法(仅复杂组件)
references/{ComponentName}-design.md # 设计思路和 DOM 结构(仅复杂组件)
查找某个组件的用法时,直接读取 references/{ComponentName}.md。
Import 规范
import { Button, Modal, toast, Input } from '@fexd/mobile'
样式引入(选其一):
// Less 全量引入(推荐)
@import '~@fexd/mobile/es/style.less';
// babel-plugin-import 按需引入
;[
'import',
{ libraryName: '@fexd/mobile', libraryDirectory: 'es/exports', style: (name) => `${name}/style.less` },
'@fexd/mobile',
]
分类概览 → catalog.md
127 个公开导出按功能分为 6 大类,含描述、关联、坑点、选型建议。
| 分类 | 导出数 | 典型组件 |
|---|---|---|
| 输入类 | 48+ | Button, Input, Form, Picker, DatePicker, CascadePicker, Line/Block/Cell 变体 |
| 反馈类 | 20+ | Modal, Dialog, Popup, toast, notify, loading, show*/useShow* |
| 布局类 | 9 | Cell, Collapse, Grid, ScrollView, Space |
| 展示类 | 20+ | Alert, Badge, Swiper, Steps, Transition* 动画组件 |
| 导航类 | 3 | NavBar, TabBar, Tabs |
| 其他/基础 | 6+ | Provider, Portal, ErrorBoundary |
工具函数(Hooks / 工厂 / 命令式 API)→ utilities.md
架构速览
IO 四层分层(仅表单类组件): Label(视觉) → IOLabel(字段逻辑) → UnstyledIO(输入能力) → Line*/Block*/Cell*(主题注入)。3 种布局 × 4 种输入 = 12 个组件。非表单组件(Button、Modal 等)不涉及此分层。详见 architecture.md。
Modal 体系: Portal → Overlay → BasicModal → Modal。支持声明式 <Modal> 和命令式 showModal()。互斥控制通过 modalConflict 实现。详见 architecture.md。
Transition 系统: createTransition 工厂 + 7 个内置过渡动画。速度预设 none/fastest/fast/normal/slow/slowest。
主题定制 → theming.md
- Less 变量覆盖(推荐)
- CSS 变量方案(实验性)
- 组件级样式修改 4 种策略
- 全局设计变量速查
源码导航 → source-navigation.md
npm 包含完整源码(src/),当组件文档不够详尽时可直接在 node_modules/@fexd/mobile/src/ 中读取源码补充。
不可用组件
以下 31 个组件处于开发阶段,未从 @fexd/mobile 导出,禁止使用:
Breadcrumb, Calendar, Card, Cascader, CountDown, CountTo, Drag, Drawer, Dropdown, Elevator, Footer, Gallery, ImagePicker, List, Marquee, Menu, NoticeBar, NumberKeyboard, Pagination, Search, SegmentedControl, ShareSheet, Skeleton, Sticky, SwipeAction, Table, Tag, Tips, TreeSelect, Video, Waterfall
回复前自检
生成 @fexd/mobile 相关代码后,仅检查与本次改动相关的项:
- 禁用组件:未使用上方「不可用组件」清单中的任何组件
- 命令式优先:简单反馈用
showDialog/toast/loading等命令式 API,而非声明式 +useState - IO 变体一致性:表单类组件的 IO 变体与项目已有风格保持一致
- 坑点提示:提到了所用组件的关键注意事项(如
loading.show/hide必须成对、Form.useForm()返回实例而非数组) - Props 准确性:未使用 reference 文档和源码中不存在的 Props。如有不确定,声明不确定而非猜测
- 组件选型:选了最合适的组件而非第一个看起来能用的。相似组件间的选型参考了 decision-map.md