关于 reka-ui-skilld
Reka UI 为 Vue 3 开发者提供无样式、注重可访问性的组件原语,用于构建自定义界面。其组合式组件部件涵盖常见 UI 模式,并提供组合、配置和虚拟化工具。
主要功能
- 01无样式且注重可访问性的 Vue 组件原语
- 02对话框、菜单、日期和颜色组件
- 03可组合的组件部件与工具
- 04RTL、区域设置和传送目标配置
- 05长列表虚拟化器
适用场景
- 01构建自定义样式的无障碍界面
- 02组合对话框、菜单和选择器
- 03配置区域设置与从右向左布局
- 04虚拟化较长的组件列表
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ skilld-dev/ vue-ecosystem-skills --skill reka-ui-skilld安装后在 Claude Code 中输入/reka-ui-skilld确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/api-surface.mdcomponents-new.mdcomposition.mdintegrations.mdstyling-animation.md详细介绍
Reka UI [email protected]
适用于 Vue 3 的无样式、易于访问的组件原语。要求 vue >= 3.4.0
(准备好的源文件 package.json:87-89)。文档:https://reka-ui.com
参考资料
- API 概览:入口点、每个组件部分和工具。
- 组合:
asChild、属性转发、上下文注入、受控状态。 - 样式与动画:
data-state、--reka-CSS 变量、通过<Transition>使用force-mount。 - 新增与变更的组件:Drawer、Autocomplete、Color primitives、Month/Year pickers,以及特定版本的属性变更。
- 集成:命名空间入口、Nuxt 模块、组件解析器、使用
@internationalized/date处理日期、虚拟化。
设置
pnpm add reka-ui # or npm / yarn / bun
<script setup lang="ts">
import { DialogRoot, DialogTrigger, DialogPortal, DialogOverlay, DialogContent, DialogTitle } from 'reka-ui'
</script>
<template>
<DialogRoot>
<DialogTrigger>Edit profile</DialogTrigger>
<DialogPortal>
<DialogOverlay />
<DialogContent>
<DialogTitle>Edit profile</DialogTitle>
</DialogContent>
</DialogPortal>
</DialogRoot>
</template>
API 变更(2.10.x 和 2.9.x)
优先列出近期版本。基线技能覆盖至 2.9.7。
- 新增
Drawer原语(2.10.0):滑动关闭、吸附点、嵌套抽屉。组成部分:DrawerRoot/Trigger/Portal/Overlay/Content/Close/Title/Description/Handle/SwipeArea/Viewport/Indent/IndentBackground(已准备的源码src/Drawer/)。发布说明:https://github.com/unovue/reka-ui/releases/tag/v2.10.0 - 新增
ConfigProvider的teleportTo属性:全局默认传送目标(已准备的源码src/ConfigProvider/ConfigProvider.vue:45) - 新增
DialogRoot的unmountOnHide属性,默认值为true;设为false可在隐藏时保留已挂载的内容(已准备的源码src/Dialog/DialogRoot.vue:20) - 新增
SelectRoot的nullableValue属性,用于为隐藏输入框设置表示空选项的值(已准备的源码src/Select/SelectRoot.vue:18) - 新增
HoverCardRoot的enableTouch属性,默认值为false(已准备的源码src/HoverCard/HoverCardRoot.vue:15) - 新增
DateFieldRoot的stepSnapping属性,默认值为false(已准备的源码src/DateField/DateFieldRoot.vue:57) - 新增
TreeItem的disabled属性(2.10.0):https://github.com/unovue/reka-ui/releases/tag/v2.10.0 TabsIndicator新增--reka-tabs-indicator-size、--reka-tabs-indicator-thickness、--reka-tabs-indicator-positionCSS 变量(已准备的源码src/Tabs/TabsIndicator.vue:73-75)- 改进
useEmitAsProps和useForwardPropsEmits的类型推断(2.10.0) - 新增
Autocomplete组件(2.9.0),这是采用 Combobox 风格的输入组件,拥有自己的Autocomplete*部件系列。文档:https://reka-ui.com/docs/components/autocomplete - 新增颜色原语(2.9.0):
ColorArea*、ColorField*、ColorSlider*、ColorSwatch、ColorSwatchPicker*,以及从根目录导出的颜色解析/转换工具 - 新增
TimeRangeField(2.9.0):TimeRangeFieldRoot、TimeRangeFieldInput - 新增月份和年份选择器(2.9.0):
MonthPicker*、YearPicker*以及MonthRangePicker*、YearRangePicker*系列 - 新增
CheckboxRoot/SwitchRoot自定义布尔值:trueValue和falseValue属性取代固定的true/false(已准备的源码src/Checkbox/CheckboxRoot.vue:27-31) - 新增
DropdownMenuFilter部件,用于支持搜索的下拉菜单(2.9.0) - 新增
Splitter像素尺寸和约束(2.9.0) - 新增通过
TooltipProvider配置全局提示框内容的功能(2.9.0) - 菜单内部实现从
reka-ui/internal导出;该接口不稳定,可能在不遵循 semver 的情况下变更(已准备的源码src/internal.ts:1-7)
修改较旧代码时仍需注意的早期破坏性变更:
radix-vue更名为reka-ui;CSS 变量使用--reka-前缀,数据属性使用data-reka-。迁移指南:https://reka-ui.com/docs/guides/migration- Combobox 重构:移除了
filterFunction属性;searchTerm和displayValue从 Root 移至ComboboxInput(见上述迁移指南) Checkbox、Toggle、MenuCheckboxItem使用标准v-model,不再使用v-model:checked/v-model:pressed(见上述迁移指南)PaginationRoot的itemsPerPage为必填项(见上述迁移指南)- 自 2.8.0 起,Calendar/DatePicker 上的
weekStartsOn与区域设置无关:https://github.com/unovue/reka-ui/releases/tag/v2.8.0
发布索引:https://github.com/unovue/reka-ui/releases
最佳实践
- 使用
asChild进行组合:将 Reka 原语渲染为自己的元素或组件,同时保留其行为和无障碍性(https://reka-ui.com/docs/guides/composition)
<TooltipTrigger asChild>
<MyButton>Hover me</MyButton>
</TooltipTrigger>
- 使用
useForwardPropsEmits构建封装组件,让所有 props 和 emits 传递给原语(https://reka-ui.com/docs/utilities/use-forward-props-emits)
const props = defineProps<AccordionRootProps>()
const emits = defineEmits<AccordionRootEmits>()
const forwarded = useForwardPropsEmits(props, emits)
// <AccordionRoot v-bind="forwarded">
- 使用
ConfigProvider包裹应用,以设置dir(RTL)、locale、scrollBody和默认的teleportTo(https://reka-ui.com/docs/utilities/config-provider)
<ConfigProvider dir="rtl" :scroll-body="false">
<App />
</ConfigProvider>
- 在片段(多根节点)组件中使用
useForwardExpose,使模板 refs 返回目标 DOM 元素(https://reka-ui.com/docs/utilities/use-forward-expose)
const { forwardRef } = useForwardExpose()
// <div :ref="forwardRef">...</div>
- 通过
data-state属性设置状态样式,而不是切换类名;在作用域样式中,使用:deep()设置传送内容的样式(https://reka-ui.com/docs/guides/styling)
.AccordionItem[data-state="open"] { border-bottom-width: 2px; }
- 使用
<Transition>添加动画:为内容部件添加force-mount,并自行控制卸载(https://reka-ui.com/docs/guides/animation)
<Transition name="fade">
<DialogContent force-mount>...</DialogContent>
</Transition>
- 使用
ComboboxVirtualizer、ListboxVirtualizer、AutocompleteVirtualizer或TreeVirtualizer虚拟化长列表;为滚动容器设置固定高度(https://reka-ui.com/docs/guides/virtualization)
<ComboboxViewport class="max-h-80 overflow-y-auto">
<ComboboxVirtualizer :options="items" :estimate-size="25" v-slot="{ option }">
<ComboboxItem :value="option">{{ option.label }}</ComboboxItem>
</ComboboxVirtualizer>
</ComboboxViewport>
-
使用
injectAccordionRootContext等injectXContext函数,让自定义子组件访问原语的内部状态(https://reka-ui.com/docs/guides/inject-context) -
Reka UI 的
useId按以下顺序解析 ID:传入的确定性 ID、ConfigProvider的useId来源、Vue 原生useId(Vue 3.5+),最后回退到计数器(已准备的源码src/shared/useId.ts:26-34)。在 Vue 低于 3.5 的 Nuxt 项目中,通过ConfigProvider传入 Nuxt 的useId,以避免 hydration ID 不匹配(https://reka-ui.com/docs/guides/server-side-rendering) -
日期和时间组件接收来自
@internationalized/date(直接依赖)的DateValue和TimeValue对象,不能使用原始字符串(https://reka-ui.com/docs/guides/dates)
常见注意事项
- 每个部件都必须位于其 Root 下;大多数组件还需要将
*Content放在*Portal或Teleport内,以确保正确的堆叠顺序。 Presence的forceMount无论打开状态如何都会渲染内容;请自行处理可见性,例如使用:hidden(https://reka-ui.com/docs/utilities/presence)。- 隐藏表单字段使用部件的
name和valueprops;SelectRoot还接受nullableValue表示空状态。 - 从
reka-ui导入以支持 tree-shaking,或从reka-ui/namespaced导入以使用Dialog.Root等分组部件;请参阅集成。