toc

该插件会提供一个目录 (table-of-contents, TOC) 组件。

使用方法

  1. npm i -D @vuepress/plugin-toc@next
  1. const { tocPlugin } = require('@vuepress/plugin-toc')
  2. module.exports = {
  3. plugins: [
  4. tocPlugin({
  5. // 配置项
  6. }),
  7. ],
  8. }
  9. ## Markdown 目录语法的区别
  10. [Markdown 目录语法](../../guide/markdown.md#目录) 类似,该插件提供的目录组件可以直接在你的 Markdown 内容中使用:
  11. ```md
  12. <!-- Markdown 目录语法 -->
  13. [[toc]]
  14. <!-- Vue 目录组件 -->
  15. <Toc />

在 Build 模式中,它们都可以被正确地预渲染。然而,它们之间存在一些区别。

Markdown 语法 [[toc]] 仅能在 Markdown 文件中使用。它是由 markdown-it 解析的,生成的目录是静态内容。

组件 <Toc/> 既可以用在 Markdown 文件中,也可以用在 Vue 文件中。它是由 Vue 加载的,生成的目录是一个 Vue 组件。

该插件可以和 @vuepress/plugin-active-header-links 协同工作,你只需要将 headerLinkSelector 与该插件的 linkClass 匹配即可。当页面滚动至某个标题锚点后,对应的链接就会被加上 linkActiveClass 类名。

因此,该插件对于主题开发者来说更为有用。

配置项

componentName

  • 类型: string

  • 默认值: Toc

  • 详情:

    指定目录组件的名称。

defaultPropsOptions

  • 类型: Partial<TocPropsOptions>

  • 默认值: {}

  • 详情:

    覆盖组件 options Prop 的默认值。

组件 Props

目录组件可以通过 Props 来进行自定义。

  1. <template>
  2. <Toc :headers="headers" :options="options" />
  3. </template>

headers

  • 类型: PageHeader[]
  1. interface PageHeader {
  2. level: number
  3. title: string
  4. slug: string
  5. children: PageHeader[]
  6. }
  • 详情:

    指定要渲染的标题数组。

    如果该 Prop 没有被设置,默认会使用当前页面的标题。

options

  • 类型: Partial<TocPropsOptions>
  1. interface TocPropsOptions {
  2. containerTag: string
  3. containerClass: string
  4. listClass: string
  5. itemClass: string
  6. linkTag: 'a' | 'RouterLink'
  7. linkClass: string
  8. linkActiveClass: string
  9. linkChildrenActiveClass: string
  10. }
  1. const defaultOptions = {
  2. containerTag: 'nav',
  3. containerClass: 'vuepress-toc',
  4. listClass: 'vuepress-toc-list',
  5. itemClass: 'vuepress-toc-item',
  6. linkTag: 'RouterLink',
  7. linkClass: 'vuepress-toc-link',
  8. linkActiveClass: 'active',
  9. linkChildrenActiveClass: 'active',
  10. }
  • 详情:

    自定义目录组件。

    如果 containerTag 设置为空字符串 '' ,那么最外层的 <nav> Container 会被完全移除。

  • 示例:

    使用默认 options 的目录组件的渲染结果类似以下结构:

  1. <template>
  2. <!-- container -->
  3. <nav class="vuepress-toc">
  4. <!-- list -->
  5. <ul class="vuepress-toc-list">
  6. <!-- item -->
  7. <li class="vuepress-toc-item">
  8. <!-- link -->
  9. <RouterLink class="vuepress-toc-link" to="#foo">Foo</RouterLink>
  10. </li>
  11. <!-- item with children -->
  12. <li class="vuepress-toc-item">
  13. <!-- link (children active) -->
  14. <RouterLink class="vuepress-toc-link active" to="#bar">Bar</RouterLink>
  15. <!-- list (children) -->
  16. <ul class="vuepress-toc-list">
  17. <!-- item -->
  18. <li class="vuepress-toc-item">
  19. <!-- link (active) -->
  20. <RouterLink class="vuepress-toc-link active" to="#bar-child">Bar Child</RouterLink>
  21. </li>
  22. </ul>
  23. </li>
  24. </ul>
  25. </nav>
  26. </template>