Skip to content

Typewriter 打字器 ✍

📌 注意

v1.2.0 版本 提供解决 样式覆盖渲染图表 以及 自定义代码高亮样式、自定义插件 简单方案

一、我们在组件库新增了 prismjs 官方的 css 样式文件,可以在项目直接引入,解决 md 代码块高亮问题。

二、我们在组件库新增了 Mermaid.js。用于解决 mermaid 格式 简单的图表渲染问题。

三、我们把 markdown-it 内置的 代码高亮方法插件 暴露出来。方便开发者更好的集成第三方生态的 样式插件

💩 md 渲染这一块,还是有较多的 问题,比如增量更新,代码块高亮,以及复杂图表的渲染等实际项目需求。目前也在尝试更多的 解决方案。💩

💩 打字器组件 请酌情使用,需求比较复杂,组件库确实不能满足还请自行处理渲染逻辑。💩

🐵 此温馨提示更新时间:2025-05-06

💌 消息

v1.1.6 版本 支持雾化效果。请及时更新尝试

此消息更新时间:2025-04-13

💔 危险

v1.0.81 版本 ,以及更早版本。在流式输出的情况下,存在一定的性能问题。

在新版本中已修复,请及时升级至最新版本,以获得更好的体验。

此警告更新时间:2025-04-06

介绍

Typewriter 是一个可高度定制化开发的 打字器组件,灵感来自 ant-design-x 官方 气泡组件 案例,将打字方法剥离出来。支持 Markdown 渲染 和 动态打字效果。

💌 消息

🐱 打字器组件会在组件的生命周期中会自动销毁,不用担心内存泄漏,请放心使用。

代码演示

基本使用

基础用法。

Markdown 渲染

通过 isMarkdown 属性控制是否启用 Markdown 渲染模式。

MD-代码块高亮(v1.2.0 新增)

提供一个内置的样式

ts

// 导入 Prism 语法高亮的不同主题样式(基于 vue-element-plus-x 插件提供的样式文件)
// 每个文件对应一种独立的代码高亮主题风格,可根据项目需求选择启用

// 1. Coy 主题(简约浅色风格,适合日常阅读)
import 'vue-element-plus-x/styles/prism-coy.min.css'

// 2. Dark 主题(深色背景主题,适合夜间模式或低光环境)
import 'vue-element-plus-x/styles/prism-dark.min.css'

// 3. Funky 主题(鲜艳色彩风格,代码语法高亮对比强烈)
import 'vue-element-plus-x/styles/prism-funky.min.css'

// 4. Okaidia 主题(深色高对比度主题,注重代码结构区分)
import 'vue-element-plus-x/styles/prism-okaidia.min.css'

// 5. Solarized Light 主题(柔和浅色主题,基于 Solarized 配色方案)
import 'vue-element-plus-x/styles/prism-solarizedlight.min.css'

// 6. Tomorrow 主题(现代简约风格,适合宽屏和大字体显示)
import 'vue-element-plus-x/styles/prism-tomorrow.min.css'

// 7. Twilight 主题(黄昏色调主题,介于明暗之间的平衡风格)
import 'vue-element-plus-x/styles/prism-twilight.min.css'

// 8. Prism 核心基础样式(必须导入,包含语法高亮的基础样式和结构)
import 'vue-element-plus-x/styles/prism.min.css'

/* 使用说明:
1. prism.min.css 是 Prism 的核心样式,包含基本的代码块布局和通用样式,必须保留
2. 其他以 prism-开头的文件是不同的主题样式,可根据项目视觉设计选择 1 个或多个导入
3. 若同时导入多个主题,后导入的样式会覆盖先导入的(可通过切换类名动态切换主题)
4. 主题名称对应 Prism 官方预设主题(如 Coy、Okaidia 等),样式细节可参考 Prism 主题文档
*/

MD-插件模式(v1.2.0 新增)

如果你觉得内置的样式不好看或者内置的插件不能满足你的需求,可以通过插件模式自定定义 样式插件

