Tinymce富文本相关内容和配置
<template> <div class="tinymce-editor"> <editor v-if="!reloading" v-model="myValue" :init="init" :disabled="disabled" @onClick="onClick"> </editor> </div> </template> <script> import tinymce from 'tinymce/tinymce' import Editor from '@tinymce/tinymce-vue' import 'tinymce/themes/silver/theme' // 引入富文本编辑器主题的js和css import 'tinymce/skins/content/default/content.css' import 'tinymce/themes/silver/theme.min.js' import 'tinymce/icons/default/icons' // 解决了icons.js 报错Unexpected token '<' import 'tinymce/icons/default' import "tinymce/icons/default/icons"; import "tinymce/themes/silver"; import "tinymce/plugins/image"; import "tinymce/plugins/media"; import "tinymce/plugins/table"; import "tinymce/plugins/lists"; import "tinymce/plugins/contextmenu"; import "tinymce/plugins/wordcount"; import "tinymce/plugins/colorpicker"; import "tinymce/plugins/textcolor"; import "tinymce/plugins/preview"; import "tinymce/plugins/code"; import "tinymce/plugins/link"; import "tinymce/plugins/advlist"; import "tinymce/plugins/codesample"; import "tinymce/plugins/hr"; import "tinymce/plugins/fullscreen"; import "tinymce/plugins/textpattern"; import "tinymce/plugins/searchreplace"; import "tinymce/plugins/autolink"; import "tinymce/plugins/directionality"; import "tinymce/plugins/visualblocks"; import "tinymce/plugins/visualchars"; import "tinymce/plugins/template"; import "tinymce/plugins/charmap"; import "tinymce/plugins/nonbreaking"; import "tinymce/plugins/insertdatetime"; import "tinymce/plugins/imagetools"; import "tinymce/plugins/autosave"; import "tinymce/plugins/autoresize"; import { uploadAction,getFileAccessHttpUrl } from '@/api/manage' import { getVmParentByName } from '@/utils/util' export default { components: { Editor }, props: { value: { type: String, required:false }, tinymceHeight: { type: Number, default: 300 }, triggerChange:{ type: Boolean, default: false, required:false }, disabled: { type: Boolean, default: false }, plugins: { type: [String, Array], default: 'lists image link media table textcolor wordcount contextmenu fullscreen advlist autolink code colorpicker' }, toolbar: { type: [String, Array], default: "code undo redo restoredraft | cut copy paste pastetext | forecolor backcolor bold italic underline strikethrough link codesample | alignleft aligncenter alignright alignjustify formatpainter | \ styleselect formatselect fontselect fontsizeselect | bullist numlist | blockquote subscript superscript removeformat | \ table image media charmap hr pagebreak insertdatetime | fullscreen preview", //default: 'undo redo | formatselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | lists link unlink image media table | removeformat | fullscreen', branding:false } }, data() { return { //初始化配置 init: { language_url: '/tinymce/langs/zh_CN.js', language: 'zh_CN', skin_url: '/tinymce/skins/lightgray', height: this.tinymceHeight, plugins: this.plugins, toolbar: this.toolbar, font_formats: "微软雅黑=Microsoft YaHei, sans-serif;苹果苹方=PingFang SC,Microsoft YaHei,sans-serif;宋体=simsun,serif;仿宋体=FangSong,serif;黑体=SimHei,sans-serif;思源宋体=思源宋体,Noto,Serif,SC;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Times New Roman=Times New Roman, sans-serif;Book Antiqua=book antiqua,palatino;", branding: false, menubar: false, toolbar_drawer: false, convert_urls : false,// 如果你设置该选项为false,那么它会试着保持URL的完整性。默认为true,意味着URL会依据 relative_urls的状态而被强制为绝对或相对的 browser_spellcheck: true, // 拼写检查 paste_data_images: true, // 允许粘贴图像 images_upload_handler: (blobInfo, success) => { let formData = new FormData() formData.append('file', blobInfo.blob(), blobInfo.filename()); formData.append('biz', "jeditor"); formData.append("jeditor","1"); uploadAction(window._CONFIG['domianURL']+"/sys/common/upload", formData).then((res) => { if (res.success) { if(res.message == 'local'){ const img = 'data:image/jpeg;base64,' + blobInfo.base64() success(img) }else{ let img = getFileAccessHttpUrl(res.message) success(img) } } }) } }, myValue: this.value, reloading: false, } }, mounted() { this.initATabsChangeAutoReload() }, methods: { reload() { this.reloading = true this.$nextTick(() => this.reloading = false) }, onClick(e) { this.$emit('onClick', e, tinymce) }, //可以添加一些自己的自定义事件,如清空内容 clear() { this.myValue = '' }, /** * 自动判断父级是否是 <a-tabs/> 组件,然后添加事件监听,自动触发reload() * * 由于 tabs 组件切换会导致 tinymce 无法输入, * 只有重新加载才能使用(无论是vue版的还是jQuery版tinymce都有这个通病) */ initATabsChangeAutoReload() { // 获取父级 let tabs = getVmParentByName(this, 'ATabs') let tabPane = getVmParentByName(this, 'ATabPane') if (tabs && tabPane) { // 用户自定义的 key let currentKey = tabPane.$vnode.key // 添加事件监听 tabs.$on('change', (key) => { // 切换到自己时执行reload if (currentKey === key) { this.reload() } }) this.reload() }else{ let tabLayout = getVmParentByName(this, 'TabLayout') try { tabLayout.excuteCallback(() => { this.reload() }) } catch (error) { if (tabLayout) { this.reload() } } } }, }, watch: { value(newValue) { this.myValue = (newValue == null ? '' : newValue) }, myValue(newValue) { if(this.triggerChange){ this.$emit('change', newValue) }else{ this.$emit('input', newValue) } } } } </script> <style scoped> </style>
每天学习一点点,你就进步一点点。