Skip to content

自定义组件

约 432 字大约 1 分钟

预览组件

2024-12-11

VuePress 的页面本质上是 Vue 应用,因此可以在 Markdown 中直接使用 Vue 组件。这篇文章演示如何在 plume 主题中创建、注册并使用一个自定义组件——本页面中的彩色卡片就是最终效果。

1. 创建组件

在 docs/.vuepress/theme/components/ 目录下新建 DemoCard.vue:

<script setup>
defineProps({
  title: { type: String, default: '' },
  color: { type: String, default: '#2a9dff' },
})
</script>

<template>
  <div class="demo-card" :style="{ '--demo-card-color': color }">
    <p v-if="title" class="demo-card-title">{{ title }}</p>
    <div class="demo-card-body">
      <slot />
    </div>
  </div>
</template>

<style scoped>
.demo-card {
  margin: 16px 0;
  padding: 14px 18px;
  border: 1px solid var(--demo-card-color);
  border-left-width: 4px;
  border-radius: 8px;
}
</style>

组件接收 title 和 color 两个 props,并通过 <slot /> 接收 Markdown 中写的嵌套内容。

2. 注册组件

在 docs/.vuepress/client.ts 中把组件全局注册:

import { defineClientConfig } from 'vuepress/client'
import DemoCard from './theme/components/DemoCard.vue'

export default defineClientConfig({
  enhance({ app }) {
    app.component('DemoCard', DemoCard)
  },
})

3. 在文章中使用

注册之后,任何 Markdown 文件里都可以直接书写组件标签:

<DemoCard title="这是一个自定义组件" color="#8b5cf6">
它在 Markdown 中直接使用,支持 `props` 和插槽。
</DemoCard>

实际渲染效果:

这是一个自定义组件

它在 Markdown 中直接使用,支持 `props` 和插槽。

换个颜色试试

通过 `color` 属性可以改变卡片的主题色。

注意事项

  • 组件名建议使用大驼峰(如 DemoCard),避免与 HTML 原生标签冲突
  • 组件内的样式使用 scoped,不会污染页面其他部分
  • 需要在组件里使用全局状态(如路由信息)时,可以在 enhance 钩子里安装插件,或直接在组件中引入 vuepress/client 提供的组合式 API