前排提示:如今能够直接使用封装好的插件vue-quill-editor-uploadhtml
vue-quill-editor是咱们再使用vue框架的时候经常使用的一个富文本编辑器,在进行富文本编辑的时候,咱们每每要插入一些图片,vue-quill-editor默认的处理方式是直接将图片转成base64编码,这样的结果是整个富文本的html片断十分冗余,一般来说,每一个服务器端接收的post的数据大小都是有限制的,这样的话有可能致使提交失败,或者是用户体验不好,数据要传递好久才所有传送到服务器。
所以,在富文本编辑的过程当中,对于图片的处理,咱们更合理的作法是将图片上传到服务器,再将图片连接插入到富文本中,以达到最优的体验。
废话很少说,接下来直接看如何改造前端
查阅网上的资料,我感受提供的方案都不是特别友好,网上搜索的基本都是这一个方法
配合 element-ui 实现上传图片/视频到七牛或者是直接从新写一个按钮来进行自定义图片操做vue
坦白讲,上面这2个方法都很特别,也的确有效果,可是我我的仍是以为不完美,第一个方法写得太麻烦,第二个方法有点投机取巧。
结合上面两种方法以及官方的文档,我这里提供一个新的改造思路给你们参考。git
和第一种方法相似,为了更好的控制上传的图片,我这里也是引用了element-ui的上传图片组件github
<template> <div> <!-- 图片上传组件辅助--> <el-upload class="avatar-uploader" :action="serverUrl" name="img" :headers="header" :show-file-list="false" :on-success="uploadSuccess" :on-error="uploadError" :before-upload="beforeUpload"> </el-upload> </div> </template> <script> export default { data() { return { serverUrl: '', // 这里写你要上传的图片服务器地址 header: {token: sessionStorage.token} // 有的图片服务器要求请求头须要有token } }, methods: { // 上传图片前 beforeUpload(res, file) {}, // 上传图片成功 uploadSuccess(res, file) {}, // 上传图片失败 uploadError(res, file) {} } } </script>
这里要使用element-ui主要有2个好处element-ui
:on-success="uploadSuccess" // 图片上传成功 :on-error="uploadError" // 图片上传失败 :before-upload="beforeUpload" // 图片上传前
这里对于如何安装和引入vue-quill-editor和就很少作陈述了,不清楚的同窗本身Google下哈。
在代码中写入vue-quill-editor后以下segmentfault
<template> <div> <!-- 图片上传组件辅助--> <el-upload class="avatar-uploader" :action="serverUrl" name="img" :headers="header" :show-file-list="false" :on-success="uploadSuccess" :on-error="uploadError" :before-upload="beforeUpload"> </el-upload> <!--富文本编辑器组件--> <el-row v-loading="uillUpdateImg"> <quill-editor v-model="detailContent" ref="myQuillEditor" :options="editorOption" @change="onEditorChange($event)" @ready="onEditorReady($event)" > </quill-editor> </el-row> </div> </template> <script> export default { data() { return { quillUpdateImg: false, // 根据图片上传状态来肯定是否显示loading动画,刚开始是false,不显示 serverUrl: '', // 这里写你要上传的图片服务器地址 header: {token: sessionStorage.token}, // 有的图片服务器要求请求头须要有token之类的参数,写在这里 detailContent: '', // 富文本内容 editorOption: {} // 富文本编辑器配置 } }, methods: { // 上传图片前 beforeUpload(res, file) {}, // 上传图片成功 uploadSuccess(res, file) {}, // 上传图片失败 uploadError(res, file) {} } } </script>
这里能够看到咱们用一个<el-row>包裹咱们的富文本组件,是为了使用loading动画,就是v-loading这个设置服务器
从下图能够看到,默认的配置中,整个工具栏具有了全部的功能,天然也包括红圈中的图片上传功能了。
那么接下来咱们要怎么去重写这个按钮的事件呢。微信
很简单,咱们须要在editorOption配置中这么写session
export default { data() { return { quillUpdateImg: false, // 根据图片上传状态来肯定是否显示loading动画,刚开始是false,不显示 serverUrl: '', // 这里写你要上传的图片服务器地址 header: {token: sessionStorage.token}, // 有的图片服务器要求请求头须要有token之类的参数,写在这里 detailContent: '', // 富文本内容 editorOption: { placeholder: '', theme: 'snow', // or 'bubble' modules: { toolbar: { container: toolbarOptions, // 工具栏 handlers: { 'image': function (value) { if (value) { document.querySelector('#quill-upload input').click() } else { this.quill.format('image', false); } } } } } } } } }
配置中的handlers是用来定义自定义程序的,然而咱们配置完后会懵逼地发现,整个富文本编辑器的工具栏的图片上传等按钮都不见了 只保留了几个基本的富文本功能。
这个是由于添加自定义处理程序将覆盖默认的工具栏和主题行为
所以咱们要再自行配置下咱们须要的工具栏,全部功能的配置以下,你们能够按需配置
<script> // 工具栏配置 const toolbarOptions = [ ['bold', 'italic', 'underline', 'strike'], // toggled buttons ['blockquote', 'code-block'], [{'header': 1}, {'header': 2}], // custom button values [{'list': 'ordered'}, {'list': 'bullet'}], [{'script': 'sub'}, {'script': 'super'}], // superscript/subscript [{'indent': '-1'}, {'indent': '+1'}], // outdent/indent [{'direction': 'rtl'}], // text direction [{'size': ['small', false, 'large', 'huge']}], // custom dropdown [{'header': [1, 2, 3, 4, 5, 6, false]}], [{'color': []}, {'background': []}], // dropdown with defaults from theme [{'font': []}], [{'align': []}], ['link', 'image', 'video'], ['clean'] // remove formatting button ] export default { data() { return { editorOption: { placeholder: '', theme: 'snow', // or 'bubble' modules: { toolbar: { container: toolbarOptions, // 工具栏 handlers: { 'image': function (value) { if (value) { alert(1) } else { this.quill.format('image', false); } } } } } } } } } </script>
因为这里的工具栏配置列举了全部,看起来很长一堆,我建议你们能够写在单独一个文件,而后再引入,美观一点
通过上面的配置,你们点击一下图片,能够看出弹出了个1,说明咱们的自定义事件生效了,那么接下来,你们的思路是否是就很清晰啦?
咱们须要在handlers里面继续完善咱们的图片点击事件。
handlers: { 'image': function (value) { if (value) { // 触发input框选择图片文件 document.querySelector('.avatar-uploader input').click() } else { this.quill.format('image', false); } } }
在这里咱们的自定义事件就结束了,接下来图片上传成功或者失败都由
:on-success="uploadSuccess" // 图片上传成功 :on-error="uploadError" // 图片上传失败 :before-upload="beforeUpload" // 图片上传前
这三个函数来处理
// 富文本图片上传前 beforeUpload() { // 显示loading动画 this.quillUpdateImg = true }, uploadSuccess(res, file) { // res为图片服务器返回的数据 // 获取富文本组件实例 let quill = this.$refs.myQuillEditor.quill // 若是上传成功 if (res.code === '200' && res.info !== null) { // 获取光标所在位置 let length = quill.getSelection().index; // 插入图片 res.info为服务器返回的图片地址 quill.insertEmbed(length, 'image', res.info) // 调整光标到最后 quill.setSelection(length + 1) } else { this.$message.error('图片插入失败') } // loading动画消失 this.quillUpdateImg = false }, // 富文本图片上传失败 uploadError() { // loading动画消失 this.quillUpdateImg = false this.$message.error('图片插入失败') }
好了,本文就讲到这,目前运行良好,整个文章的代码比较多,可是实际上须要去深刻理解的地方不多,咱们只是简单重定义了图片按钮的触发事件。
对了,你们别忘记安装element-ui和vue-quill-editor哦。
若是有错误,欢迎你们多提提意见,但愿这篇文章能帮到有须要的人。
获取更多知识,请微信扫码关注公众号关注早读君,天天早晨为你推送前端知识,度过挤地铁坐公交的时光。
并且不定时举办活动赠送书籍哦