toc
This plugin will provide a table-of-contents (TOC) component.
Usage
npm i -D @vuepress/plugin-toc@nextimport { tocPlugin } from '@vuepress/plugin-toc'
export default {
  plugins: [
    tocPlugin({
      // options
    }),
  ],
}Differences with Markdown TOC Syntax
Similar to the Table of Contents Markdown Syntax, the TOC component provided by this plugin can be used in your markdown content directly:
<!-- markdown toc syntax -->
[[toc]]
<!-- vue toc component -->
<Toc />Both of them can be pre-rendered correctly in build mode. However, there are some differences between them.
The markdown syntax [[toc]] can only be used in markdown files. It is parsed by markdown-it, and the generated TOC is static content.
The component <Toc/> can be used in both markdown files and vue files. It is loaded by vue, and the generated TOC is a vue component.
This plugin can work together with @vuepress/plugin-active-header-links by setting the headerLinkSelector to match the linkClass option. When the page scrolls to a certain header anchor, the corresponding link will be added the linkActiveClass class name.
Therefore, this plugin is more useful for theme developers.
Options
componentName
Type:
stringDefault:
'Toc'Details:
Specify the name of the TOC component.
headersOptions
Type:
Partial<GetHeadersOptions>Default:
{}Details:
Override the default values of the component headersOptions prop.
renderOptions
Type:
Partial<TocPropsOptions>Default:
{}Details:
Override the default values of the component renderOptions prop.
Component Props
The TOC component also accepts props for customization.
<template>
  <Toc
    :headers="headers"
    :headers-options="headersOptions"
    :render-options="renderOptions"
  />
</template>headers
- Type: 
PageHeader[] 
interface PageHeader {
  level: number
  title: string
  slug: string
  children: PageHeader[]
}Details:
Specify the headers array to render.
If this prop is not specified, the headers of current page will be used.
headersOptions
Type:
Partial<GetHeadersOptions>Default:
See GetHeadersOptions, it can be overridden by headersOptions in plugin options.
Details:
Customize header extracting behavior.
renderOptions
- Type: 
TocRenderOptions 
interface TocRenderOptions {
  /**
   * Container tag name
   *
   * @default 'nav'
   */
  containerTag?: string
  /**
   * Container class name
   *
   * @default 'vuepress-toc'
   */
  containerClass?: string
  /**
   * List class name
   *
   * @default 'vuepress-toc-list'
   */
  listClass?: string
  /**
   * Item class name
   *
   * @default 'vuepress-toc-item'
   */
  itemClass?: string
  /**
   * Link tag type
   *
   * @default 'RouteLink'
   */
  linkTag?: 'a' | 'RouteLink' | 'RouterLink'
  /**
   * Link class name
   *
   * @default 'vuepress-toc-link'
   */
  linkClass?: string
  /**
   * Active link class name
   *
   * @default 'active'
   */
  linkActiveClass?: string
  /**
   * Active children link class name
   *
   * @default 'active'
   */
  linkChildrenActiveClass?: string
}Default:
Following default values can be overridden by renderOptions in plugin options.
const defaultOptions = { containerTag: 'nav', containerClass: 'vuepress-toc', listClass: 'vuepress-toc-list', itemClass: 'vuepress-toc-item', linkTag: 'RouteLink', linkClass: 'vuepress-toc-link', linkActiveClass: 'active', linkChildrenActiveClass: 'active', }Details:
Customize TOC component render behavior.
If the
containerTagis set to an empty string'', the<nav>container will be removed totally.Example:
The rendered TOC component with default options looks like:
<template>
  <!-- container -->
  <nav class="vuepress-toc">
    <!-- list -->
    <ul class="vuepress-toc-list">
      <!-- item -->
      <li class="vuepress-toc-item">
        <!-- link -->
        <RouteLink class="vuepress-toc-link" to="#foo">Foo</RouteLink>
      </li>
      <!-- item with children -->
      <li class="vuepress-toc-item">
        <!-- link (children active) -->
        <RouteLink class="vuepress-toc-link active" to="#bar">Bar</RouteLink>
        <!-- list (children) -->
        <ul class="vuepress-toc-list">
          <!-- item -->
          <li class="vuepress-toc-item">
            <!-- link (active) -->
            <RouteLink class="vuepress-toc-link active" to="#bar-child">
              Bar Child
            </RouteLink>
          </li>
        </ul>
      </li>
    </ul>
  </nav>
</template>