backdrop
指南

迁移指南 - 从 Radix Vue 到 Reka UI

本指南为开发者提供了从 Radix Vue 迁移至 Reka UI 项目的详细步骤说明。

安装

首先,您需要安装最新版本的 reka-ui

sh
$ npm add reka-ui

恭喜!🎉 完成上述包安装后,让我们开始迁移!前两个步骤相对简单,只需按以下变更进行全局搜索和替换即可。

导入语句变更

导入的主要变动是将 radix-vue 替换为 reka-ui

vue
<script setup lang="ts">
import { TooltipPortal, TooltipRoot, TooltipTrigger } from 'radix-vue'
import { TooltipPortal, TooltipRoot, TooltipTrigger } from 'reka-ui'
</script>

命名规范变更

CSS 变量及数据属性名称已更新,使用 reka 前缀替代 radix

css
  --radix-accordion-content-width: 300px; 
  --reka-accordion-content-width: 300px; 

  [data-radix-collection-item] {} 
  [data-reka-collection-item] {} 

组件重大变更

组合框 (Combobox)

箭头 (Arrow)

表单组件 (Form)

vue
<template>
  <CheckboxRoot v-model:checked="value" /> 
  <CheckboxRoot v-model="value" /> 
</template>

菜单复选框项 (Menu CheckboxItem)

  • 与表单组件的变更类似,CheckboxItem 的绑定 API 已从 v-model:checked 改为 v-model
vue
<template>
  <DropdownMenuCheckboxItem v-model:checked="value" /> 
  <DropdownMenuCheckboxItem v-model="value" /> 

  <DropdownMenuCheckboxItem checked /> 
  <DropdownMenuCheckboxItem :model-value="true" /> 
</template>

分页 (Pagination)

日历 (Calendar)

  • 移除已弃用的 step 属性 - 使用 prevPage/nextPage 属性实现更精细的控制。

    vue
    <script setup lang="ts">
    function pagingFunc(date: DateValue, sign: -1 | 1) { 
      if (sign === -1) 
        return date.subtract({ years: 1 }) 
      return date.add({ years: 1 }) 
    } 
    </script>
    
    <template>
      <CalendarPrev step="year" /> 
      <CalendarPrev :prev-page="(date: DateValue) => pagingFunc(date, -1)" /> 
    
      <CalendarNext step="year" /> 
      <CalendarNext :next-page="(date: DateValue) => pagingFunc(date, 1)" /> 
    </template>

选择器 (Select)

存在状态 (Presence)

为更好地支持 SSR 内容,我们还修改了使用 forceMount 的组件逻辑(这些组件利用 Presence 功能):

  • Accordion
  • Collapsible
  • Tabs
  • NavigationMenu

forceMount 现在会渲染组件,即使状态为未激活。您现在需要手动处理组件的可见性逻辑。

vue
<template>
  <TabsRoot
    v-slot="{ modelValue }"
    default-value="tab1"
  >
    <TabsContent
      value="tab1"
      force-mount
      :hidden="modelValue !== 'tab1'"
    >

    </TabsContent>
    <TabsContent
      value="tab2"
      force-mount
      :hidden="modelValue !== 'tab2'"
    >

    </TabsContent>
  </TabsRoot>
</template>

对于 Nuxt 模块用户

若您使用 Nuxt,需要更新模块导入。

ts
// nuxt.config.ts
export default defineNuxtConfig({
 modules: [
   'radix-vue/nuxt' <!-- [!code --] -->
   'reka-ui/nuxt' <!-- [!code ++] -->
 ],
})