你也可以自定在 markdown-it 社区中寻找自定义插件,以实现更多自定义功能。 通过 md-plugins 属性,传入 markdown-it 插件数组,即可在 markdown-it 中使用自定义插件。 通过 highlight 函数,传入 Prism 的高亮函数,或者其他高亮库,作用在 markdown-it 中使用 Prism 的高亮功能。

详细 Mermaid 格式 参见:Mermaid.js

📌 注意

md 渲染这一块暂时这样处理,后续有计划做成 豆包那种,目前没有内置样式。请耐心等待。。。🐒预计5月底至6月初上

开启打字效果

通过 typing 属性控制是否启用 打字渲染模式。typing 也可以是一个对象,设置 step 属性,控制打字每次吐字,interval 属性控制打字间隔,suffix 属性控制打字添加的后缀。

📌 注意

suffix 属性只能设置字符串,且在 isMarkdowntrue 时失效,因为后缀会受 markdown 渲染影响,始终会另起一行进行展示,这一点在 ant-design-x 中也会出现。所以我们先暂时决定在 isMarkdowntrue 时,不展示后缀,让打字器尽可能美观。

打字器雾化效果

通过 isFog 属性控制是否启用雾化效果。注意,该属性在 isTypingtrue 时才生效。切回覆盖默认的 typing 后缀属性。

动态更新内容

🐒 当使用 typing 属性时,更新 content 如果是之前的子集,则会继续输出,否则会重新输出。

控制打字

💩 更好的控制中断输出、继续打字和销毁等操作 你可以通过组件的 ref 实例获取以下方法和属性:

  • interrupt 中断打字过程 typerRef.interrupt()
  • continue 继续未完成的打字 typerRef.continue()
  • restart 重新开始打字 typerRef.restart()
  • destroy 销毁组件(清理资源) typerRef.destroy()
  • renderedContent 获取当前渲染的内容。 typerRef.renderedContent.value
  • isTyping 获取当前是否正在打字。 typerRef.isTyping.value
  • progress 获取当前进度百分比。 typerRef.progress.value

💡 提示

你还可以设置组件的监听事件,获取组件的状态。

  • @start 打字开始时触发
  • @finish 打字结束时触发
  • @writing 打字时触发

三个方法,默认参数返回组件实例。

属性

属性名类型是否必填默认值描述
contentString''要展示的文本内容,支持纯文本或 Markdown 格式。
isMarkdownBooleanfalse是否启用 Markdown 渲染模式。
typingBoolean | { step?: number, interval?: number, suffix?: string }false是否启用打字机效果。
typing.stepNumber2每次打字吐多少字符。
typing.intervalNumber50每次打字的间隔时间 单位( ms )。
typing.suffixString'|'打字器后缀光标字符(仅在非 Markdown 模式下生效)。
isFogBoolean | { bgColor?: string, width?: string }false是否启用雾化效果,可以设置背景色和宽度。

事件

事件名参数类型描述
@startref 实例Function当打字效果开始时触发
@finishref 实例Function当打字效果完成时触发
@writingref 实例Function当打字效果进行中不断触发

Ref 实例方法

属性名类型描述
interruptFunction中断打字。
continueFunction继续未完成的打字。
restartFunction重新开始打字。
destroyFunction主动销毁打字组件。
renderedContentString获取打字组件渲染的内容。
isTypingBoolean是否正在打字。
progressNumber打字进度,取值范围 0 - 100。

功能特性

  1. Markdown 支持:支持渲染 Markdown 格式的文本,并应用 GitHub 风格的样式。
  2. 动态打字效果:可以模拟打字机的效果,逐步显示文本内容。
  3. 代码高亮:内置 Prism.js,支持代码块的语法高亮。
  4. XSS 安全:使用 DOMPurify 对 HTML 内容进行过滤,防止 XSS 攻击。
  5. 灵活配置:支持自定义打字速度、光标字符、后缀等参数。
  6. 定制化开发:支持更据组件打字的状态做定制化开发。