TinyMCE 富文本编辑器

embedded/2024/10/23 16:41:29/

中文文档

TinyMce在4.0以后就不支持Vue2.0了


1. 安装依赖

yarn add tinymce  ||  npm install tinymce -Syarn add @tinymce/tinymce-vue  ||  npm install @tinymce/tinymce-vue -S

2. 创建组件

components 下创建 Tinymce.vue 组件

<template><div class="app-container"><editor :id="selector" v-model="tinymceHtml" :init="init" :disabled="disabled"></editor></div>
</template>
<script setup>
import { ref, onMounted, watch, toRef } from 'vue';
import tinymce from 'tinymce/tinymce';
// import "tinymce/models/dom"; // 特别注意 tinymce 6.0.0 版本之后必须引入,否则不显示
import 'tinymce/themes/silver/theme';
import api from '@/api';
import Editor from '@tinymce/tinymce-vue'; // 引入组件// 以下都是富文本插件
import 'tinymce/icons/default';
import 'tinymce/plugins/link';
import 'tinymce/plugins/code';
import 'tinymce/plugins/table';
import 'tinymce/plugins/lists';
import 'tinymce/plugins/wordcount';
import 'tinymce/plugins/hr'; //水平分割线
import 'tinymce/plugins/emoticons';
import 'tinymce/plugins/textcolor';
import 'tinymce/plugins/preview'; //预览
import 'tinymce/plugins/image';
import 'tinymce/plugins/media';
import 'tinymce/plugins/paste';
// 以上所有的样式在 node_modules 下面 tinymce 里面的 plugins 都能找到。const emits = defineEmits(['getEditor']);
const props = defineProps({value: {type: String,default: ''},imageShow: {type: Boolean,default: true},type: {type: Number,default: 0},selector: {type: String,default: 'tinymce'},disabled: {type: Boolean,default: false}
});
const dataValue = toRef(props, 'value');
let tinymceHtml = ref('');
const init = {selector: props.selector,language_url: '/tinymce/langs/zh_CN.js', // 引入语言包(该语言包在public下,注意文件名称)language: 'zh_CN', // 这里名称根据 zh_CN.js 里面写的名称而定skin_url: '/tinymce/skins/ui/oxide', // 这里引入的样式height: 400, // 限制高度plugins: `link lists code table textcolor wordcount emoticons hr image media preview paste`, // 富文本插件paste_data_images: true, // 禁止从剪贴板粘贴图片lineheight_formats: '0.5 0.8 1 1.2 1.5 1.75 2 2.5 3 4 5',fontsize_formats: '12px 14px 16px 18px 20px 22px 24px 26px 30px 36px 40px 45px 50px',toolbar1: `fontsizeselect  bold italic underline strikethrough |  media  image|  table |lineheight | forecolor| backcolor |emoticons hr| alignleft aligncenter| alignright alignjustify | bullist numlist |outdent indent blockquote | undo redo | lists link unlink code | preview | removeformat | paste`,branding: false, // //是否禁用“Powered by TinyMCE”placeholder: '在这里输入文字',style_formats: [{ title: 'Custom Padding', inline: 'p', styles: { padding: '0 10px' } }],menubar: false, //顶部菜单栏显示media_live_embeds: true,file_picker_types: 'media', // 上传类型 视频media_alt_source: false, //显示隐藏资源备用地址输入框media_filter_html: false, // 视频上传代码过滤image_dimensions: false, // 隐藏图片尺寸media_dimensions: false, //显示隐藏宽高尺寸输入框emoticons_database_url: '/tinymce/emoticons/js/emojis.js',// paste_convert_word_fake_lists: false, // 插入word文档需要该属性content_css: '/tinymce/skins/content/default/content.css', //以css文件方式自定义可编辑区域的css样式,css文件需自己创建并引入images_upload_handler: async (blobInfo, success) => { // 自定义函数代替TinyMCE来处理上传操作const formData = new FormData();formData.append('file', blobInfo.blob());const res = await api.upload(blobInfo.blob()); // 请求接口success(res.url);},file_picker_callback: function (callback, value, meta) { // 文件上传if (meta.filetype === 'media') {const input = document.createElement('input');input.setAttribute('type', 'file');input.setAttribute('accept', 'video/*');input.onchange = async function () {const file = this.files[0];const formData = new FormData();formData.append('file', file);const res = await api.upload(formData); // 请求接口callback(res.url);};input.click();}},setup: function (editor) { // 初始化前执行console.log("ID为: " + editor.id + " 的编辑器即将初始化.");},init_instance_callback : function(editor) { // 初始化结束后执行console.log("ID为: " + editor.id + " 的编辑器已初始化完成.");}
};
if (dataValue.value) {tinymceHtml.value = dataValue.value;
}watch(() => tinymceHtml,(newType, oldType) => {emits('getEditor', newType['_value']);},{ deep: true }
);
watch(() => dataValue,(newType, oldType) => {console.log(newType);tinymceHtml.value = newType.value || '';},{ deep: true }
);onMounted(() => {tinymce.init({}); // 初始化富文本
});
</script><style></style>

