Vue3——Tinymce6富文本编辑器的使用方法

TinyMCE 6 是一款功能强大且灵活的富文本编辑器,可以嵌入到 Web 应用程序中。

一、安装

本文的讲解主要以tinymce6 版本为例

 官网地址   Migrating from TinyMCE 5 to TinyMCE 6 | TinyMCE Documentation

要将 TinyMCE 添加到项目中,请执行以下操作:

  • 使用 npm,在命令行上运行以下命令:

npm install tinymce

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

  • 使用 Yarn,在命令行上运行以下命令:
yarn add t inymce@^6
 

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

二、初始化配置

import tinymce from "tinymce/tinymce";
import "tinymce/models/dom"; // 特别注意 tinymce 6.0.0 版本之后必须引入,否则不显示
import "tinymce/themes/silver/theme";
import Editor from "@tinymce/tinymce-vue"; // 引入组件
//引入工具栏图标和主题
import "tinymce/icons/default/icons";
import "tinymce/themes/silver";
// 引入富文本编辑器主题的js和css,不然显示出错
import "tinymce/themes/silver/theme.min";
import "tinymce/skins/ui/oxide/skin.min.css";// 都是富文本插件
import "tinymce/icons/default";
import "tinymce/plugins/image";
// import "tinymce/plugins/link";
import "tinymce/plugins/code";
import "tinymce/plugins/table";
import "tinymce/plugins/lists";
import "tinymce/plugins/wordcount";
import "tinymce/plugins/autosave"; //自动保存
import "tinymce/plugins/save"; //保存
// import "tinymce/plugins/preview"; //预览
// 以上所有的样式在 node_modules 下面 tinymce 里面的 plugins 都能找到。
const init = {//初始化数据resize: false, //是否可自主拉伸promotion: false, //Upgrade是否开启statusbar: false, //状态栏是否显示content_style: "body{margin:0;outline:none;font-family:'宋体';};",language_url: "/langs/zh-Hans.js", // 引入语言包(该语言包在public下,注意文件名称)language: "zh-Hans", // 这里名称根据 zh-Hans.js 里面写的名称而定skin_url: "/skins/ui/oxide", // 这里引入的样式plugins: "lists image code table wordcount   autosave save", // 富文本插件toolbar:"| undo redo | fontfamily fontsize | italic bold underline strikethrough forecolor |  alignleft alignright aligncenter alignjustify  indent outdent  lineheight numlist  save",branding: false, //是否禁用“Powered by TinyMCE”menubar: false, //顶部菜单栏显示font_size_formats: "11pt 12pt 14pt 16pt 18pt 24pt 36pt",font_family_formats:"微软雅黑='微软雅黑';宋体='宋体';黑体='黑体';仿宋='仿宋';楷体='楷体';隶书='隶书';幼圆='幼圆';Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;",// paste_convert_word_fake_lists: false, // 插入word文档需要该属性content_css: "/skins/content/default/content.css", //以css文件方式自定义可编辑区域的css样式,css文件需自己创建并引入images_upload_handler: (blobInfo, success, failure) => {// console.log(blobInfo.blob());// 上传图片需要,FormData 格式的文件;const formDataUp = new FormData();// img  是接口需要的上传的属性名,一般属性名是 fileformDataUp.append("img", blobInfo.blob());// // console.log(formDataUp);axios.post("xxxx", formDataUp).then((res) => {success("返回的上传图片后的地址");});},inline: true,// 将工具栏固定在顶部且blur时工具栏不会隐藏fixed_toolbar_container: "#myToolbar",// 此选项允许提供将在每次初始化编辑器实例时执行的函数。init_instance_callback: function (editor) {editor.fire("focus");// 解决部署到生产环境时setContent 有可能会失效的问题if (editor != null) {getDetails();}},setup: function (editor) {// console.log(editor, "^^^^^^^^^");editor.on("blur", function () {return false;});// 禁止ctrl+c  ctrl+v 复制editor.on("keydown", function (e) {if ((e.ctrlKey || e.metaKey) && e.key === "c") {console.log(canCopy.value, "是否支付");if (!canCopy.value) {e.preventDefault();}}});// 监听编辑器撤销事件editor.on("undo", function () {console.log("当前正在执行撤销操作");// 判断内容区是否为空if (editor.getContent() === "") {// 内容区为空,重新获取数据console.log("内容区为空");getDetails();} else {// 内容区不为空console.log("内容区不为空");}});// 编辑器内容发生变化时editor.on("change", function () {console.log("内容区发生变化");let obj = {};obj.hcn = document.getElementById("tinymce").innerHTML;obj.di = di.value;obj.index = -1;if (!notUpdateHtml.value) {updateHtmlContent({ ...obj }).then((res) => {nextTick(() => {MathJax.typesetPromise();});});}});},// 允许在 UI 中指定缩进/缩进按钮的缩进级别。indentation: "2rem",// 如果编辑器在缩进内容时应使用边距而不是填充,则设置此选项。indent_use_margin: false,// 自动保存时间间隔autosave_interval: "5s",// 自动草稿的有效期autosave_retention: "20m",// 当编辑器初始化时内容区为空时,Tinymce是否应自动还原存储在本地存储中的草稿autosave_restore_when_empty: false,// 当内容无变化时禁用保存按钮save_enablewhendirty: false,save_onsavecallback: function () {ElMessage({showClose: true,message: "保存成功!",type: "success",});},// 粘贴过程中触发的事件paste_preprocess: function (plugin, args) {// 不可粘贴// args.content = "";},
};
onMounted(() => {tinymce.init({}); // 初始化富文本
});

