当前位置: 首页 > article >正文

Vue3+TinyMCE6实战:手把手教你开发带目录导航的富文本编辑器(附完整代码)

Vue3TinyMCE6实战构建智能目录导航的富文本编辑器在当今内容驱动的应用开发中富文本编辑器已成为不可或缺的核心组件。而TinyMCE作为业界领先的WYSIWYG编辑器其6.x版本带来了更现代化的架构和更强大的扩展能力。本文将带您从零开始在Vue3环境中构建一个具备智能目录导航功能的企业级编辑器解决方案。1. 环境搭建与基础配置首先确保您的开发环境已准备好以下基础条件Node.js 16 和 npm/yarnVue3项目可通过vue create或Vite快速创建TinyMCE 6.x官方包社区版或商业版安装核心依赖npm install tinymce tinymce/tinymce-vue在public目录下创建tinymce文件夹放置以下资源public/ tinymce/ skins/ # 皮肤文件 icons/ # 图标集 plugins/ # 自定义插件目录 langs/ # 语言包如需中文基础配置示例src/utils/tinymce-config.jsexport const baseConfig { language: zh_CN, skin: oxide, content_css: default, menubar: file edit view insert format tools table help, toolbar: undo redo | styleselect | bold italic | alignleft aligncenter alignright | bullist numlist outdent indent | toc, plugins: lists link image table code help wordcount, height: 800, branding: false }提示TinyMCE6对插件系统进行了重构部分5.x插件需要适配新架构。遇到兼容性问题时可检查控制台错误并参考官方迁移指南。2. 目录导航插件开发2.1 插件架构设计目录导航插件的核心功能应包括实时解析文档中的标题结构h1-h6生成带锚点的可交互目录树支持平滑滚动定位提供目录更新机制创建插件文件public/tinymce/plugins/toc/plugin.js(function() { tinymce.PluginManager.add(toc, function(editor) { // 生成唯一ID的工具函数 const createIdGenerator (prefix) { let counter 0 return () { const guid Date.now().toString(32) return ${prefix}${guid}${(counter).toString(32)} } } // 核心功能实现... }) })()2.2 标题解析与目录生成实现标题解析的核心逻辑const parseHeaders () { const tocClass mce-toc const headers Array.from( editor.getBody().querySelectorAll(h1, h2, h3, h4, h5, h6) ).filter(el !el.classList.contains(tocClass)) return headers.map(header { if (!header.id) { header.id createIdGenerator(hdr_)() } return { id: header.id, level: parseInt(header.tagName.substring(1)), text: header.innerText, element: header } }) }目录生成算法采用多级嵌套列表结构const generateTocHTML (headers) { if (!headers.length) return let html div classmce-toc contenteditablefalse html h2 contenteditabletrue目录/h2ul let prevLevel headers[0].level headers.forEach((h, i) { const nextLevel headers[i1]?.level || null if (h.level prevLevel) { html ul } else if (h.level prevLevel) { html /li/ul.repeat(prevLevel - h.level) } else if (i 0) { html /li } html lia href#${h.id}${h.text}/a prevLevel h.level }) return html /ul/div }2.3 交互功能实现添加平滑滚动和点击事件处理const setupScrollBehavior () { editor.on(click, e { const toc editor.getBody().querySelector(.mce-toc) if (!toc || !toc.contains(e.target)) return if (e.target.tagName A) { e.preventDefault() const id e.target.getAttribute(href).substring(1) const target editor.getBody().querySelector(#${id}) target?.scrollIntoView({ behavior: smooth }) } }) }3. Vue3组件集成3.1 封装TinyMCE组件创建可复用的编辑器组件src/components/RichEditor.vuetemplate div classeditor-container Editor v-modelcontent :initeditorConfig :keyeditorKey / /div /template script setup import { ref, computed } from vue import Editor from tinymce/tinymce-vue const props defineProps({ modelValue: String, config: Object }) const emit defineEmits([update:modelValue]) const content computed({ get: () props.modelValue, set: (val) emit(update:modelValue, val) }) const editorKey ref(0) const editorConfig ref({ ...props.config, setup: (editor) { editor.on(init, () { console.log(Editor initialized) }) } }) /script3.2 实现双向数据绑定在父组件中使用template div classapp RichEditor v-modelcontent :configeditorConfig / /div /template script setup import { ref } from vue import RichEditor from ./components/RichEditor.vue import { baseConfig } from ./utils/tinymce-config const content ref(h1文档标题/h1p这里是正文内容.../p) const editorConfig ref({ ...baseConfig, plugins: [...baseConfig.plugins, toc], toolbar: ${baseConfig.toolbar} | tocupdate }) /script4. 高级功能扩展4.1 实时目录更新通过MutationObserver实现内容变化时的自动更新const setupAutoUpdate () { const observer new MutationObserver(mutations { if (mutations.some(m Array.from(m.addedNodes).some(n n.nodeType 1 /^H[1-6]$/i.test(n.tagName) ) )) { editor.execCommand(mceUpdateToc) } }) editor.on(init, () { observer.observe(editor.getBody(), { childList: true, subtree: true }) }) editor.on(remove, () observer.disconnect()) }4.2 样式定制与主题适配添加CSS样式确保目录与编辑器风格统一.mce-toc { border-left: 3px solid #eee; padding: 0.5rem 1rem; margin: 1rem 0; background: #f9f9f9; } .mce-toc h2 { font-size: 1.2em; margin-top: 0; } .mce-toc ul { list-style: none; padding-left: 1em; } .mce-toc li { margin: 0.3em 0; } .mce-toc a { color: #06c; text-decoration: none; } .mce-toc a:hover { text-decoration: underline; }4.3 性能优化策略对于大型文档的优化处理const throttledUpdate _.throttle(() { editor.execCommand(mceUpdateToc) }, 500, { leading: false }) editor.on(keyup, throttledUpdate) editor.on(change, throttledUpdate)5. 企业级解决方案实践在实际项目中我们还需要考虑以下增强功能多实例管理当页面中存在多个编辑器实例时确保插件状态隔离撤销/重做支持将目录操作纳入编辑器的撤销栈本地化扩展支持多语言目录标题可访问性为目录添加ARIA属性完整插件实现可封装为独立npm包便于团队共享{ name: tinymce-toc-plugin, version: 1.0.0, main: dist/plugin.js, files: [dist], peerDependencies: { tinymce: ^6.0.0 } }在多个Vue3项目中使用时可以通过动态导入实现按需加载const loadTocPlugin async () { await import(tinymce-toc-plugin) tinymce.init({ plugins: [toc], // 其他配置... }) }

