VitePress全局组件封装
前言
VuePress 主题默认有 <CodeGroup> 组件用于切换代码很方便。
如图所示:

痛点
使用 VitePress 后,官方没有提供 <CodeGroup> 组件类似的方案。
参考 VuePress 源码
自己封装 CodeGroup
项目下新建全局组件:components\CodeGroup.vue
实现代码如下:
<template>
<ClientOnly>
<div class="theme-code-group">
<div class="theme-code-group__nav">
<ul class="theme-code-group__ul">
<li
v-for="(tab, i) in codeTabs"
:key="tab.title"
class="theme-code-group__li"
>
<button
class="theme-code-group__nav-tab"
:class="{
'theme-code-group__nav-tab-active': i === activeCodeTabIndex,
}"
@click="changeCodeTab(i)"
>
{{ tab.title }}
</button>
</li>
</ul>
</div>
<slot />
<pre v-if="codeTabs.length < 1" class="pre-blank"> // 没代码~ </pre>
</div>
</ClientOnly>
</template>
<script>
export default {
name: 'CodeGroup',
data() {
return {
codeTabs: [],
activeCodeTabIndex: -1,
}
},
watch: {
activeCodeTabIndex(index) {
this.activateCodeTab(index)
},
},
mounted() {
this.loadTabs()
},
methods: {
changeCodeTab(index) {
this.activeCodeTabIndex = index
},
async loadTabs() {
await this.$nextTick()
this.codeTabs = (this.$slots.default() || [])
.filter(slot => Boolean(slot.props))
.map((slot, index) => {
if (slot.props.active === '') {
this.activeCodeTabIndex = index
}
return {
title: slot.props.title,
elm: slot.el,
}
})
if (this.activeCodeTabIndex === -1 && this.codeTabs.length > 0) {
this.activeCodeTabIndex = 0
}
this.activateCodeTab(0)
},
activateCodeTab(index) {
this.codeTabs.forEach(tab => {
if (tab.elm) {
tab.elm.style.display = 'none'
}
})
if (this.codeTabs[index]?.elm) {
this.codeTabs[index].elm.style.display = 'block'
}
},
},
}
</script>
<style scoped>
/* .theme-code-group {} */
.theme-code-group__nav {
margin-bottom: -35px;
background-color: #282c34;
padding-bottom: 22px;
border-radius: 6px;
padding-left: 10px;
padding-top: 10px;
}
.theme-code-group__ul {
margin: auto 0;
padding-left: 0;
display: flex;
list-style: none;
}
.theme-code-group__li {
margin-top: 0;
margin-right: 10px;
}
.theme-code-group__nav-tab {
border: 0;
padding: 5px;
cursor: pointer;
background-color: transparent;
font-size: 0.85em;
line-height: 1.4;
color: rgba(255, 255, 255, 0.9);
font-weight: 600;
}
.theme-code-group__nav-tab-active {
border-bottom: #42b983 1px solid;
}
.pre-blank {
color: #42b983;
margin: 0;
}
</style>
全局注册组件
新建主题配置文件:docs\.vitepress\theme\index.js
VitePress 中注册全局组件:
import DefaultTheme from 'vitepress/theme'
import CodeGroup from '../../../components/CodeGroup.vue'
export default {
...DefaultTheme,
enhanceApp({ app }) {
app.component('CodeGroup', CodeGroup)
}
}
在 md 文档中使用
注意:由于语法限制,以下代码统一缩进了一个 Tab 制表符,在使用时请删除 Tab 制表符。
# CodeGroup 自定义全局组件
## 测试 JS + TS
<CodeGroup>
<div title="ts" active>
```ts{2}
// 注释
const add = (a: number, b: number): number => {
return a + b
}
console.log(add(1, 2))
```
</div>
<div title="js">
```js{2}
// 注释
const add = (a, b) => {
return a + b
}
console.log(add(1, 2))
```
</div>
</CodeGroup>
## 测试 yarn + npm + pnpm
<CodeGroup>
<div title="yarn" active>
```sh
# install in your project
yarn add -D vitePress
```
</div>
<div title="npm">
```sh
# install in your project
npm install -D vitePress
```
</div>
<div title="pnpm">
```sh
# install in your project
pnpm install -D vitePress
```
</div>
</CodeGroup>
效果预览

