reka-ui
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseReka UI
Reka UI
Unstyled, accessible Vue 3 component primitives. WAI-ARIA compliant. Previously Radix Vue.
Current version: v2.8.0 (January 2026)
无样式、支持无障碍访问的Vue 3组件原语。符合WAI-ARIA标准。前身为Radix Vue。
当前版本: v2.8.0(2026年1月)
When to Use
适用场景
- Building headless/unstyled components from scratch
- Need WAI-ARIA compliant components
- Using Nuxt UI, shadcn-vue, or other Reka-based libraries
- Implementing accessible forms, dialogs, menus, popovers
For Vue patterns: use skill
vue- 从头构建无头/无样式组件
- 需要符合WAI-ARIA标准的组件
- 使用Nuxt UI、shadcn-vue或其他基于Reka的库
- 实现无障碍表单、对话框、菜单、弹出层
如需Vue相关模式: 使用技能
vueAvailable Guidance
可用指南
| File | Topics |
|---|---|
| references/components.md | Component index by category (Form, Date, Overlay, Menu, Data, etc.) |
| components/*.md | Per-component details (dialog.md, select.md, etc.) |
Guides (see reka-ui.com): Styling, Animation, Composition, SSR, Namespaced, Dates, i18n, Controlled State, Inject Context, Virtualization, Migration
| 文件 | 主题 |
|---|---|
| references/components.md | 按类别划分的组件索引(表单、日期、浮层、菜单、数据等) |
| components/*.md | 各组件详细说明(dialog.md、select.md等) |
指南(查看reka-ui.com):样式、动画、组合、SSR、命名空间、日期、国际化、受控状态、注入上下文、虚拟化、迁移
Loading Files
文件加载建议
Consider loading these reference files based on your task:
- references/components.md - if browsing component index by category or searching for specific components
DO NOT load all files at once. Load only what's relevant to your current task.
For styled Nuxt components built on Reka UI: use nuxt-ui skill
请根据任务加载相关的参考文件:
- references/components.md - 如需按类别浏览组件索引或查找特定组件
请勿一次性加载所有文件。 仅加载与当前任务相关的文件。
如需基于Reka UI的样式化Nuxt组件: 使用nuxt-ui技能
Key Concepts
核心概念
| Concept | Description |
|---|---|
| Render as child element instead of wrapper, merging props/behavior |
| Controlled/Uncontrolled | Use |
| Parts | Components split into Root, Trigger, Content, Portal, etc. |
| Keep element in DOM for animation libraries |
| Virtualization | Optimize large lists (Combobox, Listbox, Tree) with virtual scrolling |
| Context Injection | Access component context from child components |
| 概念 | 说明 |
|---|---|
| 渲染为子元素而非包装器,合并属性/行为 |
| 受控/非受控状态 | 使用 |
| 组件拆分 | 组件拆分为Root、Trigger、Content、Portal等部分 |
| 保持元素在DOM中以支持动画库 |
| 虚拟化 | 通过虚拟滚动优化大型列表(Combobox、Listbox、Tree) |
| 上下文注入 | 从子组件中访问组件上下文 |
Installation
安装
ts
// nuxt.config.ts (auto-imports all components)
export default defineNuxtConfig({
modules: ['reka-ui/nuxt']
})ts
import { RekaResolver } from 'reka-ui/resolver'
// vite.config.ts (with auto-import resolver)
import Components from 'unplugin-vue-components/vite'
export default defineConfig({
plugins: [
vue(),
Components({ resolvers: [RekaResolver()] })
]
})ts
// nuxt.config.ts (自动导入所有组件)
export default defineNuxtConfig({
modules: ['reka-ui/nuxt']
})ts
import { RekaResolver } from 'reka-ui/resolver'
// vite.config.ts (搭配自动导入解析器)
import Components from 'unplugin-vue-components/vite'
export default defineConfig({
plugins: [
vue(),
Components({ resolvers: [RekaResolver()] })
]
})Basic Patterns
基础示例
vue
<!-- Dialog with controlled state -->
<script setup>
import { DialogRoot, DialogTrigger, DialogPortal, DialogOverlay, DialogContent, DialogTitle, DialogDescription, DialogClose } from 'reka-ui'
const open = ref(false)
</script>
<template>
<DialogRoot v-model:open="open">
<DialogTrigger>Open</DialogTrigger>
<DialogPortal>
<DialogOverlay class="fixed inset-0 bg-black/50" />
<DialogContent class="fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 bg-white p-6 rounded">
<DialogTitle>Title</DialogTitle>
<DialogDescription>Description</DialogDescription>
<DialogClose>Close</DialogClose>
</DialogContent>
</DialogPortal>
</DialogRoot>
</template>vue
<!-- Select with uncontrolled default -->
<SelectRoot default-value="apple">
<SelectTrigger>
<SelectValue placeholder="Pick fruit" />
</SelectTrigger>
<SelectPortal>
<SelectContent>
<SelectViewport>
<SelectItem value="apple"><SelectItemText>Apple</SelectItemText></SelectItem>
<SelectItem value="banana"><SelectItemText>Banana</SelectItemText></SelectItem>
</SelectViewport>
</SelectContent>
</SelectPortal>
</SelectRoot>vue
<!-- asChild for custom trigger element -->
<DialogTrigger as-child>
<button class="my-custom-button">Open</button>
</DialogTrigger>vue
<!-- 带受控状态的对话框 -->
<script setup>
import { DialogRoot, DialogTrigger, DialogPortal, DialogOverlay, DialogContent, DialogTitle, DialogDescription, DialogClose } from 'reka-ui'
const open = ref(false)
</script>
<template>
<DialogRoot v-model:open="open">
<DialogTrigger>打开</DialogTrigger>
<DialogPortal>
<DialogOverlay class="fixed inset-0 bg-black/50" />
<DialogContent class="fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 bg-white p-6 rounded">
<DialogTitle>标题</DialogTitle>
<DialogDescription>描述</DialogDescription>
<DialogClose>关闭</DialogClose>
</DialogContent>
</DialogPortal>
</DialogRoot>
</template>vue
<!-- 带默认非受控状态的选择器 -->
<SelectRoot default-value="apple">
<SelectTrigger>
<SelectValue placeholder="选择水果" />
</SelectTrigger>
<SelectPortal>
<SelectContent>
<SelectViewport>
<SelectItem value="apple"><SelectItemText>苹果</SelectItemText></SelectItem>
<SelectItem value="banana"><SelectItemText>香蕉</SelectItemText></SelectItem>
</SelectViewport>
</SelectContent>
</SelectPortal>
</SelectRoot>vue
<!-- 使用asChild自定义触发元素 -->
<DialogTrigger as-child>
<button class="my-custom-button">打开</button>
</DialogTrigger>Recent Updates (v2.6.0-v2.8.0)
近期更新(v2.6.0-v2.8.0)
- New component: Rating (v2.8.0)
- ScrollArea: Added "glimpse" scrollbar mode (v2.8.0)
- PopperContent: Added prop (v2.8.0)
hideShiftedArrow - TimeField: Added support (v2.8.0)
stepSnapping - Breaking: now locale-independent for date components (v2.8.0)
weekStartsOn - Virtualization: accepts function for Listbox/Tree (v2.7.0)
estimateSize - Composables: ,
useLocaleexposed (v2.6.0)useDirection - Select: prop on Content (v2.7.0)
disableOutsidePointerEvents - Toast: prop (v2.6.0)
disableSwipe
- 新增组件:Rating(v2.8.0)
- ScrollArea:新增"glimpse"滚动条模式(v2.8.0)
- PopperContent:新增属性(v2.8.0)
hideShiftedArrow - TimeField:新增支持(v2.8.0)
stepSnapping - 破坏性变更:日期组件的现在与区域设置无关(v2.8.0)
weekStartsOn - 虚拟化:Listbox/Tree的支持函数形式(v2.7.0)
estimateSize - 组合式函数:暴露、
useLocale(v2.6.0)useDirection - Select:Content新增属性(v2.7.0)
disableOutsidePointerEvents - Toast:新增属性(v2.6.0)
disableSwipe
Resources
资源
- Reka UI Docs
- GitHub
- Nuxt UI (styled Reka components)
- shadcn-vue (styled Reka components)
Token efficiency: ~350 tokens base, components.md index ~100 tokens, per-component ~50-150 tokens
- Reka UI 文档
- GitHub
- Nuxt UI(样式化的Reka组件)
- shadcn-vue(样式化的Reka组件)
令牌效率:基础内容约350令牌,components.md索引约100令牌,单个组件约50-150令牌