富文本编辑组件封装,tinymce、tinymce-vue

news2024/11/27 9:52:16

依赖:package.json

yarn add tinymce @tinymce/tinymce-vue

{
  "dependencies": {
    "@tinymce/tinymce-vue": "5.0.0",
    "tinymce": "6.3.1",
    "vue": "3.2.45",
  },
}

本地依赖:

在public下创建 static/tinymce 文件夹,包含

1:langs(中文语言包,官方下载地址)

2:skins(皮肤,从 node_modules/tinymce/skins 中复制)

 

组件封装:com-editor/index.vue

<template>
  <div>
    <editor v-model="content" :init="init" :disabled="disabled"></editor>
  </div>
</template>

<script>
import tinymce from "tinymce/tinymce";
import Editor from "@tinymce/tinymce-vue";
import "tinymce/models/dom";
import "tinymce/themes/silver/theme";
import "tinymce/icons/default/icons";
import "tinymce/plugins/link"; //链接
import "tinymce/plugins/code"; //源代码
import "tinymce/plugins/codesample"; //代码示例
import "tinymce/plugins/wordcount"; //字数统计
import "tinymce/plugins/table"; //表格
import "tinymce/plugins/lists"; //列表(无序、有序)
import "tinymce/plugins/advlist"; //增强列表
import "tinymce/plugins/emoticons"; //字符表情
import "tinymce/plugins/emoticons/js/emojiimages";
import "tinymce/plugins/emoticons/js/emojis";
import "tinymce/plugins/preview"; //预览
import "tinymce/plugins/fullscreen"; //全屏
import "tinymce/plugins/image"; //图片
import "tinymce/plugins/searchreplace"; //查找替换
export default {
  components: {
    Editor,
  },
  props: {
    modelValue: {
      type: String,
      default: "",
    },
    disabled: {
      type: Boolean,
      default: false,
    },
    height: {
      type: Number,
      default: 500,
    },
  },
  data() {
    return {
      //初始化配置
      init: {
        branding: false, //不显示右下角富文本支持方
        menubar: false, //不显示菜单栏
        statusbar: false, //不显示底部状态栏
        language_url: "/static/tinymce/langs/zh-Hans.js", //汉化
        language: "zh-Hans",
        skin_url: "/static/tinymce/skins/ui/tinymce-5", //主题
        content_css: "/static/tinymce/skins/content/default/content.css", //样式
        font_size_formats: "12px 14px 16px 18px 24px 36px 48px 56px 72px", //字号
        font_family_formats:
          "微软雅黑=Microsoft YaHei,Helvetica Neue,PingFang SC,sans-serif;苹果苹方=PingFang SC,Microsoft YaHei,sans-serif;宋体=simsun,serif;仿宋体=FangSong,serif;黑体=SimHei,sans-serif;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;", //字体
        height: this.height, //高度
        plugins: "",
        toolbar: "",
        // tinymce插入图片支持转base64操作
        images_upload_handler: (blobInfo, progress) => {
          return new Promise((resolve, reject) => {
            resolve(
              "data:" + blobInfo.blob().type + ";base64," + blobInfo.base64()
            );
          });
        },
      },
      content: this.modelValue,
      plugins: {
        lists: "列表",
        advlist: "列表增强",
        link: "链接",
        table: "表格",
        code: "源代码",
        codesample: "代码示例",
        wordcount: "字数统计",
        image: "图片",
        emoticons: "表情",
        preview: "预览",
        fullscreen: "全屏",
        searchreplace: "查找替换",
      },
      toolbar: {
        undo: "回退",
        redo: "前进",
        "removeformat |": "清除格式",
        // styles: "样式",
        blocks: "段落",
        fontsize: "字号",
        // fontfamily: "字体",
        bold: "加粗",
        italic: "斜体",
        strikethrough: "删除",
        "underline |": "下划线",
        forecolor: "字体颜色",
        "backcolor |": "背景颜色",
        alignleft: "左对齐",
        aligncenter: "居中对齐",
        alignright: "右对齐",
        alignjustify: "两端对齐",
        bullist: "无序列表",
        numlist: "有序列表",
        outdent: "减少缩进",
        indent: "增加缩进",
        "lineheight |": "行高",
        link: "链接",
        blockquote: "引用",
        hr: "分割线",
        emoticons: "表情",
        image: "图片",
        table: "表格",
        "codesample |": "代码块",
        wordcount: "字数统计",
        code: "源代码",
        preview: "预览",
        fullscreen: "全屏",
        searchreplace: "查找替换",
      },
      menubar: {
        // file:'文件',
        edit: "编辑",
        view: "查看",
        insert: "插入",
        format: "格式",
        tools: "工具",
        table: "表格",
      },
    };
  },
  created() {
    // this.init.menubar = Object.keys(this.menubar).join(" "); //菜单栏
    this.init.plugins = Object.keys(this.plugins).join(" "); //插件依赖
    this.init.toolbar = Object.keys(this.toolbar).join(" "); //插件栏
    tinymce.init({});
  },
  methods: {},
  watch: {
    modelValue(newValue) {
      this.content = newValue;
    },
    content(newValue) {
      this.$emit("update:modelValue", newValue);
    },
  },
};
</script>
<style lang="scss">
//不展示右侧升级链接
.tox-promotion {
  display: none;
}
</style>

