tinymce封装成vue3组件
封装成组件
<script setup > import Editor from '@tinymce/tinymce-vue' //引入tinymce开启本地模式 import 'tinymce/tinymce' //引入图标和主题等 import 'tinymce/themes/silver/theme' import 'tinymce/icons/default/icons' import 'tinymce/models/dom' //引入插件 import 'tinymce/plugins/codesample' import 'tinymce/plugins/lists' import 'tinymce/plugins/advlist' import 'tinymce/plugins/link' import 'tinymce/plugins/autolink' import 'tinymce/plugins/charmap' import 'tinymce/plugins/emoticons' import 'tinymce/plugins/fullscreen' import 'tinymce/plugins/preview' import 'tinymce/plugins/code' import 'tinymce/plugins/searchreplace' import 'tinymce/plugins/table' import 'tinymce/plugins/visualblocks' import 'tinymce/plugins/wordcount' import 'tinymce/plugins/insertdatetime' import 'tinymce/plugins/image' const emit = defineEmits(['setData','file']) const props = defineProps({ value: { type: String, default: '', }, disabled: { type: Boolean, default: false, }, init: { type: Object }, }) let initObj = reactive({ // 选择器 selector: 'textarea#tinymceVue', // 设置本地主题 skin_url: '/tinymce/skins/ui/oxide', // 设置本地css content_css: '/tinymce/skins/content/default/content.css', // 设置本地plugins中emojis的位置,用来获取表情 emoticons_database_url: '/tinymce/plugins/emoticons/js/emojis.js', // 设置本地语言 language_url: '/tinymce/langs/zh-Hans.js', // 设置本地语言 language: 'zh-Hans', // 设置工具栏 toolbar: [ 'bold italic hr | fontsize forecolor backcolor | blocks blockquote removeformat | undo redo ', 'bullist table insertdatetime | link charmap emoticons wordcount searchreplace code | codesample visualblocks image fullscreen preview', ], // 设置插件 plugins: 'codesample lists advlist link autolink charmap emoticons fullscreen preview code searchreplace table visualblocks wordcount insertdatetime image', // 设置图片上传 images_upload_handler: blobInfo => new Promise((resolve, reject) => { emit('file', blobInfo, resolve, reject) }), }) //有新设定就覆盖init if (props.init){ Object.assign(initObj, props.init) } //content内容变量 let content = ref(props.value) //更新父组件内容 const handlerFunction = () => { emit('setData', content.value) } </script> <template> <Editor id="tinymceVue" v-model="content" :init="initObj" :disabled="disabled" @selectionChange="handlerFunction" /> </template>
使用
<script setup> import tinymce from '@/components/tinymce.vue' let data = ref('') const getData = str => { data.value = str } let init = reactive({ }) let upFile = (blobInfo, resolve, reject) => { let formdata = new FormData() formdata.append('file', blobInfo.blob(), blobInfo.filename()) ajax.post('/file/up', formdata).then(res => { resolve(res.url) }).catch(err => { reject(err) }) } </script> <template> <tinymce :value="data" @setData="getData" :init="init" @file="upFile" /> </template>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」