页面中使用

api-key 可以到官网去申请,以免可能会出现使用的过程中提示申请api-key的情况

 <editorstyle="margin-top: -25px"id="tinymce"api-key="":init="init"></editor>

三、常见踩坑点

1.改变工具栏和编辑区默认上下的模式,将工具栏固定在某个容器中

inline: true,// 将工具栏固定在顶部且blur时工具栏不会隐藏fixed_toolbar_container: "#myToolbar",

2.如何将数组渲染至内容区中——使用tinymce中的setContent

使用凭借html的形式,然后使用tinymce中的setContent方法将数据渲染至内容区中

3.如何禁止复制内容区中的内容

setup: function (editor) {// console.log(editor, "^^^^^^^^^");editor.on("blur", function () {return false;});// 禁止ctrl+c  ctrl+v 复制editor.on("keydown", function (e) {if ((e.ctrlKey || e.metaKey) && (e.key === "c" || e.key === "v")) {e.preventDefault(); // 阻止 Ctrl+C 和 Ctrl+V 的默认行为}});},
若需要实现右击菜单栏的形式实现监听复制事件,可以通过监听编辑器的 复制 事件
editor.on("copy", function (e) {if (!canCopy.value) {e.preventDefault();}});

4.删除TinyMCE-6编辑器周围的蓝线-内联模式

<style>* [contentEditable="true"]:focus{ outline: 0px ; }
</style>

5.防止撤回到最初,内容区的内容消失

多次撤回后内容区的内容会为空,此时可以通过监听编辑器内容是否在执行撤销操作,如果进行撤销,通过tinymce中getContent的内容是否为空,为空则重新执行你获取数据的方法即可

6.实现设置字体选项默认为宋体

7.解决setContent有可能会失效的问题

// 此选项允许提供将在每次初始化编辑器实例时执行的函数。init_instance_callback: function (editor) {editor.fire("focus");// 解决部署到生产环境时setContent 有可能会失效的问题if (editor != null) {getDetails();}},

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/818095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot+Vue项目-基于Java+Mysql的网上订餐系统(附源码+LW+演示录像)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

Python框架之UnitTest

unittest 是python 的单元测试框架&#xff0c;unittest 单元测试提供了创建测试用例&#xff0c;测试套件以及批量执行的方案&#xff0c; unittest 在安装pyhton 以后就直接自带了&#xff0c;直接import unittest 就可以使用&#xff0c;测试人员用UnitTest来做自动化测试&a…

【CSS】盒子居中

目录 效果图 代码及其解释 补充解释 效果图 同时实现盒子与文字的居中 代码及其解释 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style type"text/css">#box1{width: 500px;height:…

阿斯达年代记三强争霸开服时间+官网地址+预约下载安装教程分享

阿斯达年代记国际服&#xff0c;游戏分为三个势力&#xff0c;分别是阿斯达、亚高和不罚者&#xff0c;每个玩家都必须选择一个势力&#xff0c;而每个势力每周将会诞生一名势力族长&#xff0c;将会从五名候选人中投票产生&#xff0c;想要进入候选人名单&#xff0c;必须每天…

Netty学习——实战篇2 NIO 群聊系统(简单版) 备份

需求&#xff1a; 1、编写一个NIO群聊系统&#xff0c;实现服务端和客户端之间数据简单通讯(非阻塞) 2、实现多人群聊 3、服务端&#xff1a;可以监测用户上线、离线、并实现消息转发功能。 4、客户端&#xff1a;通过channel可以无阻塞发送消息给其他所有用户&#xff0c;同时…

分类算法(数据挖掘)

目录 1. 逻辑回归&#xff08;Logistic Regression&#xff09; 2. 支持向量机&#xff08;Support Vector Machine, SVM&#xff09; 3. 决策树&#xff08;Decision Tree&#xff09; 4. 随机森林&#xff08;Random Forest&#xff09; 5. K近邻&#xff08;K-Nearest …

Vue3(三):生命周期、路由、自定义hooks

这里终于明白了为什么一直有这个语法报错&#xff0c;就是在提示你哪里错的地方上方注释一行/*eslint-disable*/&#xff0c;之前一直警告这个错误感谢老师&#xff01; 一、vue2和vue3生命周期 还有一个问题就是父组件和子组件哪个先挂载完毕呢&#xff1f;答案是子组件先挂…

Qt---控件的基本属性

文章目录 enabled(控件可用状态)geometry(位置和尺寸)简单恶搞程序 windowIcon(顶层 widget 窗口图标)使用 qrc 机制 windowOpacity(窗口的不透明值)cursor(当鼠标悬停空间上的形状)自定义鼠标图标 toolTip(鼠标悬停时的提示)focusPolicy(控件获取焦点的策略)styleSheet(通过CS…

【Python实践应用】使用Python加载栅格数据

下面的代码实现的是加载伊宁市NDVI数据&#xff0c;首先进行相关的python包的导入&#xff0c;然后定义和读取我们需要加载的数据&#xff0c;这里我们使用的NDVI数据是将伊宁23年的NDVI数据合并成为了一张栅格图像&#xff0c;每个波段表示一年的 NDVI&#xff0c;我们这里显示…

MySQL学习笔记3——条件查询和聚合函数

条件查询和聚合函数 一、条件查询语句二、聚合函数1、SUM&#xff08;&#xff09;2、AVG()、MAX()、MIN()3、COUNT&#xff08;&#xff09; 一、条件查询语句 WHERE 和 HAVING 的区别&#xff1a; WHERE是直接对表中的字段进行限定&#xff0c;来筛选结果&#xff1b;HAVIN…

最新版IntelliJ IDEA 2024.1安装和配置教程 详细图文解说版安装教程

IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版 文章目录 IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版前言 第一步&#xff1a; IntelliJ IDEA 2024.1安装教程第 0 步&…

Java快速入门系列-7(测试与调试)

第七章:测试与调试 第7章:测试与调试7.1 单元测试(JUnit)7.1.1 为什么要进行单元测试7.1.2 JUnit基础7.1.3 断言7.1.4 测试套件7.2 集成测试与系统测试7.2.1 集成测试7.2.2 系统测试7.3 调试技巧与工具7.3.1 断点7.3.2 单步执行7.3.3 变量检查7.3.4 条件断点7.3.5 日志记录…

Playwright已经是目前最好的测试自动化工具了吗?

作者观点&#xff1a;很长时间以来&#xff0c;Selenium是QA工程师寻求测试自动化解决方案的首选测试框架。它能够测试任何浏览器&#xff08;这在IE浏览器的统治时期尤其重要&#xff09;和任何平台。然而&#xff0c;现在看来&#xff0c;那个时代已经过去了。 今天&#xf…

【嵌入式】SD NAND:小身躯蕴含大能量的新型嵌入式存储解决方案

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

如何在Linux通过docker搭建Plik文件系统并实现无公网IP管理内网文件

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问&#xff0c;实现随时随地在任意设备上传或者…

JNI用法

提示&#xff1a;文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一 背景 之前搞过jni&#xff0c;之前是强哥指导搞的&#xff0c;现在感觉又忘了。 今天照着帖子再搞一次。参考帖子&#xff1a;https://blog.csdn.net/y…

前端 接口返回来的照片太大 加载慢如何解决

现象 解决 1. 添加图片懒加载 背景图懒加载 对背景图懒加载做的解释 和图片懒加载不同&#xff0c;背景图懒加载需要使用 v-lazy:background-image&#xff0c;值设置为背景图片的地址&#xff0c;需要注意的是必须声明容器高度。 <div v-for"img in imageList&quo…

交叉熵损失函数介绍

交叉熵是信息论中的一个重要概念&#xff0c;它的大小表示两个概率分布之间的差异&#xff0c;可以通过最小化交叉熵来得到目标概率分布的近似分布。 为了理解交叉熵&#xff0c;首先要了解下面这几个概念。 自信息 信息论的基本想法是&#xff0c;一个不太可能的事件发生了…

openwrt局域网配置多个IP

在局域网配置过程中&#xff0c;若是DHCP服务器关闭&#xff0c;又忘记了配置的ip&#xff0c;将很难访问到路由器重新进行配置。这种情况可以在路由器出厂时做一个备用ip去避免。 1.配置 以下是备用ip的配置方法&#xff0c;以SKYLAB的SKW99 WIFI模组为例进行说明&#xff1…