相关文章:

Vue3+TinyMCE6实战:手把手教你开发带目录导航的富文本编辑器(附完整代码)

Vue3TinyMCE6实战:构建智能目录导航的富文本编辑器 在当今内容驱动的应用开发中,富文本编辑器已成为不可或缺的核心组件。而TinyMCE作为业界领先的WYSIWYG编辑器,其6.x版本带来了更现代化的架构和更强大的扩展能力。本文将带您从零开始&#…...

M-LLM视频帧选择技术解析

M-LLM Based Video Frame Selection for Efficient Video Understanding 论文解析 多模态大语言模型(M-LLM)在视频理解任务中展现出显著潜力,但计算开销和冗余帧处理仍是关键挑战。论文提出了一种基于M-LLM的视频帧选择方法,通过动…...

Qwen2.5-VL多模态应用:用Ollama快速搭建智能图片识别系统

Qwen2.5-VL多模态应用:用Ollama快速搭建智能图片识别系统 1. 引言:让AI看懂图片,其实很简单 你有没有想过,让电脑像人一样“看懂”图片,然后回答你的问题?比如,上传一张商品图,它能…...

软考通关秘籍:技术要点全解析

软考-分析:技术类考试要点与备考策略 软考(计算机技术与软件专业技术资格(水平)考试)是国内权威的IT职业资格认证考试,涵盖多个技术领域。分析软考的技术类考试内容、备考方法及实际应用场景,对…...

DeepSeek-OCR-2快速体验:开箱即用的OCR神器,上传图片自动提取文字

DeepSeek-OCR-2快速体验:开箱即用的OCR神器,上传图片自动提取文字 1. 认识DeepSeek-OCR-2:新一代智能OCR引擎 如果你经常需要从图片或PDF中提取文字,一定会对传统OCR工具的局限性感到困扰——识别率低、排版混乱、无法理解表格结…...

从JAR到EXE:利用launch4j-maven-plugin为Java应用打造原生Windows体验

1. 为什么需要将Java应用打包成EXE文件? 很多Java开发者都遇到过这样的尴尬:辛辛苦苦开发了一个桌面应用,发给朋友或客户使用时,对方却一脸茫然地问"怎么打开这个jar文件?"或者"为什么双击没反应&#…...

