Skip to content

VitePress 封装居右居中组件

组件封装

1. 封装居中容器

  • docs/.vitepress/theme/components/CenterBox/index.vue
vue
<template>
  <ElConfigProvider namespace="rightbox">
    <div id="rightbox-demo">
      <div class="content">{{ data }}</div>
    </div>
  </ElConfigProvider>
</template>

<script setup lang="ts">
import { ElConfigProvider, ElAlert } from "element-plus";
import "../CSS/element.css";

const props = defineProps<{ data: string }>();
</script>

<style lang="scss">
#rightbox-demo {
  display: flex;
  flex-flow: row nowrap;
  justify-content: center;
  align-items: center;

  .content {
    flex: 1;
    padding: 20px;
    text-align: center;
  }
}
</style>

2. 封装居右边组件

  • docs/.vitepress/theme/components/RightBox/index.vue
vue
<template>
  <ElConfigProvider namespace="rightbox">
    <div id="rightbox-demo">
      <div class="content">{{ data }}</div>
    </div>
  </ElConfigProvider>
</template>

<script setup lang="ts">
import { ElConfigProvider, ElAlert } from "element-plus";
import "../CSS/element.css";

const props = defineProps<{ data: string }>();
</script>

<style lang="scss">
#rightbox-demo {
  display: flex;
  flex-flow: row nowrap;
  justify-content: flex-end;
  align-items: center;

  .content {
    flex: 1;
    padding: 20px;
    text-align: right;
  }
}
</style>

插件封装

1. 封装居中插件

  • docs/.vitepress/theme/plugins/Center/CenterVueDemoPlugin.ts
ts
import markdownItContainer from "markdown-it-container";

interface Options {
  root?: string;
}

export default (md: any, options?: Options) => {
  md.use(markdownItContainer, "center", {
    validate: (params: string) => {
      return params.trim().match(/^center\s*(.*)$/);
    },
    render(tokens: any[], idx: number) {
      const record = tokens[idx];
      if (record.nesting === 1) {
        // 获取到所有的传递过来的数据
        const data = tokens[idx + 2].content;
        return `<CenterContainer data="${data}">`; // 开始标签
      } else {
        // 处理结束标签
        return "</CenterContainer>\n"; // 结束标签
      }
    },
  });
};

2. 封装居右插件

  • docs/.vitepress/theme/plugins/Right/RightVueDemoPlugin.ts
ts
import markdownItContainer from "markdown-it-container";

interface Options {
  root?: string;
}

export default (md: any, options?: Options) => {
  md.use(markdownItContainer, "right", {
    validate: (params: string) => {
      return params.trim().match(/^right\s*(.*)$/);
    },
    render(tokens: any[], idx: number) {
      const record = tokens[idx];
      if (record.nesting === 1) {
        // 获取到所有的传递过来的数据
        const data = tokens[idx + 2].content;
        return `<RightContainer data="${data}">`; // 开始标签
      } else {
        // 处理结束标签
        return "</RightContainer>\n"; // 结束标签
      }
    },
  });
};

3. 调用

  • (1) docs/.vitepress/theme/index.ts
ts
/// <reference types="vite/client" />
import type { Theme } from "vitepress";
import DefaultTheme from "vitepress/theme";
import type { Component } from "vue";
// 增加居右侧组件
import RightVueDemo from "./components/RightBox/index.vue";
// 增加中间代码组件
import CenterVueDemo from "./components/CenterBox/index.vue";

export default {
  extends: DefaultTheme,
  enhanceApp({ app }) {
    app.component("RightContainer", RightVueDemo);
    app.component("CenterContainer", CenterVueDemo);
  },
} satisfies Theme;
  • (2) docs/.vitepress/config.mts
ts
import { defineConfig } from "vitepress";
// 增加居右组件
import RightVueDemoPlugin from "./theme/plugins/Right/RightVueDemoPlugin";
// 增加居中组件
import CenterVueDemoPlugin from "./theme/plugins/Center/CenterVueDemoPlugin";

// https://vitepress.dev/reference/site-config
export default defineConfig({
  title: "My Awesome Project",
  description: "A VitePress Site",
  markdown: {
    config: (md) => {
      md.use(RightVueDemoPlugin, { root: "docs" }); // 增加居右边栏组件
      md.use(CenterVueDemoPlugin, { root: "docs" }); // 增加居中组件
    },
  },
  themeConfig: {
    // https://vitepress.dev/reference/default-theme-config
    nav: [
      { text: "Home", link: "/" },
      { text: "Examples", link: "/markdown-examples" },
    ],

    sidebar: [
      {
        text: "Examples",
        items: [
          { text: "Markdown Examples", link: "/markdown-examples" },
          { text: "Runtime API Examples", link: "/api-examples" },
        ],
      },
    ],

    socialLinks: [
      { icon: "github", link: "https://github.com/vuejs/vitepress" },
    ],
  },
});

使用

bash

## 结果

::: tip 提示
居中组件封装
::: center

居中

:::

# 结果完成

::: right

居右边

:::