Skip to content

RichTextEditor 富文本编辑器

基于 Tiptap 2.x 的富文本编辑器组件,支持截图粘贴上传图片、工具栏可配置、文件选择上传图片,配套只读渲染组件 RichTextViewer。

基础用法

vue
<template>
  <RichTextEditor
    v-model="content"
    v-model:html="htmlContent"
    placeholder="请输入内容…"
    :on-upload-image="handleUpload"
  />

  <!-- 渲染预览 -->
  <RichTextViewer :content="content" />
</template>

<script setup>
import { ref } from 'vue'

const content = ref()
const htmlContent = ref('')

async function handleUpload(file) {
  // 调用你的上传接口,返回图片 URL
  const formData = new FormData()
  formData.append('file', file)
  const res = await fetch('/api/upload', { method: 'POST', body: formData })
  const { url } = await res.json()
  return url
}
</script>

工具栏配置

通过 toolbar prop 自定义工具栏显示的按钮,使用 "|" 作为分组分隔符。不传则默认显示全部按钮。

vue
<template>
  <!-- 只显示基础文字格式 + 链接 + 撤销重做 -->
  <RichTextEditor
    v-model="content"
    :toolbar="['bold', 'italic', 'underline', '|', 'link', '|', 'undo', 'redo']"
  />

  <!-- 精简模式:去掉表格和代码块 -->
  <RichTextEditor
    v-model="content"
    :toolbar="[
      'bold', 'italic', 'underline', 'strike', '|',
      'heading', '|',
      'bulletList', 'orderedList', '|',
      'link', 'image', 'blockquote', '|',
      'undo', 'redo'
    ]"
  />
</template>

可用的工具项

工具项说明
bold粗体
italic斜体
underline下划线
strike删除线
highlight高亮
subscript下标
superscript上标
code行内代码
color文字颜色
heading标题选择(H1-H4)
bulletList无序列表
orderedList有序列表
taskList任务列表
alignLeft左对齐
alignCenter居中对齐
alignRight右对齐
link插入链接
image插入图片
blockquote引用
codeBlock代码块
horizontalRule分割线
table表格
undo撤销
redo重做
|分组分隔符

图片上传

点击工具栏图片按钮会打开系统文件选择弹窗,选择图片后:

  • 如果传入了 onUploadImage:调用该函数上传文件,返回 URL 后插入编辑器
  • 如果未传入 onUploadImage:自动将图片转为 base64 插入

编辑器还内置了截图粘贴和拖拽上传支持:

typescript
// 函数签名
type UploadImageFn = (file: File) => Promise<string>

当用户在编辑器中:

  • Ctrl+V 粘贴截图 — 自动从剪贴板提取图片
  • 拖拽图片文件 — 自动提取拖入的图片

组件会调用 onUploadImage 函数,等待返回图片 URL 后自动插入编辑器。

插入链接

点击工具栏链接按钮会弹出内联输入框,支持:

  • 输入链接地址后按 Enter 或点击"确定"插入
  • 按 Esc 或点击外部区域取消
  • 当光标在已有链接上时,自动回显链接地址,并可"移除"链接

使用 HTML 渲染

RichTextViewer 也支持直接传入 HTML 字符串:

vue
<RichTextViewer html="<h1>标题</h1><p>正文内容</p>" />

功能列表

功能说明
文字格式粗体、斜体、下划线、删除线、行内代码
高亮文字背景高亮
上下标上标、下标
文字颜色自定义文字颜色
标题H1 ~ H4
列表无序列表、有序列表、任务列表
对齐左对齐、居中、右对齐
引用块引用
代码块多行代码块
表格插入/编辑/删除表格,添加/删除行列
图片文件选择上传 + 截图粘贴上传 + 拖拽上传
链接内联弹出框插入超链接
分割线水平分割线
撤销/重做Ctrl+Z / Ctrl+Shift+Z
工具栏配置可自定义显示/隐藏工具栏项
SVG 图标所有工具栏按钮使用 SVG 图标,清晰一致

RichTextEditor API

Props

属性说明类型默认值
modelValue (v-model)编辑内容,Tiptap JSON 格式JSONContent
html (v-model:html)编辑内容,HTML 字符串string
placeholder占位文本string'请输入内容…'
onUploadImage图片上传函数(file: File) => Promise<string>
disabled是否禁用booleanfalse
minHeight编辑器最小高度string | number'300px'
toolbar工具栏配置(ToolbarItem | "|")[]全部显示

Events

事件说明参数
update:modelValue内容变化(JSON)JSONContent
update:html内容变化(HTML)string

类型导出

typescript
import type { ToolbarItem, UploadImageFn } from 'vmf-kit/components'
import { DEFAULT_TOOLBAR } from 'vmf-kit/components'

RichTextViewer API

Props

属性说明类型默认值
contentTiptap JSON 内容JSONContent
htmlHTML 字符串内容string

依赖说明

基于 Tiptap 2.x 编辑器框架,使用了以下扩展:

  • @tiptap/starter-kit — 基础扩展集
  • @tiptap/extension-image — 图片
  • @tiptap/extension-link — 链接
  • @tiptap/extension-table — 表格
  • @tiptap/extension-task-list — 任务列表
  • @tiptap/extension-highlight — 高亮
  • @tiptap/extension-underline — 下划线
  • @tiptap/extension-text-align — 文本对齐
  • @tiptap/extension-color — 文字颜色
  • 等更多扩展

Released under the MIT License.