Install
openclaw skills install component-api-designDesigns reusable React/Vue component APIs and file structure for clarity, flexibility, and maintainability. Use when 设计组件, 组件API, 封装组件, component design, or defining props/slots/events.
openclaw skills install component-api-design设计易用、可扩展、易维护的组件 API 与文件结构,提升后续开发效率。
| 原则 | 说明 |
|---|---|
| 必要才加 | 能由 children/组合表达的不要变成 prop |
| 命名一致 | 用项目约定:value/onChange、open/onOpenChange、disabled 等 |
| 类型明确 | TypeScript 定义清晰,必填/可选、联合类型写清 |
| 可控与不可控 | 若支持受控,则 value + onChange 成对;可提供 defaultValue 做非受控 |
| 避免冗余 | 能从现有 props 推导的不再单独提供(如 loading 时 disabled 可内部处理) |
ComponentName/index.tsx(入口)ComponentName/ComponentName.tsx(实现)ComponentName/types.tsComponentName/styles.module.scssComponentName/SubPart.tsx(内部子组件)| 用户描述 | 实际需求 | 第一步 |
|---|---|---|
| 「设计这个组件」「新建一个组件」 | 从零设计 | 问:这个组件是通用组件还是业务组件?会在几个地方用? |
| 「这个组件 API 怎么改」「props 太多了」 | 改现有组件 | 先读现有代码,找出问题所在,再给改法 |
| 「props 怎么设计」「要不要用 children」 | 具体设计决策 | 直接给出该场景的推荐和理由 |
| 「要不要拆组件」 | 拆分决策 | 问:是因为文件太长,还是因为逻辑复用需要?两个原因的拆法不同 |
设计前必须知道:
通用组件和业务组件的设计原则不同:
| 通用组件 | 业务组件 | |
|---|---|---|
| props | 尽量少,保持中性 | 可以有业务语义 |
| 样式 | 支持 className 覆盖 | 可以写死 |
| 数据获取 | 不做,由外部传入 | 可以自己请求 |
| 复杂度 | 宁可简单,不要过度设计 | 按业务需要 |
遇到这些情况,给出明确建议:
「要不要加这个 prop」
children 或组合表达的 → 不加 prop(如 <Button icon={<Icon />}> 优于 <Button iconName="star">)「布尔 prop 还是枚举」
disabled、loading)variant="primary|secondary|ghost" 优于 isPrimary isSecondary isGhost)「受控还是非受控」
value + onChangedefaultValuevalue/onChange 和 defaultValue,内部用 useControllableState「要不要透传 HTML 属性」
...rest 传给原生元素className 和 stylearia-*、data-*、事件监听只给正确做法不够,要说明什么是错的:
// ❌ 错:用字符串传图标名,组件内部耦合图标库
<Button iconName="star" />
// ✅ 对:用 children 或 render prop,调用方决定用什么图标
<Button icon={<StarIcon />} />
// ❌ 错:一堆布尔 prop,互斥关系不清晰
<Button isPrimary isLarge isRounded />
// ✅ 对:枚举表达变体,组合表达修饰
<Button variant="primary" size="lg" rounded />
.tsx 文件Button/
├── index.tsx # 导出入口
├── Button.tsx # 实现
├── types.ts # Props 类型
└── Button.module.css
## 组件设计:{组件名}
### 职责
- 一句话描述组件用途与使用场景
### API(Props)
| 属性 | 类型 | 必填 | 默认 | 说明 |
|------|------|------|------|------|
| … | … | … | … | … |
### 事件/回调
| 事件 | 参数 | 说明 |
|------|------|------|
| … | … | … |
### 插槽/扩展
- default:…
- 其他具名插槽:…
### 使用示例
\`\`\`tsx
<ComponentName ... />
\`\`\`
### 文件结构
- 路径与主要文件说明
className,内部用 cn() 合并