春联生成模型-中文-base面试题精讲:Java八股文中的AI实践案例

春联生成模型-中文-base面试题精讲:Java八股文中的AI实践案例 最近在面试Java后端工程师时,我发现一个有趣的现象:很多候选人能把“八股文”背得滚瓜烂熟,但一遇到“如何用这些知识解决实际问题”的提问,思路就卡壳了…...

Thonny完全指南:从核心价值到实战部署

Thonny完全指南:从核心价值到实战部署 【免费下载链接】thonny Python IDE for beginners 项目地址: https://gitcode.com/gh_mirrors/th/thonny 1. 项目核心价值:为何选择Thonny作为Python学习工具 Thonny是一款专为编程初学者设计的Python集成…...

10 数据预处理-噪声数据与异常值处理

Python 数据分析入门:一文搞懂噪声数据与异常值处理(附 Pandas 实战)适合人群:Python 初学者 / 数据分析入门 / 数据预处理学习者 / 教学案例分享在做数据分析时,很多人会先关注均值、中位数、标准差这些统计指标。 但…...

Vue的data为何必须是函数

Vue中data为什么是函数 在Vue组件中,data选项必须声明为一个函数,而不是直接声明为一个对象。这种设计背后的原因与Vue的组件实例化机制和状态管理有关。 组件实例与数据隔离 Vue组件是可复用的,同一个组件可能被多次实例化。如果data直接是一…...

实时手机检测-通用开源镜像:Apache License 2.0商用合规性使用说明

实时手机检测-通用开源镜像:Apache License 2.0商用合规性使用说明 1. 引言:为什么你需要一个合规的手机检测方案? 想象一下,你正在开发一个智能会议室管理系统,需要自动检测参会人员是否违规使用手机。或者&#xf…...

Yann LeCun 说 LLM 要过时?我用开源框架在 7 天复现「世界模型」雏形

