当前位置: 首页 > Web前端 > vue.js

tinymce-vue自定义图片上传插件,在插件中调用vue组件

时间:2023-03-31 22:49:21 vue.js

最近的工作项目需要基于tinymce-vue进行插件开发。需要自己写一个插入图片/视频/链接的插件,虽然tinymce自带了这些插件,但是这些插件的UI界面不是很漂亮,所以老大说要自定义这些插件的tinymce。下面我们基于tinymce-vue自定义图片上传插件来记录一下。先说一下上传图片的要求:点击菜单栏插入图片后,会弹出一个自定义的vue组件。点击图片上传后,图片会插入到编辑框和插入封面图的图片,无论是在编辑框还是在封面图,右下角应该有裁剪按钮图片,以便用户可以裁剪图片。下面是我自己画的图。这里简单记录一下,然后写一个超级简单的demo,demo只记录自定义图片上传插件,并在插件中调用vue组件,将上传的图片插入编辑框,就是一个超简单的模板。其他如上传后插入图片再插入封面图、图片编辑按钮等不记录。如果需要自己扩展,如何引入tinymce-vue插件和汉化插件就不讨论了。(demo地址)先在node_modules的tinymce文件夹下的plugins下创建自定义插件文件夹如uploadImg,然后在该文件夹下创建index.js和plugin.js(最好将plugins文件夹移动到node_modules下,否则插件每次npminstall都会没有,每次都要备份插件)import'tinymce/plugins/uploadImg';//这里需要导入插件//然后在initplugins:'uploadImg',//Plug-intoolbar:'undoredo|uploadImg',//顶层排版自定义插件(也就是上面创建的plugin.js)一开始想对外给这个插件传参,发现好像不可行,后来改了直接在插件中创建组件。在插件中调用Vue插件是通过Vue的render函数来渲染的。最开始组件是用extend创建的,效果不好就换成render,然后通过组件中抛出的事件来完成。组件响应控制我们的动态组件。importVuefrom'vue'importTinymceUploadfrom'@/components/Tinymce/TinymceUpload'//导入自定义插件(function(){'usestrict';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');varregister=function(editor){editor.addCommand('beHeader',function(){});};varCommands={register:register};varregister$1=function(editor){//insideSome行级元素需要加上font-size:0因为有些按钮图标需要自定义,所以这里也定义了一个按钮图标editor.ui.registry.addIcon('upload','

');editor.ui.registry.addButton('uploadImg',{icon:'upload',tooltip:'uploadImg',//鼠标移动时按钮上显示的文字提示onAction:function(){uploadEvent(editor)}});editor.ui.registry.addMenuItem('uploadImg',{icon:'upload',text:'uploadImg',onAction:function(){uploadEvent(editor)}});};var按钮秒={注册:注册$1};//图片按钮事件letuploadEvent=function(editor){letloader=newVue({render:(h,con)=>{returnh(TinymceUpload,{props:{panelShow:true,},on:{hidePanel(val){//关闭上传工具弹框document.body.removeChild(content.$el)content=nullloader.$destroy()},successUpload(imgList){//获取上传完成回调imgList.forEach((item,key)=>{if(item!=undefined){editor.focus();letidName=`${newDate().getTime()}-${key}`//为每个添加一个id图片、时间戳和索引,保证图片id唯一,添加id是为了方便后续操作,比如给插入的图片添加编辑按钮editor.selection.setContent(editor.dom.createHTML('img',{src:item,id:idName}));}})},}})}})letcontent=loader.$mount()document.body.appendChild(content.$el)}functionPlugin(){global.add('uploadImg',function(editor){Commands.register(editor);Buttons.register(编辑器);});}插入();}());这种写法虽然可以满足我们的业务需求,但是总觉得不够优雅。有其他好的方案的也可以一起交流。虽然看起来很简单,但它只是一个模板,除非是简单的在编辑框中插入一张图片,否则如果加上业务逻辑就不那么简单了。废话说完,附上一个超精简的demo。以后有时间的话,我会结合一些业务需求,把插件和组件打包做成一个组件库。那么以后如果有tinymce的插件扩展,也会在这个简易版中。继续在demo上添加定义插件模板