啊!!!好久没更新了,最近粉丝和访问量见长,正好有童鞋的项目遇到点问题,故出此文,
今天超哥给小伙伴带来的是vue中富文本编辑器上传的问题。
曾经写过一个文档管理的项目,用到最多的就是富文本编辑器。
说说遇到的坑吧:最终的提交结果,后端不要文档流,后端要上传成功返回的路径,不知道正在阅读此文的小伙伴是如何处理的,瞅着挺简单,但写起来还真有点麻烦,在这里以vue-quill-editor为例给大家演示。
首先安装,不用多说了吧,cnpm install vue-quill-editor -S
接着,引入依赖
import VueQuillEditor from 'vue-quill-editor';
import 'quill/dist/quill.core.css';
import 'quill/dist/quill.snow.css';
import 'quill/dist/quill.bubble.css';
Vue.use(VueQuillEditor)
先说一下实现过程吧,依赖element-ui,当然你可以想成你自己想要的上传插件,或者有大神可以直接new FormData()也是可以的。用白话文讲就是把插件中的图片按钮用el-upload覆盖,就这么简单。具体实现过程请继续往下看。
在所需的vue文件中
首先看DOM层,只需两个标签即可(quill-editor,el-upload)
附代码:
<el-upload
class="avatar-uploader"
:action="serverUrl"
name="img"
:data='fileUpload'
:show-file-list="false"
:on-success="uploadSuccess"
:on-error="uploadError"
:before-upload="beforeUpload">
</el-upload>
<quill-editor v-model="docContent"
ref="myQuillEditor"
:options="editorOption"
@blur="handleEditorBlur($event)"
@focus="handleEditorFocus($event)"
@change="handleEditorChange($event)">
</quill-editor>
写过vue的相信el-upload大家都不陌生,在这里就不一一介绍各个属性了,而quill-editor这里超哥直接附上传送门vue-quill-editor - npm
数据层,附代码:
fileUpload:{ //附件上传
file:null
},
serverUrl: 'http://********',//上传图片的地址
editorOption: {
placeholder: '',
theme: 'snow',
modules: {
toolbar: {
container: toolbarOptions, // 工具栏
handlers: {
'image': function (value) {
if (value) {
document.querySelector('.avatar-uploader input').click()
} else {
this.quill.format('image', false);
}
}
}
}
}
},
看到这里有的小伙伴可能看到了重点,toolbarOptions是哪里来的,不要急,这个东西就是所需配置的工具栏,当时我们项目有回显功能所以超哥单独给他摘出来了。
toolbarOptions.js附代码:
const toolbarOptions = [
['bold', 'italic', 'underline', 'strike'],
['blockquote', 'code-block'],
[{'header': 1}, {'header': 2}],
[{'list': 'ordered'}, {'list': 'bullet'}],
[{'script': 'sub'}, {'script': 'super'}],
[{'indent': '-1'}, {'indent': '+1'}],
[{'direction': 'rtl'}],
[{'size': ['small', false, 'large', 'huge']}],
[{'header': [1, 2, 3, 4, 5, 6, false]}],
[{'color': []}, {'background': []}],
[{'font': []}],
[{'align': []}],
['link', 'image', 'video'],
['clean']
]
export default toolbarOptions
然后继续,逻辑层,附代码:
注:uploadSuccess为改写的重中之重。
uploadError() {
// loading动画消失
this.quillUpdateImg = false
this.$message.error('图片插入失败')
},
uploadSuccess(res, file){
// 首先获取富文本编辑器的实例
let quill = this.$refs.myQuillEditor.quill
// 上传成功所执行
if (res.code == 200 && res.data !== null) {
// 获取光标所在位置
let length = quill.getSelection().index;
// 插入图片res为服务器返回的数据
quill.insertEmbed(length, 'image', res.data)
// 光标移动至文本末端
quill.setSelection(length + 1)
} else {
this.$message.error('图片插入失败')
}
// loading动画消失
this.quillUpdateImg = false
},
beforeUpload(file) {
this.fileUpload.file=file;
// 显示loading动画
this.quillUpdateImg = true
},
handleEditorBlur () {},
handleEditorFocus () {},
//这个是当初做的个文字限制后来没用就注释了
handleEditorChange (e) {
/*this.textLen = e.text.length - 1;
this.beyond = this.textLen - 350;
if (this.textLen > 350) {
this.info.evId = '';
} else {
this.info.evId = this.evList[0].evId;
}*/
},
到这里此工程其实就已经竣工,说简单也简单说复杂也复杂,全在自己的摸索和探讨。
有时候比较忙,顾不上一一回复,但是看到了就一定会回复,