文章目录前言为什么 LLM 是"街溜子背书王"世界模型:让 AI 从"读死书"变成"过生活"七天复现计划:从理论到跑通代码Day 1:环境准备与认识 JEPADay 2:手写 Masking 策略(核心脏活&#xff…...

CLIP-GmP-ViT-L-14效果展示:跨模态检索的惊艳案例与性能评测

CLIP-GmP-ViT-L-14效果展示:跨模态检索的惊艳案例与性能评测 最近在折腾各种多模态模型,发现了一个挺有意思的选手——CLIP-GmP-ViT-L-14。这名字听起来有点复杂,但它的核心能力其实很直观:让机器真正“看懂”图片,并…...

GLM-4-9B-Chat-1M入门必看:本地化大模型环境配置详解

GLM-4-9B-Chat-1M入门必看:本地化大模型环境配置详解 1. 为什么你需要一个真正“能读完”的本地大模型 你有没有遇到过这样的情况: 想让AI帮你分析一份200页的PDF技术白皮书,刚输入一半就提示“上下文超限”; 把整个Python项目文…...

【异常】OpenClaw 上下文溢出问题(100% context used 309.9k/200k`)排查与解决

OpenClaw 上下文超限问题(100% context used)排查与解决方案 一、报错内容 在使用 OpenClaw 工具进行任务处理时,控制台或操作界面弹出核心报错提示: 100% context used 309.9k/200k 该提示直接导致 OpenClaw 无法正常接收新输入、处理业务请求,会话处于不可用状态。 …...

Realistic Vision V5.1在独立设计师工作流中的整合:PS联动+批量导出实践

Realistic Vision V5.1在独立设计师工作流中的整合:PS联动批量导出实践 1. 工具介绍与核心价值 Realistic Vision V5.1虚拟摄影棚是基于当前最先进的写实风格生成模型开发的本地化工具,专为创意工作者设计。这个工具最吸引人的特点是它能生成与专业单反…...

Mosquitto持久引擎深度解析

Eclipse Mosquitto MQTT 代理中持久性引擎的作用分析 持久性引擎是 Eclipse Mosquitto MQTT 代理的核心组件之一,负责管理客户端会话状态、保留消息和订阅信息的持久化存储。该引擎通过 database.c 文件实现,确保代理在重启或故障恢复后仍能保持关键数据…...

MedGemma X-Ray一键部署方案:3条命令完成从镜像拉取到服务上线

MedGemma X-Ray一键部署方案:3条命令完成从镜像拉取到服务上线 1. 引言:你的AI影像解读助手,3条命令就能拥有 想象一下,你手头有一张胸部X光片,想快速了解其中是否存在异常,或者想学习如何解读影像特征。…...

[C#] 解决jsencrypt RSA加密后C#解密长度异常问题

1. 异常现象解析:为什么C#解密会失败? 最近在做一个前后端分离项目时,遇到了一个让人头疼的问题:前端用jsencrypt做的RSA加密,传到C#后端解密时经常报错。错误信息显示"The length of the data to decrypt is not…...

JavaScript输出技巧大揭秘

JavaScript 输出 尊重每一个选择,无论是对的还是错的,它们都是我们成长中的重要一环,让生命愈发丰盈。生命中的每一次努力都是对未来的美好期待,愿我们都能心怀感恩,迎接每一个崭新的日子。感恩生活中的每一份际遇&…...

MCP 2.0 TLS 1.3握手链路被绕过?深度解析PSK+ECH组合加密失效案例与3种国密SM2/SM4增强补丁

第一章:MCP 2.0协议安全规范概览MCP 2.0(Managed Control Protocol 2.0)是面向云原生环境设计的轻量级设备控制与状态同步协议,其安全规范聚焦于端到端通信机密性、身份强认证、操作不可抵赖性及最小权限访问控制。相比1.x版本&am…...

动态Vault:安全密钥管理的未来

动态Vault概述 动态Vault是一种用于安全存储和管理敏感数据的系统,能够在运行时动态生成和销毁密钥,确保数据的安全性。这种技术广泛应用于云计算、微服务架构和分布式系统中,提供了一种灵活且安全的密钥管理方案。动态Vault的核心在于其动态…...

WebSocket+Redis实现实时消息同步

WebsocketRedis实现微服务消息实时同步 在微服务架构中,实时消息同步是一个常见需求。WebSocket提供全双工通信能力,Redis作为高性能缓存和消息中间件,两者结合可实现高效的跨服务实时消息同步。以下方案详细描述了技术实现细节。 技术架构设…...

Hadoop MapReduce核心技术解析

Hadoop MapReduce 技术解析 Hadoop MapReduce 是一个分布式计算框架,用于处理大规模数据集。其核心思想是将计算任务分解为多个小任务,分布在集群中的多个节点上并行执行,最终合并结果。MapReduce 包含两个主要阶段:Map 和 Reduce…...

利用JDBG和SM37高效调试后台Job的实战指南

1. 为什么需要调试后台Job? 后台Job在SAP系统中扮演着重要角色,它们通常用于执行批量数据处理、报表生成等耗时操作。但问题来了:当这些Job在无人值守的状态下运行时,如果突然报错,我们该怎么快速定位问题?…...

跨平台开发新范式:Lima让macOS无缝运行Linux容器环境

跨平台开发新范式:Lima让macOS无缝运行Linux容器环境 【免费下载链接】lima Linux virtual machines, with a focus on running containers 项目地址: https://gitcode.com/GitHub_Trending/lim/lima 在macOS上开发Linux应用时,你是否曾为环境不一…...

轻量React开发利器:nextui组件库全解析

轻量React开发利器:nextui组件库全解析 【免费下载链接】nextui 🚀 Beautiful, fast and modern React UI library. 项目地址: https://gitcode.com/GitHub_Trending/ne/nextui 在现代前端开发领域,构建既美观又高性能的用户界面往往需…...

从零搭建个人语料库:比收藏Prompt重要10倍的AI提升秘籍

文章指出,影响AI输出质量的关键并非Prompt技巧,而是底层语料库的建设。作者详细阐述了个人语料库的三层结构(高质量输入、标准化处理、反馈闭环),并提供了从收集、清洗到向量化、使用的实操步骤。强调通过积累和整理个…...

全栈开发指南:从零构建模块化智能协作系统

全栈开发指南:从零构建模块化智能协作系统 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN 理论认知:模块化智能系统的设计…...

五款优质WordPress原创主题

市面上WordPress主题品类繁多,不同主题针对不同建站需求打造专属特性。以下精选五款原创WordPress主题,深度解析每款主题的核心特色与核心优势,帮你精准匹配建站方案。一、Grace主题 —— 优雅大气的高品质WordPress主题Grace主题主打优雅大气…...