组件

<ContentRenderer>

将您的组件从 AST 转换为一个美妙的模板。

The <ContentRenderer> 组件渲染一个来自 queryContent() 查询的文档。

它将使用 <ContentRendererMarkdown> 组件来渲染 .md 文件类型。

其他类型目前将通过 v-slot="{ data }" 传递到默认插槽,或在 <pre /> 标签中渲染。

属性

  • value: 要渲染的文档。
    • 类型: ParsedContent
    • 默认值: {}
  • tag: 如果使用,用于渲染器元素的标签。
    • 类型: string
    • 默认值: 'div'
  • excerpt: 是否仅渲染摘录而不渲染其余内容。
    • 类型: boolean
    • 默认值: false
  • components: 用于渲染的自定义组件映射。此属性将传递给 Markdown 渲染器,不会影响其他文件类型。
    • 类型: object
    • 默认值: {}
  • data: 要注入 Markdown 内容以供以后在绑定变量中使用的变量映射。
    • 类型: object
    • 默认值: {}

插槽

可以通过 v-slot="{ data }" 语法使用 default 插槽来渲染内容。

pages/[...slug].vue
<script setup lang="ts">
const { data } = await useAsyncData('page-data', () => queryContent('/hello').findOne())
</script>

<template>
  <main>
    <ContentRenderer :value="data">
      <h1>{{ data.title }}</h1>
      <ContentRendererMarkdown :value="data" />
    </ContentRenderer>
  </main>
</template>

当文档为空时,可以使用 empty 插槽显示默认内容。

pages/[...slug].vue
<script setup lang="ts">
const { data } = await useAsyncData('page-data', () => queryContent('/hello').findOne())
</script>

<template>
  <main>
    <ContentRenderer :value="data">
      <template #empty>
        <p>No content found.</p>
      </template>
    </ContentRenderer>
  </main>
</template>
请注意,当您在模板中使用默认插槽和 <ContentRendererMarkdown> 时,需要将 components 传递给 <ContentRendererMarkdown>
components/CustomParagraph.vue
<template>
  <div>
    <ContentSlot :use="$slots.default" unwrap="p" />
  </div>
</template>
content/index.md
::custom-p
this is my custom paragraph
::
pages/[...slug].vue
<script setup lang="ts">
import { CustomParagraph } from '#components';

const { data } = await useAsyncData('page-data', () => queryContent('/hello').findOne())

const components = {
  'custom-p': CustomParagraph
}
</script>

<template>
  <main>
    <ContentRenderer :value="data">
      <h1>{{ data.title }}</h1>
      <ContentRendererMarkdown :value="data" :components="components" />
    </ContentRenderer>
  </main>
</template>