前端开发
构建可复用 UI 组件库与设计系统时的组件模式与样式方案
在 React/Vue/Svelte 中设计可复用组件库、组件 API 或前端设计系统时,提供组合模式、CSS-in-JS 选型与最佳实践。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
构建可复用 UI 组件库与设计系统时的组通用
解决思路
- 使用复合组件(Compound Components)模式:让相关组件协同工作,例如 <Select> 搭配 <Select.Trigger>、<Select.Options>、<Select.Option>,通过 Context 共享状态。
- 使用 Render Props 模式:把渲染逻辑委托给父组件,例如 <DataFetcher url="/api/users">{({ data, loading, error }) => loading ? <Spinner /> : <UserList users={data} />}</DataFetcher>。
- 在 Vue/Svelte 中使用 Slots 命名插槽注入内容,例如 <Card> 内使用 <template #header>、<template #content>、<template #footer>。
- 按场景选择 CSS-in-JS 方案:Tailwind CSS 适合快速原型与设计系统;CSS Modules 适合已有 CSS 与渐进式迁移;styled-components 适合 React 动态样式;Emotion 适合灵活且 SSR 友好;Vanilla Extract 适合零运行时、性能敏感应用。
- 设计组件 API 时使用语义化 prop 名(如 isLoading 而非 loading),提供合理默认值,通过 children 支持组合,并允许通过 className 或 style 覆盖样式。
- 用 cva(class-variance-authority)定义变体样式,配合 cn 工具合并 className,并用 forwardRef 转发 ref、设置 displayName。
- 在 React 中用 createContext + useContext 实现复合组件状态共享,并封装 useAccordion 之类的 hook,在缺失 Provider 时抛出错误。
- 在 Vue 3 中用 provide/inject 与 InjectionKey 实现跨层级状态传递,例如 Tabs 的 activeTab 与 setActive。
- 在 Svelte 5 中用 $props()、$derived() 与 Snippet 定义组件 props、派生 class 与 children 渲染。
- 遵循最佳实践:单一职责;用 context 防止 prop drilling;默认包含 ARIA 属性与键盘支持;同时支持受控与非受控模式;转发 ref;对昂贵渲染使用 React.memo、useMemo 做记忆化;用 Error Boundaries 包裹可能失败的组件。
- 排查常见问题:prop 爆炸时改用组合;样式冲突时用 scoped styles 或 CSS Modules;用 React DevTools 分析重渲染并合理 memo;用屏幕阅读器与键盘导航测试可访问性;通过 tree-shaking 移除未使用的组件变体以控制包体积。
适用边界 · 注意事项
- 不涉及具体框架(React/Vue/Svelte)的纯后端或非 UI 项目。
- 不需要构建可复用组件库或设计系统的一次性页面。
- 团队未采用任何 CSS-in-JS 或组件化方案且不打算引入时。