SuperAPI AI 工具集

components

前端与建站

查看项目

更新于 10-16 03:19

技能介绍

本规范围绕 React 组件架构,讲解如何构建可组合(composable)且可访问(accessible)的组件,并通过 data 属性暴露组件状态。文档明确其用途是:在创建或更新可组合组件时使用。

一、无障碍(Accessibility) 文档强调无障碍不是可选功能,而是现代 Web 组件的基本要求,每个组件都应能被包括视觉、运动、听觉或认知障碍用户在内的所有人使用。核心原则包括:优先使用语义化 HTML(如 button、nav、ul)以获得内置无障碍能力;支持键盘导航(Tab、方向键、Home/End、Escape、Enter/Space);使用 ARIA 属性(aria-label、aria-current、aria-live)支持屏幕阅读器;保证视觉无障碍(焦点指示、4.5:1 对比度、响应式文字尺寸)。 ARIA 使用规则:优先语义化 HTML,仅在必要时使用 ARIA;不要覆盖原生语义;所有交互元素都需要键盘访问与可访问名称。常见属性分为角色(role)、状态(aria-checked、aria-expanded、aria-selected)和属性(aria-label、aria-describedby、aria-controls、aria-required、aria-invalid)。 文档给出复杂交互组件的无障碍模式:Modal/Dialog 使用 role="dialog"、aria-modal="true"、aria-labelledby,需捕获焦点、Escape 关闭、保存并恢复先前焦点、打开时阻止 body 滚动;Dropdown Menu 使用 role="menu" 与 role="menuitem"、aria-haspopup、aria-expanded、aria-controls,方向键导航、Enter/Space 选择、Escape 关闭;Tabs 使用 role="tablist"、role="tab"、role="tabpanel" 及 aria-selected、aria-controls、aria-labelledby,左右方向键导航、Home/End 跳转,仅活动标签可聚焦(tabIndex 0/-1);表单使用 label htmlFor 配对 input id,aria-required、aria-invalid、aria-describedby 做校验,错误信息用 role="alert",相关输入用 fieldset 与 legend 分组。 焦点管理方面:使用 :focus-visible 提供仅键盘焦点指示;在模态框内循环捕获 Tab/Shift+Tab;打开浮层前保存 document.activeElement 并在关闭时恢复。实时区域(Live Regions)用于向屏幕阅读器播报动态内容:状态消息用 aria-live="polite"(等待)或 aria-live="assertive"(打断),错误用 role="alert";进度用 role="progressbar" 配合 aria-valuenow、aria-valuemin、aria-valuemax、aria-label。 颜色与对比度:普通文字 4.5:1,大号文字(≥18pt 或 14pt 粗体)3:1,非文字元素(图标、边框)3:1;不得仅靠颜色传达信息,需结合文字、图标或 ARIA 属性。移动端无障碍:触摸目标最小 44×44px(iOS)或 48×48dp(Android);允许缩放(viewport meta)。常见陷阱:用占位符代替标签、图标按钮无 aria-label、用 disabled 而非 aria-disabled(后者可保持可聚焦并解释原因)。

二、asChild asChild 是现代 React 组件库中的一种模式,由 Radix UI 推广并被 shadcn/ui 采用,允许用自定义元素替换默认标记,同时保留组件功能。当 asChild 为 true 时,组件不再渲染默认 DOM 元素,而是把自身的 props、行为与事件处理器合并到其直接子元素上。其实现使用 React.cloneElement 克隆子元素并合并父子双方的 props(含事件处理器)。主要好处:语义化 HTML(导航用链接、操作用按钮)、干净的 DOM 结构(消除包装元素)、与现有组件库无缝集成、可在单个元素上组合多种行为。常见用例:自定义触发器、可访问导航、表单集成。最佳实践:保持无障碍、用 JSDoc 记录 asChild、测试 props 转发、处理边界情况。常见陷阱:子组件未展开 ...props、asChild 只接受恰好一个子元素、Fragment 子元素无效。

三、组合(Composition) 组合是构建现代 UI 组件的基础,通过把职责分散到多个协作组件中,避免把所有功能塞进一个拥有大量 props 的单一组件。文档以 Accordion 为例,说明如何拆分为 Root(容器,用 Context API 共享 open 状态,扩展 div 属性)、Item(每项包装)、Trigger(默认渲染为 button,可用 asChild 自定义,处理点击与焦点,提供 ARIA 属性)、Content(在展开时渲染内容并提供 ARIA 属性),最后组合使用。 命名约定方面:Root 作为主容器管理共享状态与上下文;交互元素使用 Trigger(触发动作)与 Content(承载显示/隐藏内容);结构化内容区使用 Header、Body、Footer;信息类组件使用 Title、Description。

四、数据属性(Data Attributes) 数据属性用于向使用者暴露组件状态与结构以便样式化,采用两种模式:data-state 表示视觉状态(open/closed、active/inactive、loading)、布局状态(orientation、side、alignment)、交互状态(disabled、hover、focus);data-slot 用于稳定的组件标识,使用 kebab-case 命名(如 data-slot="submit-button"),名称反映用途而非实现,提供不会因内部变化而失效的稳定选择器。决策框架:data-state 用于影响样式的状态,data-slot 用于组件身份(稳定定位、父子关系),props 用于变体、尺寸、行为配置与事件处理器。

五、术语定义(Definitions) 文档区分了两类制品:Primitive(无样式组件)是最底层构建块,提供行为与无障碍能力但完全无样式(headless),封装语义、焦点管理、键盘交互、分层/门户、ARIA 接线、测量等,需样式化才能成为成品 UI,示例包括 Radix UI Primitives、React Aria Components、Base UI、Headless UI;Component 是带样式的可复用 UI 单元,为 primitive 添加视觉设计或组合多个元素形成完整界面元素,通常包装无样式 primitive 并提供默认视觉设计且保持可定制,示例包括 shadcn/ui、Material UI、Ant Design。

关于安装命令、具体版本号、收费与价格等信息,资料中暂未提供。