Nuxt UI v3-alpha 已发布!

试试看

内容搜索

一个可直接使用的命令面板,可以添加到您的文档中。
该组件仅在安装了 @nuxt/content 模块时可用。

使用

使用 filesnavigation 道具提供要搜索的内容。

您可以通过按下 K 或使用 ContentSearchButton 组件打开命令面板。您也可以通过 const { toggleContentSearch } = useUIState() 手动执行此操作。

您通常会在您的 app.vue 中使用此组件。

app.vue
<script setup lang="ts">
const { data: navigation } = await useAsyncData('navigation', () => fetchContentNavigation())
const { data: files } = useLazyFetch<ParsedContent[]>('/api/search.json', { default: () => [], server: false })

const links = [{
  label: 'Docs',
  icon: 'i-heroicons-book-open',
  to: '/getting-started'
}, {
  label: 'Pro',
  icon: 'i-heroicons-square-3-stack-3d',
  to: '/pro'
}, {
  label: 'Pricing',
  to: '/pro/pricing',
  icon: 'i-heroicons-ticket'
}, {
  label: 'Templates',
  icon: 'i-heroicons-computer-desktop',
  to: '/pro/templates'
}, {
  label: 'Releases',
  icon: 'i-heroicons-rocket-launch',
  to: '/releases'
}]

provide('navigation', navigation)
provide('files', files)
</script>

<template>
  <Header :links="links" />

  <NuxtLayout>
    <NuxtPage />
  </NuxtLayout>

  <Footer />

  <ClientOnly>
    <LazyUContentSearch :files="files" :navigation="navigation" :links="links" />
  </ClientOnly>

  <UNotifications />
</template>

建议将 ContentSearch 组件包装在 ClientOnly 组件中,以便它不会在服务器上渲染。

files/api/search.json 端点获取,要实现相同的效果,您需要创建一个服务器路由。

server/api/search.json.get.ts
import { serverQueryContent } from '#content/server'

export default eventHandler(async (event) => {
  return serverQueryContent(event).where({ _type: 'markdown', navigation: { $ne: false } }).find()
})

我们建议使用这种方法,而不是直接获取文件,这样性能会更好。

颜色模式

默认情况下,会向命令面板添加一组命令,以便您可以切换亮模式和暗模式。这只有在 colorMode 在特定页面中没有强制时才会生效,可以通过 definePageMeta 实现

pages/index.vue
<script setup lang="ts">
definePageMeta({
  colorMode: 'dark'
})
</script>

您也可以通过设置 hide-color-mode 道具手动禁用此行为: <UContentSearch hide-color-mode />。当您在您的 nuxt.config.ts 中为整个应用程序强制颜色模式时,这将非常有用。

nuxt.config.ts
export default defineNuxtConfig({
  colorMode: {
    preference: 'light'
  }
})

道具

ui
any
{}
files
ParsedContent[]
[]
navigation
NavItem[]
[]
links
ContentSearchLink[]
[]
groups
Group[]
[]
fuse
UseFuseOptions<Command>
{}
modelValue
boolean
undefined
hideColorMode
boolean
false

配置

{
  padding: 'p-0 sm:p-4',
  rounded: 'rounded-none sm:rounded-lg',
  width: 'sm:max-w-3xl',
  height: 'h-dvh sm:h-[28rem]',
  commandPalette: {
    input: {
      height: 'h-[--header-height] sm:h-12',
      icon: {
        size: 'h-5 w-5',
        padding: 'ps-11'
      }
    },
    group: {
      command: {
        prefix: `!text-foreground after:content-['_>']`
      }
    },
    container: 'scroll-py-10'
  },
  fileIcon: {
    name: 'i-heroicons-document-text'
  },
  default: {
    closeButton: {
      icon: 'i-heroicons-document-text',
      color: 'gray',
      variant: 'ghost',
      size: 'sm'
    }
  }
}