组件使用:com-editor/demo.vue

<template>
  <div>
    com-editor Demo
    <div>{{ content }}</div>
    <com-editor v-model="content"></com-editor>
  </div>
</template>

<script>
export default {
  components: {},
  data() {
    return {
      content: "<p>dddddd</p>",
    };
  },
  methods: {},
};
</script>

<style scoped></style>

使用效果:

参考链接:

vue项目中使用 tinymce 富文本(本地依赖版)

tinymce官方文档

tinymce个人中文文档

Migrating from TinyMCE 5

inymce使用images_upload_handler将图片处理成base64或者url

tinymce6 上传图片报错Cannot read properties of undefined (reading ‘then‘)

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

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

相关文章

JIT-即时编译技术

VM&#xff08;HotSpot&#xff09;执行引擎中包含解释器与JIT编译器热点代码&#xff08;执行多次&#xff09;才有JIT编译的必要&#xff08;JIT编译阈值&#xff09;JVM&#xff08;HotSpot&#xff09;会有两个计数器&#xff08;次数/回边&#xff09;判断方法/代码块是否…

缺少IT人员的服装行业该如何进行数字化转型?

服装行业上、下游产业链长&#xff0c;产品属性复杂&#xff0c;是劳动密集型和技术密集型紧密结合的产物&#xff0c;是典型的实体经济代表。 近二十年是服装业发展的机遇和挑战之年&#xff0c;从“世界工厂”“中国制造”&#xff0c;逐渐向“中国设计”转变,中国服装产业经…

Kotlin新手教程九(协程)

一、协程 协程从Kotlin1.3开始引入&#xff0c;本质上协程就是轻量级的线程。协程的基本功能点有&#xff1a; 轻量&#xff1a;可以在单个线程上运行多个协程&#xff0c;因为协程支持挂起&#xff0c;不会使正在运行协程的线程阻塞。挂起比阻塞节省内存&#xff0c;且支持多…

扬帆优配|雷达供应商Arbe暴涨近50%;A股毫米波雷达概念异军突起

今日早盘&#xff0c;A股全体低开高走&#xff0c;上证指数围绕3300点重复抢夺&#xff0c;两市成交呈现大幅萎缩的趋势&#xff0c;显示市场谨慎情绪较为浓厚。 盘面上&#xff0c;白酒、国防军工、新能源、医药等板块涨幅居前&#xff0c;电信运营、网络游戏、稳妥、房地产等…

Sqoop导出hive/hdfs数据到mysql中---大数据之Apache Sqoop工作笔记006

然后我们看看数据利用sqoop,从hdfs hbase中导出到mysql中去 看看命令可以看到上面这个 这里上面还是mysql的部分,然后看看 下面--num-mappers 这个是指定mapper数 然后下面这个export-dir这里是,指定hdfs中导出数据的目录 比如这里指定的是hive的一个表/user/hive/warehouse…

IOS开发中遇到的问题总结【持续更新】

目录 知识点补给站 1. SwiftUI中的Image控件使用系统图标 知识点补给站 【Swift学习】关于 Swift | Swift 编程语言中文教程&#xff08;The Swift Programming Language&#xff09;【SwiftUI学习】不要惊慌! SwiftUI Example【SwiftUI学习】https://goswiftui.com【AppIcon…

C#、JAVA读写PLC物联网Modbus

Modbus协议是一种常用于工业自动化领域的通信协议&#xff0c;它使用简单、易实现、可靠的特点得到了广泛应用。物联网中的设备也需要使用Modbus协议进行通信。本文将介绍物联网Modbus通信的相关内容。一、Modbus协议简介Modbus协议是一种串行通信协议&#xff0c;它最初由Modi…

浅谈ThreadLocal的原理

文章目录1.ThreadLocal初识2.ThreadLocal底层原理3.ThreadLocal核心API3.1.get()方法3.2.set()方法3.3.remove()方法3.4.核心代码及流程4.ThreadLocalMap5.Hash冲突怎么解决6.ThreadLocal内存泄漏问题及解决办法7.应用场景8.总结1.ThreadLocal初识 ThreadLocal概念&#xff1a…

RPC(2)------ Netty(NIO) + 多种序列化协议 + JDK动态代理实现

