自定义组件
我们区分两种自定义组件类型,它们各自有不同的流程和预期。
组件类型
A) 项目特定自定义组件
为特定项目或页面构建的组件,不打算在其他项目中复用。
示例:
一种
Box带有特殊布局,仅在一个项目中使用一种
Card为某个项目页面定制布局的变体项目特定的数据可视化
一次性布局组件
何时使用:
组件解决了某个项目独有的问题
不太可能在其他项目中需要
过于具体,无法泛化
B) UI2 候选组件
旨在在多个项目和产品中复用的组件。
示例:
Navbar- 全站导航UserMenu- 用户账户菜单标准化
Modal对话框正在从 UI1 迁移的组件
何时使用:
组件将被用于多个项目
代表一种常见的 Decentraland 模式
替换或扩展一个 UI1 组件
项目特定组件
要求
以 MUI 为基础
必须 尽可能扩展现有 MUI 组件:
不要分叉或重复实现 MUI 已经覆盖的模式:
使用
Card而不是创建带阴影的自定义 box使用
Button而不是创建样式化的 anchor使用
TextField而不是创建自定义输入框扩展
Dialog而不是创建自定义模态框
仅使用主题值
必须 使用 UI2 主题中的值:
不允许使用任意值:
颜色:使用
theme.palette或dclColors间距:使用
theme.spacing(n)圆角:使用
theme.shape.borderRadius排版:使用
theme.typography变体断点:使用
theme.breakpoints辅助函数
状态与可访问性
必须 定义并实现所有交互状态:
必须 实现基本可访问性:**
键盘导航 - 可通过键盘聚焦并操作
焦点指示器 - 可见的焦点状态
ARIA 标签 - 在文本不可见的地方
语义化 HTML - 使用合适的元素
颜色对比度 - 符合 WCAG AA 标准
示例:项目特定组件
UI2 候选组件
将在多个项目间共享的组件需要更高标准和更详尽的文档。
要求
主题对齐
必须 仅依赖 UI2 主题值:
Storybook 覆盖
必须 添加完整的 Storybook 示例:
必需覆盖:
所有属性和变体
每种属性组合
所有尺寸变体
所有颜色变体
所有状态
空闲/默认
加载中
错误
禁用
悬停(通过 pseudo states addon)
焦点(通过 pseudo states addon)
交互
点击处理器
表单提交
键盘导航
配色方案
浅色模式
深色模式
响应式行为
关键断点(xs、md、lg)
记录各断点下的行为
示例 Storybook 文件:
组件结构
UI2 候选组件应遵循以下结构:
文档要求
必须 在组件 README 中包含:
目的 - 解决了什么问题?
用法 - 如何使用该组件
属性 - 所有属性及其类型和说明
示例 - 常见使用场景
可访问性 - 键盘支持、ARIA 标签
主题 - 使用了哪些主题值
迁移说明 - 如果替换的是 UI1 组件
示例 README:
测试要求
必须 包含以下测试:
属性渲染
用户交互
可访问性功能
响应式行为
错误状态
决策矩阵
用它来决定要创建哪种类型的组件:
其他项目会使用它吗?
否
是
UI1 中有对应项吗?
不适用
可能
需要 Storybook 文档吗?
否
是
需要全面测试吗?
基础
详尽
需要设计评审吗?
项目级
UI2 级
可以使用项目特定模式吗?
是
否
必须在所有主题中正常工作吗?
否
是
审批流程
项目特定组件
由项目维护者进行代码审查
验证主题符合性
在项目上下文中测试
批准后合并
UI2 候选组件
设计评审和批准
技术设计评审
实现
Storybook 示例
全面测试
可访问性审查
代码评审
向 UI2 仓库提交 PR
版本化并发布
更新依赖项目
最佳实践
组合优于定制
渐进式增强
从简单开始,按需添加功能:
具有核心功能的基础版本
添加响应式行为
添加无障碍功能
添加高级交互
优化性能
文档优先
在编写代码之前:
编写组件 README
定义 props 接口
列出所需状态
规划 Storybook 故事
然后实现
下一步
最后更新于