3. 使用组件

<template><div class="tinymce-box"><Tinymce :value="information" @getEditor="getEditor" :disabled="disabled" /></div>
</template><script setup>
import Tinymce from "@/components/Tinymce.vue";const information = ref('');
const disabled = false;
const getEditor = value => {information.value = value;
};
</script><style scoped>
.tinymce-box {width: 100%;
}
</style>

http://www.ppmy.cn/embedded/129860.html

相关文章

大数据开发电脑千元配置清单

大数据开发电脑配置清单 电脑型号HUANANZHI 台式电脑操作系统Windows 11 专业版 64位&#xff08;Version 23H2 / DirectX 12&#xff09;处理器英特尔 Xeon(至强) E5-2673 v3 2.40GHz主板HUANANZHI X99-P4T&#xff08;P55 芯片组&#xff09;显卡NVIDIA GeForce GT 610 ( 2…

汽车结构设计外覆盖件抗凹分析的意义和分类

1、车身覆盖件指什么&#xff1f; 车身覆盖件一般是指在车辆表面上能够看到的饭金件&#xff0c;如门外板、顶盖等。覆盖件的尺寸相对较大&#xff0c;往往是依照造型要求&#xff0c;设计出不同的区域曲率。所有的覆盖件都需要经过冲压&#xff0c;塑造出特定的造型&#xff…

【计算机网络 - 基础问题】每日 3 题(四十一)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…

k8s-pod控制器

Pod控制器介绍 Pod是kubernetes的最小管理单元&#xff0c;在kubernetes中&#xff0c;按照pod的创建方式可以将其分为两类&#xff1a; 自主式pod&#xff1a;kubernetes直接创建出来的Pod&#xff0c;这种pod删除后就没有了&#xff0c;也不会重建控制器创建的pod&#xff1a…

038_基于php校园Flea Market售货平台

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍&#xff1a;CodeMentor毕业设计领航者、全网关注者30W群落&#xff0c;InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者&#xff0c;博客领航之星、开发者头条/腾讯云/AW…

如何将两个视频连接成一个?共有6个方法

如何将两个视频连接成一个&#xff1f;在数字媒体日益丰富的今天&#xff0c;视频内容已成为我们生活中不可或缺的一部分。无论是制作个人回忆录、教学演示&#xff0c;还是企业宣传&#xff0c;常常需要将多个视频片段整合成一个完整的作品&#xff0c;以便于播放和分享。特别…

C#学习笔记(一)

C#学习笔记&#xff08;一&#xff09; 简介第一章 上位机开发环境之 VS 使用和.NET 平台基础一、安装软件二、创建项目三、第一个Hello world四、解决方案与项目五、Debug 和 Release 的区别六、代码的生产过程七、CLR的其它功能 简介 C# .NET工控上位机开发 在工控领域&…

2024软件测试面试800题(答案+文档)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、软件测试基础面试题 1、阐述软件生命周期都有哪些阶段? 常见的软件生命周期模型有哪些? 软件生命周期是指一个计算机软件从功能确定设计&#xff0c;到…