在vuecli3中使用富文本编辑器:vue-quill-editor
安装
<!--通过npm安装-->
npm install vue-quill-editor --registry=https://registry.npm.taobao.org
<!--在安装依赖项-->
npm install quill
在mian.js中引入
import Vue from 'vue'
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)
在页面中使用
<!--editor.vue-->
<template>
<div style="background: #eee;padding: 16px">
富文本
<quill-editor
v-model="content"
ref="myQuillEditor"
:options="editorOption"
@blur="onEditorBlur($event)" @focus="onEditorFocus($event)"
@change="onEditorChange($event)">
</quill-editor>
</div>
</template>
<script>
export default {
data() {
return {
content: `<p></p><p><br></p><ol><li><strong><em>Or drag/paste an image here.</em></strong></li><li><strong><em>rerew</em></strong></li><li><strong><em>rtrete</em></strong></li><li><strong><em>tytrytr</em></strong></li><li><strong><em>uytu</em></strong></li></ol>`,
editorOption: {}
}
},
methods: {
onEditorReady(editor) { // 准备编辑器
conosle.log(editor)
},
onEditorBlur(){ // 失去焦点事件
console.log('失去焦点事件')
console.log(this.content)
},
onEditorFocus(){ // 获得焦点事件
console.log('获得焦点事件')
},
onEditorChange(){ // 内容改变事件
console.log('内容改变事件')
},
},
computed: {
// 如果你需要得到当前的editor对象来做一些事情,你可以像下面这样定义一个方法属性来获取当前的editor对象,实际上这里的$refs对应的是当前组件内所有关联了ref属性的组件元素对象
editor() {
return this.$refs.myQuillEditor.quill;
},
}
}
</script>
v-model就是编辑器绑定的值: content,editorOption是编辑器的配置选项,如果想要禁用编辑器
disabled(editor){
editor.enable(false)//禁用
editor.enable(true)//取消禁用
}
富文本中插入图片
又看到一个问题,就做下整理,在富文本编辑器中添加图片,他会把图片转成base64的,这样就会导致传给后台的内容特别长,所以就需要在插入图片之前把默认的操作改成电泳后台接口,并把图片存在数据库中,并把链接返回来,这样image标签的src就不是base64的了.
直接贴代码:
<template>
<div>
<div v-loading="imageLoading" element-loading-text="请稍等,图片上传中">
<quill-editor ref="newEditor" v-model="content" ></quill-editor>
<!-- 文件上传input 将它隐藏 -->
<el-upload style="display:none" :action="apiurl" :show-file-list="false" :before-upload='newEditorbeforeupload' :on-success='newEditorSuccess'
ref="uniqueId" id="uniqueId"></el-upload >
</div>
</div>
</template>
<script>
import api from '@/service'
import {quillEditor} from 'vue-quill-editor'
export default {
data() {
return {
content: '',
imageLoading: false,
apiurl: '123'
}
},
mounted(){
var imgHandler = async function(state) {
if (state) {
var fileInput =document.querySelector('#uniqueId input') //隐藏的file元素
fileInput.click() //触发事件
}
}
this.$refs.newEditor.quill.getModule("toolbar").addHandler("image", imgHandler)
},
methods: {
newEditorbeforeupload(file){
const isJPG = file.type === 'image/jpeg' ||file.type === 'image/png';
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isJPG) {
this.$message.error('上传图片只能是 JPG或PNG 格式!');
}
if (!isLt2M) {
this.$message.error('上传图片大小不能超过 2MB!');
}
if(isJPG && isLt2M){
// this.imageLoading =true;
let response = api.returnImgurl(file);
console.log(response)
this.addImgRange = this.$refs.newEditor.quill.getSelection()
this.$refs.newEditor.quill.insertEmbed(this.addImgRange != null?this.addImgRange.index:0, 'image',response.data)
}
// return isJPG && isLt2M;
return false;
},
//上传图片回调
newEditorSuccess(response, file, fileList){
if(response.status===1){
this.addImgRange = this.$refs.newEditor.quill.getSelection()
this.$refs.newEditor.quill.insertEmbed(this.addImgRange != null?this.addImgRange.index:0, 'image',response.datas, Quill.sources.USER)
}
this.imageLoading =false
},
}
}
</script>
这里面用的element中的组件el-upload,其中before-upload是上传图片之前执行的方法,我在下面执行这个时最后返回了个false,这样他就不会执行on-success中的方法了.
before-upload执行过程调用了api.returnImgurl方法并把图片文件传了过去,
function returnImgurl(data){
let data1 = {data: 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1566990761375&di=6c677bf1095bb1fc7b50d7a5600cf768&imgtype=0&src=http%3A%2F%2Faliyunzixunbucket.oss-cn-beijing.aliyuncs.com%2Fjpg%2Fe139851b588d5fc042aff797b6f6e824.jpg%3Fx-oss-process%3Dimage%2Fresize%2Cp_100%2Fauto-orient%2C1%2Fquality%2Cq_90%2Fformat%2Cjpg%2Fwatermark%2Cimage_eXVuY2VzaGk%3D%2Ct_100'}
if(data){
return data1;
}
}
我这里模拟了下调用接口的过程,返回的data中包含一个图片的链接,这个链接就是后台返回给我们的. 转载