依赖包解释 Guava 包含了若干被Google的 Java项目广泛依赖 的核心库&#xff0c;例如&#xff1a;集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string process…

Windows部署Jar包的三种方式

文章目录1、cmd命令启动2、bat脚本启动2.1 启动jar包2.2 关闭服务3、使用WinSW3.1 重命名3.2 xml配置3.3 安装服务3.4 卸载服务3.5 启动和停止服务1、cmd命令启动 这种方式比较简单&#xff0c;但是窗口关闭后服务也就被杀死了&#xff0c;命令如下 java -jar xxx.jar2、bat脚…

nignx(安装,正反代理,安装tomcat设置反向代理,ip透传)

1安装nginx 安装wget Yum install -y wget 下载(链接从官网找到右键获取) 以下过程root 安装gcc Yum -y install gcc c 安装pcre Yum install -y pcre pcre-devel Openssl Yum install -y openssl openssl-devel 安装zlib Yum install -y zlib zlib-devel 安装make Yum inst…

纯手动搭建hadoop集群记录001_搭建虚拟机_调通网络_配置静态IP_安装JDK---大数据之Hadoop3.x工作笔记0162

1.首先准备机器,172.19.126.115 172.19.126.116 172.19.126.117 我准备了3台 Windows机器 2.然后我打算在Windows机器上使用虚拟机,搭建3台Centos虚拟机来进行安装hadoop 3.这里我们的3台windows机器中的,3台linux虚拟机也使用了3个IP,分别是 172.19.126.120 172.19.126.1…

Redis 删除策略和内存淘汰策略

文章目录一、过期数据二、数据删除策略2-1 定时删除2-2 惰性删除2-3 定期删除三、内存淘汰策略3-1 新数据进入检测3-2 影响数据逐出的相关配置3-3 八种数据逐出策略提示&#xff1a;以下是本篇文章正文内容&#xff0c;Redis系列学习将会持续更新 一、过期数据 Redis中的数据特…

jvm知识点

jvm面试总结 类加载机制? 如何把类加载到jvm中 ? 装载–>链接–>初始化–>使用–>卸载 装载: ClassFile–>字节流–>类加载器将字节流所代表的静态结构转化为方法区的运行时数据结构在我们的堆中生成一个代表这个类的java.lang.Class对象 链接: 验证–…

MATLAB/Simulink 通信原理及仿真学习(三)

文章目录MATLAB/Simulink 通信原理及仿真学习&#xff08;三&#xff09;3. 通信信号与系统分析3.1 离散信号和系统3.1.1 离散信号3.1.2 离散时间信号3.1.3 信号的能量和功率3.2 傅里叶&#xff08;Fourier&#xff09;分析3.2.1 连续时间信号的Fourier变换3.2.2 离散时间信号的…

IDEA-使用插件远程连接Redis

前言 IDEA连接Redis可视化&#xff0c;可以在IDEA中&#xff0c;删除存储的缓存等操作 使用 点击工具栏的File->Settings->Plugins&#xff0c;然后进行搜索Redis,我这里下载过了 然后点击Install进行下载&#xff0c;下载好后&#xff0c;重启IDE 然后会提示&#xf…

什么是Struts2?有哪些优势

Java中Strutsl是最早的基于MVC模式的轻量级Web框架&#xff0c;它能够合理地划分代码结构&#xff0c;并包含验证框架、国际化框架等多种实用工具框架。但是随着技术的进步&#xff0c;Struts1的局限性也越来越多地暴露出来。为了符合更加灵活、高效的开发需求&#xff0c;Stru…

求职者:“我有五年测试经验”面试官: “不,你只是把一年的工作经验用了五年”

最近看到很多软件测试由于公司裁员而需要重新求职的。他们普遍具有4年甚至更长的工作经验。但求职结果往往都不太理想。 我在与部分软件测试求职者交谈的过程中发现&#xff0c;很多人的工作思路不清晰&#xff0c;技能不扎实&#xff0c;没有持续学习的习惯&#xff0c;但对于…

非对称密钥PKCS#1和PKCS#8格式互相转换(Java)

目录一、序言二、代码示例1、Maven依赖2、工具类封装三、测试用例1、密钥文件2、公私钥PKCS1和PKCS8格式互相转换一、序言 之前在 《前后端RSA互相加解密、加签验签、密钥对生成》 中提到过PKCS#1格式和PKCS#8格式密钥的区别以及如何生成密钥。实际有些场景中有可能也会涉及到…

过来人的忠告:如何入门网络安全?

前沿概述 随着2017年《网络安全法》颁布和2019年《等保2.0》正式实施&#xff0c;以及越来越多大学开设网络空间安全、电子对抗等专业&#xff0c;网络安全也被大家熟知&#xff0c;很多人想入行网络安全。作为信息安全毕业&#xff0c;也在安全领域摸爬滚打十年的我&#xff…