Vue中使用Tiptap富文本编辑器的方法指南

 更新时间:2026年02月27日 10:25:35   作者:Byron0707  
Tiptap是一个无头(headless)的富文本编辑器框架,专为 Web 工匠设计,它提供了高度可定制和可扩展的编辑器功能,适用于各种前端框架,这篇文章主要介绍了Vue中使用Tiptap富文本编辑器的相关资料,需要的朋友可以参考下

前言

Tiptap 是一款基于 ProseMirror 构建的现代化富文本编辑器,以其高度可定制性和插件化架构在 Vue/React 生态中备受青睐。本文将系统介绍如何在 Vue 3 项目中集成 Tiptap,并实现基础功能与进阶扩展。

一、环境准备与基础集成

1. 安装依赖

npm install @tiptap/vue-3 @tiptap/starter-kit
  • @tiptap/vue-3:Vue 3 专用适配器
  • @tiptap/starter-kit:基础功能包(含标题、列表、撤销等)

2. 创建编辑器组件

<template>
  <div class="editor-container">
    <editor-content :editor="editor" class="editor" />
  </div>
</template>
<script setup>
import { onBeforeUnmount, ref } from 'vue'
import { Editor, EditorContent } from '@tiptap/vue-3'
import StarterKit from '@tiptap/starter-kit'
const editor = ref(null)
onMounted(() => {
  editor.value = new Editor({
    extensions: [StarterKit],
    content: '<p>欢迎使用 Tiptap 编辑器</p>',
  })
})
onBeforeUnmount(() => {
  editor.value?.destroy()
})
</script>
<style scoped>
.editor {
  border: 1px solid #ddd;
  padding: 16px;
  min-height: 300px;
  border-radius: 4px;
}
</style>

二、核心功能扩展

1. 常用扩展插件

插件名称安装命令功能说明
@tiptap/extension-linknpm install @tiptap/extension-link链接插入与编辑
@tiptap/extension-imagenpm install @tiptap/extension-image图片上传(需自定义上传逻辑)
@tiptap/extension-tablenpm install @tiptap/extension-table表格操作(含行列增删)
@tiptap/extension-code-block-lowlightnpm install @tiptap/extension-code-block-lowlight lowlight代码高亮(需配合语法库)

2. 完整扩展配置示例

import Link from '@tiptap/extension-link'
import Image from '@tiptap/extension-image'
import Table from '@tiptap/extension-table'
import TableRow from '@tiptap/extension-table-row'
import TableCell from '@tiptap/extension-table-cell'
import TableHeader from '@tiptap/extension-table-header'
import CodeBlockLowlight from '@tiptap/extension-code-block-lowlight'
import { lowlight } from 'lowlight/lib/common'
const editor = new Editor({
  extensions: [
    StarterKit,
    Link.configure({
      openOnClick: false, // 禁用点击跳转
      validate: href => /^https?:\/\//.test(href), // 验证URL格式
    }),
    Image.configure({
      allowBase64: true, // 允许base64图片
      HTMLAttributes: {
        class: 'editor-image',
      },
    }),
    Table.configure({
      resizable: true,
    }),
    TableRow,
    TableCell,
    TableHeader,
    CodeBlockLowlight.configure({
      lowlight,
    }),
  ],
  content: '<p>开始编辑...</p>',
})

三、进阶功能实现

1. 自定义上传图片

import { uploadImage } from '@/api/upload' // 假设存在上传接口
const editor = new Editor({
  extensions: [
    Image.configure({
      inline: true, // 行内图片
      async onUpload({ file }) {
        const formData = new FormData()
        formData.append('file', file)
        const { data } = await uploadImage(formData)
        return data.url // 返回图片URL
      },
    }),
  ],
})

2. 实时字数统计

<template>
  <div>
    <editor-content :editor="editor" />
    <div class="word-count">当前字数:{{ characterCount }}</div>
  </div>
</template>
<script setup>
import { computed } from 'vue'
import CharacterCount from '@tiptap/extension-character-count'
const editor = new Editor({
  extensions: [
    StarterKit,
    CharacterCount.configure({
      limit: 1000, // 限制1000字
    }),
  ],
})
const characterCount = computed(() => editor.storage.characterCount.characters())
</script>

