00:00:00
插槽布局
插槽
Teek 提供了很多的插槽,能够被用来在页面的特定位置注入内容,下面这个例子展示了将一个组件注入到首页右侧卡片栏底部:
ts
// .vitepress/theme/index.ts
import Teek from "vitepress-theme-teek";
import MyLayout from "./MyLayout.vue";
import "vitepress-theme-teek/index.css";
export default {
extends: Teek,
// 使用注入插槽的包装组件覆盖 Layout
Layout: MyLayout,
};vue
<!-- .vitepress/theme/MyLayout.vue -->
<script setup>
import Teek from "vitepress-theme-teek";
const { Layout } = Teek;
</script>
<template>
<Layout>
<template #teek-home-info-after>自定义卡片栏</template>
</Layout>
</template>也可以使用 h 渲染函数。
ts
// .vitepress/theme/index.ts
import Teek from "vitepress-theme-teek";
import "vitepress-theme-teek/index.css";
import { h } from "vue";
import MyComponent from "./components/MyComponent.vue";
export default {
extends: Teek,
Layout() {
return h(Teek.Layout, null, {
"teek-home-info-after": () => h(MyComponent),
});
},
};Teek 主题的全部插槽如下:
首页插槽
当 layout: 'home' 在 frontmatter 中被启用时:
teek-home-before:等于 VitePress 的home-hero-before插槽teek-home-after
当首页为文档风格时启用:
teek-home-features-beforev1.4.1teek-home-features-afterv1.4.1:等于 VitePress 的home-features-after插槽
Banner 插槽
teek-home-banner-beforeteek-home-banner-afterteek-home-banner-content-beforeteek-home-banner-content-afterteek-home-banner-feature-beforeteek-home-banner-feature-afterteek-home-banner-namev1.4.0:覆盖 Banner 的文字,利用该插槽可以使用组件美化标题。可以接收 1 个参数,即配置项传过来的name
如下是 Teek 当前实现的效果示例:
vue
<script setup lang="ts">
import Teek from "vitepress-theme-teek";
</script>
<template>
<Teek.Layout>
<template #teek-home-banner-name="{ name }">
<!-- 该 class 会激活 Teek 的内置样式 -->
<h1 class="tk-banner-content__title" aria-label="首页横幅标题">
{{ name }}
</h1>
</template>
</Teek.Layout>
</template>文章列表插槽
teek-home-post-beforeteek-home-post-afterteek-home-post-listv1.2.0
Teek 默认实现了列表风格和卡片风格的文章列表,如果您需要定制自己的文章列表风格,可以通过 teek-home-post-list 插槽来覆盖 Teek 自带的文章列表,该插槽返回了当前的文章列表数量 currentPosts。
vue
<script setup lang="ts">
import Teek from "vitepress-theme-teek";
</script>
<template>
<Teek.Layout>
<template #teek-home-post-list="{ currentPosts, transitionName }">
<TransitionGroup tag="ul" :name="transitionName">
<li v-for="post in currentPosts" :key="post.url">
<span>文章地址:{{ post.url }}</span>
<span>文章 frontmatter 数据:{{ post.frontmatter }}</span>
<span>文章摘要:{{ post.excerpt }}</span>
<span>文章作者:{{ post.author }}</span>
<span>文章 frontmatter.title:{{ post.title }}</span>
<span>文章 frontmatter.date:{{ post.date }}</span>
<span>文章前 300 个文字:{{ post.capture }}</span>
</li>
</TransitionGroup>
</template>
</Teek.Layout>
</template>v-bind 返回的 transitionName 为 post 配置项的 transitionName,具体可以查看 Teek 的列表风格和卡片风格的代码实现。
卡片栏插槽
teek-home-card-beforeteek-home-cardv1.3.1teek-home-card-afterteek-home-card-my-beforeteek-home-card-myv1.3.1teek-home-card-my-afterteek-home-card-top-article-beforeteek-home-card-top-articlev1.3.1teek-home-card-top-article-afterteek-home-card-category-beforeteek-home-card-categoryv1.3.1teek-home-card-category-afterteek-home-card-tag-beforeteek-home-card-tagv1.3.1teek-home-card-tag-afterteek-home-card-friend-link-beforeteek-home-card-friend-linkv1.3.1teek-home-card-friend-link-afterteek-home-card-doc-analysis-beforeteek-home-card-doc-analysisv1.3.1teek-home-card-doc-analysis-after
移动端插槽:
teek-home-card-my-screen-beforev1.3.1teek-home-card-my-screenv1.3.1teek-home-card-my-screen-afterv1.3.1
不带 -before 和 -after 的插槽是直接覆盖卡片本身。
底部插槽
teek-footer-info-beforeteek-footer-info-after:等于 VitePress 的layout-bottom插槽teek-footer-infov1.4.5
文章页插槽
当 layout: 'doc' 在 frontmatter 中被启用时:
teek-article-analyze-before:等于 VitePress 的doc-before插槽teek-article-analyze-afterteek-article-share-beforeteek-article-share-after:等于 VitePress 的aside-outline-before插槽teek-doc-after-appreciation-before:等于 VitePress 的doc-after插槽teek-doc-after-appreciation-after:等于 Teek 的teek-comment-before插槽teek-comment-beforeteek-comment-afterteek-aside-bottom-appreciation-before:等于 VitePress 的aside-bottom插槽teek-aside-bottom-appreciation-afterteek-doc-update-beforev1.2.0teek-doc-update-afterv1.2.0teek-article-bottom-tip-beforev1.4.6teek-article-bottom-tip-afterv1.4.6
功能页插槽
当 layout: 'page' 在 frontmatter 中被启用时:
teek-page-top-before:等于 VitePress 的page-top插槽teek-page-top-after
归档页插槽
teek-archives-top-beforeteek-archives-top-after
目录页插槽
teek-catalogue-top-beforeteek-catalogue-top-after
登录页插槽
teek-login-pagev1.3.0:覆盖 Teek 的登录页,适用于自己实现一个登录页
风险链接提示页
teek-risk-link-pagev1.3.0:覆盖 Teek 的风险链接提示页,适用于自己实现一个风险链接提示页
全局插槽
右下角按钮组插槽
teek-right-bottom-beforeteek-right-bottom-afterteek-back-topv1.4.0:覆盖回到顶部组件,可以接收 4 个参数:- show:是否显示,当处于顶部时为 false,往下滚动后为 true,可用于控制组件的显示
- progress:当前滚动条的进度
- icon:内置的默认图标
- scrollToTop:回到顶部方法
如:
vue
<script setup lang="ts">
import Teek, { TkIcon } from "vitepress-theme-teek";
</script>
<template>
<Teek.Layout>
<template #teek-back-top="{ show, progress, scrollToTop }">
<!-- 如下是 Teek 当前实现的部分内容,这些 class 会激活 Teek 的内置样式 -->
<div
v-show="show"
title="回到顶部"
@click="scrollToTop"
class="tk-right-bottom-button__button back-top"
:style="{ '--tk-progress': progress, cursor: 'pointer' }"
role="button"
aria-label="回到顶部"
:aria-valuenow="progress"
aria-valuemin="0"
aria-valuemax="100"
>
<span class="content">{{ progress }}</span>
</div>
</template>
</Teek.Layout>
</template>teek-to-commentv1.4.0:覆盖滚动到评论区组件,可以接收 3 个参数:- show:是否显示,当处于评论区域时为 false,离开评论区域为 true,可用于控制组件的显示
- icon:内置的默认图标
- scrollToComment:滚动到评论区方法
如下是 Teek 当前实现的效果示例:
vue
<script setup lang="ts">
import Teek, { TkIcon } from "vitepress-theme-teek";
</script>
<template>
<Teek.Layout>
<template #teek-to-comment="{ show, icon, scrollToComment }">
<!-- 如下是 Teek 当前实现的部分内容,这些 class 会激活 Teek 的内置样式 -->
<div
title="滚动到评论区"
class="tk-right-bottom-button__button"
@click="scrollToComment"
role="button"
aria-label="滚动到评论区"
>
<TkIcon :icon="icon" aria-hidden="true" />
</div>
</template>
</Teek.Layout>
</template>提示
只有当页面存在评论区时,该功能/插槽才会生效。
其他插槽
teek-sidebar-triggerv1.4.0:覆盖侧边栏展开/折叠触发器组件,可以接收 2 个参数:- active:点击触发器后为
true,300s后为false,目的是可以添加一个class或style来实现部分功能(过渡动画等) - icon:icon:内置的默认图标
- toggleSideBar:点击触发器事件
- active:点击触发器后为
如下是 Teek 当前实现的效果示例:
vue
<script setup lang="ts">
import Teek, { TkIcon } from "vitepress-theme-teek";
</script>
<template>
<Teek.Layout>
<template #teek-sidebar-trigger="{ active, icon, toggleSideBar }">
<!-- 如下是 Teek 当前实现的部分内容,这些 class 会激活 Teek 的内置样式 -->
<div :class="{ active: active }" class="tk-sidebar-trigger is-active" @click="toggleSideBar">
<div class="tk-right-bottom-button__button">
<TkIcon :icon="icon" />
</div>
</div>
</template>
</Teek.Layout>
</template>teek-loadingv1.4.0:切换页面(路由)时加载 Loading 动画,切换结束关闭 Loading 动画插槽,可以接收 1 个参数:- loading:开始切换页面(路由)时为 true,切换结束为 false
如下是 Teek 当前实现的效果示例:
vue
<script setup lang="ts">
import Teek, { TkIcon } from "vitepress-theme-teek";
</script>
<template>
<Teek.Layout>
<template #teek-loading="{ loading }">
<!-- 如下是 Teek 当前实现的部分内容,这些 class 会激活 Teek 的内置样式 -->
<div class="tk-route-loading">
<div v-show="loading" class="tk-route-loading__mask">
<div class="tk-route-loading__loader">
<div class="tk-route-loading__spinner" />
<p>Teek 拼命加载中 ...</p>
</div>
</div>
</div>
</template>
</Teek.Layout>
</template>主题增强插槽
teek-theme-enhance-topteek-theme-enhance-bottom