VitePress全局组件封装的更多相关文章
- react封装简单的浏览器顶部加载进度条全局组件
在项目中经常会有在请求前后加loading或者加加载进度条,一般这些组件都会抽离出来作为全局组件 进度条的插件貌似都不是很符合自己项目中的需求,于是.. 参考nprogress样式,自己在项目中封装组 ...
- vue.js中的全局组件和局部组件
组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能. 组件的使用有三 ...
- 前端笔记之Vue(三)生命周期&CSS预处理&全局组件&自定义指令
一.Vue的生命周期 生命周期就是指一个对象的生老病死的过程. 用Vue框架,熟悉它的生命周期可以让开发更好的进行. 所有的生命周期钩子自动绑定 this 上下文到实例中,因此你可以访问数据,对属性和 ...
- 将自己写的组件封装成类似element-ui一样的库,可以cdn引入
在写好自己的组件之后 第一步 修改目录结构 在根目录下创建package文件夹,用于存放你要封装的组件 第二部 在webpack配置中加入 pages与publicpath同级 pages: { in ...
- vue自定义组件(vue.use(),install)+全局组件+局部组件
相信大家都用过element-ui.mintui.iview等诸如此类的组件库,具体用法请参考:https://www.cnblogs.com/wangtong111/p/11522520.html ...
- vue组件化初体验 全局组件和局部组件
vue组件化初体验 全局组件和局部组件 vue组件化 全局组件 局部组件 关于vue入门案例请参阅 https://www.cnblogs.com/singledogpro/p/11938222.h ...
- elementUI分页组件封装
在实际开发需求,产品需要的分页组件比较简单,只可以一页页地翻,就是为了防止用于直接翻看最后的数据(因为有一些历史数据数据量比较大,查看的意义不大,检索效率比较低也比较忙,因为不希望用户在翻页的时候可以 ...
- 循序渐进VUE+Element 前端应用开发(20)--- 使用组件封装简化界面代码
VUE+Element 前端应用,比较不错的一点就是界面组件化,我们可以根据重用的指导方针,把界面内容拆分为各个不同的组合,每一个模块可以是一个组件,也可以是多个组件的综合体,而且这一个过程非常方便. ...
- 04.ElementUI源码学习:组件封装、说明文档的编写发布
0x00.前言 书接上文.项目经过一系列的配置,开发脚手架已经搭建完毕.接下来开始封装自定义组件.并基于 markdown 文件生成文档和演示案例. 后续文章代码会根据篇幅,不影响理解的情况下进行部分 ...
- VUE3 之 全局组件与局部组件
1. 概述 老话说的好:忍耐是一种策略,同时也是一种性格磨炼. 言归正传,今天我们来聊聊 VUE 的全局组件与局部组件. 2. 全局组件 2.1 不使用组件的写法 <body> < ...
随机推荐
- springboot带参数的文件上传
这个工程是在内网环境进行开发,u口也被封住了,所以不能把代码拷贝出来,于是把业务部分进行脱敏处理,核心代码手写一遍如下:一.html关键代码 <form id = "createFor ...
- RepeatReadRequestWrapper
package cn.service.web.common.filter; import com.alibaba.fastjson.JSON; import org.apache.commons.io ...
- OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054
OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054,vagrant box add laravel/homestead,安装 Homestead Vagr ...
- jacoco-实战篇-增量覆盖率
我fork的jacoco源码改造好:https://github.com/exmyth/jacoco 入口:https://github.com/exmyth/jacoco/blob/master/o ...
- DevNow x Notion
前言 Notion 应该是目前用户量比较大的一个在线笔记软件,它的文档系统也非常完善,支持多种文档格式,如 Markdown.富文本.表格.公式等. 早期我也用过一段时间,后来有点不习惯,就换到了 O ...
- 龙哥量化:通达信(KT交易师)分时图主图叠加5分钟K线图
股友要求在通达信分时图主图叠加5分钟K线,但是通达信的分时图取不到最高价,最低价等数据,限制非常多. 然后我在KT交易师上写的公式测试成功了,效果如下. 如果您需要公式源码或者代写公式, 请联系我. ...
- Qt/C++地图导航app/支持qml/手机运行/输入起点终点规划路径/模拟轨迹移动
一.前言说明 搞Qt地图开发这块,随着研究的深入,用户的需求变化,最近又需要在手机上运行,由于本地图组件依赖浏览器控件,而手机安卓上的Qt并没有带qwebengine控件,怎么办呢,不断的努力验证下, ...
- 创建用于预测序列的人工智能模型,用Keras Tuner探索模型的超参数。
上一篇:<创建用于预测序列的人工智能模型(五),调整模型的超参数> 序言:在完成初步的模型研发后,接下来的重点是探索和优化超参数.通过合理调整超参数(如学习率.动量参数.神经元数量等),可 ...
- Qt 中实现系统主题感知
[写在前面] 在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观. Qt 作为一个跨平台的C++图形用户界面应用程序 ...
- 长连接网关技术专题(六):石墨文档单机50万WebSocket长连接架构实践
本文由石墨文档技术杜旻翔分享,原题"石墨文档 Websocket 百万长连接技术实践",有修订. 1.引言 在石墨文档的部分业务中,例如文档分享.评论.幻灯片演示和文档表格跟随等场 ...