3. 自定义工具栏

<template>
  <div class="toolbar">
    <button @click="editor.chain().focus().toggleBold().run()" :disabled="!editor.can().chain().focus().toggleBold().run()">
      <strong>B</strong>
    </button>
    <button @click="editor.chain().focus().toggleItalic().run()" :disabled="!editor.can().chain().focus().toggleItalic().run()">
      <em>I</em>
    </button>
    <!-- 更多按钮... -->
  </div>
  <editor-content :editor="editor" />
</template>

四、性能优化与最佳实践

  • 资源清理:在组件卸载时调用 editor.destroy()
  • 懒加载:对非首屏编辑器使用动态导入
  • 插件管理:按需加载插件,避免过度扩展
  • 内容安全:对用户输入进行XSS过滤(Tiptap默认已转义)

五、常见问题解决

  • Vue 3组合式API适配使用 ref 包裹编辑器实例,并通过 onMounted/onBeforeUnmount 管理生命周期

  • TypeScript支持安装类型定义包:

    npm install --save-dev @tiptap/pm @tiptap/vue-3

    并在 tsconfig.json 中添加:

    {
      "compilerOptions": {
        "types": ["@tiptap/pm"]
      }
    }
  • SSR兼容性在服务端渲染时需跳过编辑器初始化,通过 isClient 判断:

    import { isClient } from '@vueuse/core'
    if (isClient) {
      editor = new Editor({ /* ... */ })
    }

    六、插件生态推荐

    插件名称功能说明官方文档
    @tiptap/extension-history撤销/重做历史记录History Extension
    @tiptap/extension-markdownMarkdown语法支持Markdown Extension
    tiptap-extension-global-drag-handle全局拖拽把手(需单独安装)Global Drag Handle

    总结

    Tiptap 通过其模块化设计,允许开发者从基础功能开始逐步构建复杂编辑器。在实际项目中,建议:

    按需引入插件,避免过度扩展

    封装自定义工具栏组件,提升可维护性

    对用户输入内容进行二次校验,确保数据安全

    通过本文的实践指南,开发者可以快速掌握 Tiptap 的核心用法,并根据业务需求进行深度定制。

到此这篇关于Vue中使用Tiptap富文本编辑器的文章就介绍到这了,更多相关Vue用Tiptap富文本编辑器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于vue通用表单解决方案的思考与分析

    基于vue通用表单解决方案的思考与分析

    这篇文章主要给大家介绍了基于vue通用表单解决方案的思考与分析,文中通过示例代码介绍的非常详细,对大家学习或者使用vue具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • Vue输入框状态切换&自动获取输入框焦点的实现方法

    Vue输入框状态切换&自动获取输入框焦点的实现方法

    这篇文章主要介绍了Vue输入框状态切换&自动获取输入框焦点的实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • elementplus el-table(行列互换)转置的两种方法

    elementplus el-table(行列互换)转置的两种方法

    本文主要介绍了elementplus el-table(行列互换)转置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • 组件库中使用 vue-i18n 国际化的案例详解

    组件库中使用 vue-i18n 国际化的案例详解

    这篇文章主要介绍了组件库中使用 vue-i18n 国际化,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • Vue导入excel表,导入失败的数据自动下载

    Vue导入excel表,导入失败的数据自动下载

    本文详细讲解了Vue导入excel表,导入失败的数据自动下载的方法,文中通过示例代码介绍的非常详细。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • vue不用window的方式如何刷新当前页面

    vue不用window的方式如何刷新当前页面

    这篇文章主要介绍了vue不用window的方式如何刷新当前页面,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 详解vue-cli项目中怎么使用mock数据

    详解vue-cli项目中怎么使用mock数据

    这篇文章主要介绍了vue-cli项目中怎么使用mock数据,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • django+vue实现注册登录的示例代码

    django+vue实现注册登录的示例代码

    这篇文章主要介绍了django+vue实现注册登录的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Vue中使用的EventBus有生命周期

    Vue中使用的EventBus有生命周期

    这篇文章主要介绍了Vue中使用的EventBus有生命周期的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • vue背景图片路径问题及解决

    vue背景图片路径问题及解决

    这篇文章主要介绍了vue背景图片路径问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07

最新评论