前言

VuePress 主题默认有 <CodeGroup> 组件用于切换代码很方便。

如图所示:

痛点

使用 VitePress 后,官方没有提供 <CodeGroup> 组件类似的方案。

参考 VuePress 源码

https://github.com/vuejs/vuepress/blob/38e98634af117f83b6a32c8ff42488d91b66f663/packages/%40vuepress/theme-default/global-components/CodeGroup.vue

自己封装 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全局组件封装的更多相关文章

  1. react封装简单的浏览器顶部加载进度条全局组件

    在项目中经常会有在请求前后加loading或者加加载进度条,一般这些组件都会抽离出来作为全局组件 进度条的插件貌似都不是很符合自己项目中的需求,于是.. 参考nprogress样式,自己在项目中封装组 ...

  2. vue.js中的全局组件和局部组件

    组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能. 组件的使用有三 ...

  3. 前端笔记之Vue(三)生命周期&CSS预处理&全局组件&自定义指令

    一.Vue的生命周期 生命周期就是指一个对象的生老病死的过程. 用Vue框架,熟悉它的生命周期可以让开发更好的进行. 所有的生命周期钩子自动绑定 this 上下文到实例中,因此你可以访问数据,对属性和 ...

  4. 将自己写的组件封装成类似element-ui一样的库,可以cdn引入

    在写好自己的组件之后 第一步 修改目录结构 在根目录下创建package文件夹,用于存放你要封装的组件 第二部 在webpack配置中加入 pages与publicpath同级 pages: { in ...

  5. vue自定义组件(vue.use(),install)+全局组件+局部组件

    相信大家都用过element-ui.mintui.iview等诸如此类的组件库,具体用法请参考:https://www.cnblogs.com/wangtong111/p/11522520.html ...

  6. vue组件化初体验 全局组件和局部组件

    vue组件化初体验 全局组件和局部组件 vue组件化 全局组件 局部组件  关于vue入门案例请参阅 https://www.cnblogs.com/singledogpro/p/11938222.h ...

  7. elementUI分页组件封装

    在实际开发需求,产品需要的分页组件比较简单,只可以一页页地翻,就是为了防止用于直接翻看最后的数据(因为有一些历史数据数据量比较大,查看的意义不大,检索效率比较低也比较忙,因为不希望用户在翻页的时候可以 ...

  8. 循序渐进VUE+Element 前端应用开发(20)--- 使用组件封装简化界面代码

    VUE+Element 前端应用,比较不错的一点就是界面组件化,我们可以根据重用的指导方针,把界面内容拆分为各个不同的组合,每一个模块可以是一个组件,也可以是多个组件的综合体,而且这一个过程非常方便. ...

  9. 04.ElementUI源码学习:组件封装、说明文档的编写发布

    0x00.前言 书接上文.项目经过一系列的配置,开发脚手架已经搭建完毕.接下来开始封装自定义组件.并基于 markdown 文件生成文档和演示案例. 后续文章代码会根据篇幅,不影响理解的情况下进行部分 ...

  10. VUE3 之 全局组件与局部组件

    1. 概述 老话说的好:忍耐是一种策略,同时也是一种性格磨炼. 言归正传,今天我们来聊聊 VUE 的全局组件与局部组件. 2. 全局组件 2.1 不使用组件的写法  <body> < ...

随机推荐

  1. Qt编写地图综合应用53-省市轮廓图下载

    一.前言 Qt的浏览器控件的交互机制非常方便,所以在在线地图的时候可以对每个区域的经纬度坐标集合发给Qt程序,让他去存储到文件,在实际的测试过程中,发现有部分地图有多个封闭的曲线的,比如散落的岛屿和飞 ...

  2. error C2065: “CV_DATA_AS_ROW”: 未声明的标识符

    ce_dect\main_face.cpp(117): error C2065: "CV_DATA_AS_ROW": 未声明的标识符将 "CV_PCA_DATA_AS_R ...

  3. [转]奇异值分解(SVD)方法求解最小二乘问题的原理

    原文链接:奇异值分解(SVD)方法求解最小二乘问题的原理 翻译 搜索 复制

  4. Docker简易操作

    Docker简易操作 1.启动docker sudo docker run [OPTIONS] IMAGE [COMMAND] [ARG...] sudo docker run -d -p 8009: ...

  5. springcloud eureka原理和机制

    公司的注册中心使用的是Eureka,之前使用过ZooKeeper,大致原理应该差不多,具体细节需要进一步学习,正好之前在腾讯云开发者社区看到一篇讲得很不错的文章,转载过来方便查看. 简介 在微服务架构 ...

  6. 性能测试工具_nGrinder

    1. ngrinder-controller-3.4.3.war 放置到tomcat的webapps目录下:2. 启动tomcat;3. 访问地址: http://localhost:8080/ngr ...

  7. JS端实现图片、视频时直接下载而不是打开预览

    项目中的附件列表,通常情况都需要提供下载.删除的功能,功能本身没有什么要说的,都是基本功能,使用浏览器的的下载功能,也都是用window.open(url),或者window.location.hre ...

  8. CDS标准视图:设备信息 I_EquipmentData

    视图名称:I_EquipmentData 视图类型:基础视图 视图代码: 点击查看代码 @EndUserText.label: 'Equipment Data' @VDM.viewType: #COM ...

  9. WPF 加载外部字体

    例如将字体放入d:/Fonts 文件夹.然后就可以通过类似 btn.FontFamily = new FontFamily("file:///d:/Fonts/#Ashley"); ...

  10. HttpClient.PostAsynct 发送Json数据

    HttpClient.PostAsync第二个参数设置HttpContent 发送Json数据. 需要这是这个content.Headers.ContentType = new System.Net. ...