基于Vue项目的富文本vue-quill-editor的使用
文章目录
基于Vue项目的富文本vue-quill-editor的使用一.背景二.Vue-Quill-Editor使用1.简介2.安装3.挂载到项目1.全局挂载2.组件中挂载
4.组件中使用1.双向数据绑定示例2.手动控制数据同步
5.在script中的配置1.基本配置2.扩展汉化处理1.配置工具栏2.css样式配置3.data选项中的配置变化
6.在富文本中上传文件1.效果图:
7.实现图片在富文本中自由缩放1.安装拖动和缩放的依赖2.加入相关引用3.配置editorOption
一.背景
最近呢,要做一个项目,后台管理平台要实现一个商品的详情发布,因为马上要做项目了,所以看了其中的一些设计,提前把一些技术要点攻关一下,到时候做项目会得心应手,网上搜了一下,发现vue-quill-editor这款富文本编辑器还挺不错的,在github上使用率也比较高,很适合咱们的vue项目,话不多说,直接上手了
二.Vue-Quill-Editor使用
1.简介
基于 Quill,适用于Vue的富文本编辑器,支持服务端渲染和单页应用.不过有一定的兼容性,就是兼容IE10+
2.安装
npm install vue-quill-editor -S
当然,也可以使用CDN的方式引入,我们这里讲NPM安装
3.挂载到项目
1.全局挂载
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
, )
2.组件中挂载
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'
import { quillEditor
} from 'vue-quill-editor'
export default {
components
: {
quillEditor
}
}
我们在开发中,使用到富文本,最多也就那么几个地方,所以不用使用全局挂载,直接在封装成组件,在组件中挂载即可!
4.组件中使用
在template中去使用组件,这里,我们有两种方式:一种是支持双向数据绑定的,一种是手动控制数据同步的
1.双向数据绑定示例
<template
>
<!-- Two
-way Data
-Binding
-->
<quill
-editor
ref
="myQuillEditor"
v
-model
="content"
:options
="editorOption"
@blur
="onEditorBlur($event)"
@focus
="onEditorFocus($event)"
@ready
="onEditorReady($event)"
/>
</template
>
2.手动控制数据同步
<!-- Or manually control the data synchronization
-->
<quill
-editor
:content
="content"
:options
="editorOption"
@change
="onEditorChange($event)"
/>
既然是Vue项目,我们这当然是使用支持双向数据绑定的
5.在script中的配置
1.基本配置
import "quill/dist/quill.core.css";
import "quill/dist/quill.snow.css";
import "quill/dist/quill.bubble.css";
import { quillEditor
} from "vue-quill-editor";
export default {
components
: {
quillEditor
},
data () {
return {
content
: '<h2>I am Example</h2>',
editorOption
: {
}
}
},
methods
: {
onEditorBlur(quill
) {
console
.log('editor blur!', quill
)
},
onEditorFocus(quill
) {
console
.log('editor focus!', quill
)
},
onEditorReady(quill
) {
console
.log('editor ready!', quill
)
},
onEditorChange({ quill
, html
, text
}) {
console
.log('editor change!', quill
, html
, text
)
this.content
= html
}
}
}
配置到这里,我们基本上就可以使用这个富文本了,但是呢,这只是最基本的,还不能满足我们的需求,因为这种简单的有些缺陷
都是英文,在我们国内的话,不能要求我们的用户都是高学历的,能汉化最好了富文本中总要上传一些图片,或者短视频什么的,这里虽然都支持,但是都会转成base64的格式,当我们要把这些数据提交到后端的时候,传输数据量比较大,总是不太方便
所以我们还需要使用它更丰富的功能,进行扩展一下,能弥补这些缺陷
2.扩展汉化处理
1.配置工具栏
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
: [] }],
["clean"],
["image", "video"]
];
2.css样式配置
<style lang
='scss' >
.editor
{
line
-height
: normal
!important
;
height
: 500px
;
}
.ql
-snow
.ql
-tooltip
[data
-mode
="link"]::before
{
content
: "请输入链接地址:";
}
.ql
-snow
.ql
-tooltip
.ql
-editing a
.ql
-action
::after
{
border
-right
: 0px
;
content
: "保存";
padding
-right
: 0px
;
}
.ql
-snow
.ql
-tooltip
[data
-mode
="video"]::before
{
content
: "请输入视频地址:";
}
.ql
-snow
.ql
-picker
.ql
-size
.ql
-picker
-label
::before
,
.ql
-snow
.ql
-picker
.ql
-size
.ql
-picker
-item
::before
{
content
: "14px";
}
.ql
-snow
.ql
-picker
.ql
-size
.ql
-picker
-label
[data
-value
="small"]::before
,
.ql
-snow
.ql
-picker
.ql
-size
.ql
-picker
-item
[data
-value
="small"]::before
{
content
: "10px";
}
.ql
-snow
.ql
-picker
.ql
-size
.ql
-picker
-label
[data
-value
="large"]::before
,
.ql
-snow
.ql
-picker
.ql
-size
.ql
-picker
-item
[data
-value
="large"]::before
{
content
: "18px";
}
.ql
-snow
.ql
-picker
.ql
-size
.ql
-picker
-label
[data
-value
="huge"]::before
,
.ql
-snow
.ql
-picker
.ql
-size
.ql
-picker
-item
[data
-value
="huge"]::before
{
content
: "32px";
}
.ql
-snow
.ql
-picker
.ql
-header
.ql
-picker
-label
::before
,
.ql
-snow
.ql
-picker
.ql
-header
.ql
-picker
-item
::before
{
content
: "文本";
}
.ql
-snow
.ql
-picker
.ql
-header
.ql
-picker
-label
[data
-value
="1"]::before
,
.ql
-snow
.ql
-picker
.ql
-header
.ql
-picker
-item
[data
-value
="1"]::before
{
content
: "标题1";
}
.ql
-snow
.ql
-picker
.ql
-header
.ql
-picker
-label
[data
-value
="2"]::before
,
.ql
-snow
.ql
-picker
.ql
-header
.ql
-picker
-item
[data
-value
="2"]::before
{
content
: "标题2";
}
.ql
-snow
.ql
-picker
.ql
-header
.ql
-picker
-label
[data
-value
="3"]::before
,
.ql
-snow
.ql
-picker
.ql
-header
.ql
-picker
-item
[data
-value
="3"]::before
{
content
: "标题3";
}
.ql
-snow
.ql
-picker
.ql
-header
.ql
-picker
-label
[data
-value
="4"]::before
,
.ql
-snow
.ql
-picker
.ql
-header
.ql
-picker
-item
[data
-value
="4"]::before
{
content
: "标题4";
}
.ql
-snow
.ql
-picker
.ql
-header
.ql
-picker
-label
[data
-value
="5"]::before
,
.ql
-snow
.ql
-picker
.ql
-header
.ql
-picker
-item
[data
-value
="5"]::before
{
content
: "标题5";
}
.ql
-snow
.ql
-picker
.ql
-header
.ql
-picker
-label
[data
-value
="6"]::before
,
.ql
-snow
.ql
-picker
.ql
-header
.ql
-picker
-item
[data
-value
="6"]::before
{
content
: "标题6";
}
.ql
-snow
.ql
-picker
.ql
-font
.ql
-picker
-label
::before
,
.ql
-snow
.ql
-picker
.ql
-font
.ql
-picker
-item
::before
{
content
: "标准字体";
}
.ql
-snow
.ql
-picker
.ql
-font
.ql
-picker
-label
[data
-value
="serif"]::before
,
.ql
-snow
.ql
-picker
.ql
-font
.ql
-picker
-item
[data
-value
="serif"]::before
{
content
: "衬线字体";
}
.ql
-snow
.ql
-picker
.ql
-font
.ql
-picker
-label
[data
-value
="monospace"]::before
,
.ql
-snow
.ql
-picker
.ql
-font
.ql
-picker
-item
[data
-value
="monospace"]::before
{
content
: "等宽字体";
}
</style
>
注意:
因为我们是在组件内写的样式 所以要删除 style lang=‘scss’ scoped 中的 scoped,使样式全局生效
我加了一个.editor 自定义的样式,可以自己控制富文本窗体大小,所以在引用这个组件的时候,加上class=’.editor’
<quill
-editor
class='.editor'></quill
-editor
>
3.data选项中的配置变化
data() {
return {
content
: ``,
editorOption
: {
modules
: {
toolbar
: toolbarOptions
},
theme
: "snow",
placeholder
: "请输入正文"
}
};
},
6.在富文本中上传文件
富文本中总要上传一些图片,或者短视频什么的,这里虽然都支持,但是都会转成base64的格式,当我们要把这些数据提交到后端的时候,传输数据量比较大,总是不太方便,况且后端存数据库的时候也只是存个路径地址而已,不会存base64那么一长串的编码,否则数据库岂不是要爆炸了
1.效果图:
首先呢,说一下具体的思路,然后实现:
vue-quill-edito是基于quill的,而quill有很多扩展和自定义的方法功能,比如说图片上传的点击功能,和图片的重定义大小
需要获取到quill的实例,我们才好做后面的事情this.$refs.myQuillEditor.quill
现在呢,要实现图片上传,用vue-quill-editor自身的工具栏中的图片按钮点击事件肯定是不行的,因为会默认转为base64,所以我们需要自己定义一个图片处理函数,当工具栏中的图片按钮被点击,然后使之触发.
this.$refs.newEditor.quill.getModule(``"toolbar"``).addHandler(``"image"``, imgHandler) 注册一个自定义图片处理函数
我们联想一下,以前使用隐藏控件时,让隐藏控件做某些事情.利用这个原理,我们可以模拟一个文件上传的点击事件,在当前使用组件的地方,写一个form表单,然后form表单中隐藏一个input标签,type为file属性.当我们的自定义图片处理函数被点击时,进行触发
最后调用图片上传的接口,返回图片在服务器的地址之后,回显于当前富文本中
不多说了,上代码
template
<template>
<div>
<quill-editor
v-model="content"
ref="myQuillEditor"
:options="editorOption"
@focus="onEditorFocus($event)"
@blur="onEditorBlur($event)"
@change="onEditorChange($event)"
class="editor"
></quill-editor>
<form action method="post" enctype="multipart/form-data" id="uploadFormMulti">
<input
style="display: none"
:id="uniqueId"
type="file"
name="file"
multiple
accept="image/jpg, image/jpeg, image/png, image/gif"
@change="uploadImg('uploadFormMulti')"
/>
</form>
</div>
</template>
上面是vue文件模版的内容
script
<script
>
import "quill/dist/quill.core.css";
import "quill/dist/quill.snow.css";
import "quill/dist/quill.bubble.css";
import { quillEditor
} from "vue-quill-editor";
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
: [] }],
["clean"],
["image", "video"]
];
export default {
name
: "",
components
: {
quillEditor
},
data() {
return {
uniqueId
: "uniqueId",
content
: "",
editorOption
: {
modules
: {
toolbar
: toolbarOptions
},
theme
: "snow",
placeholder
: "请输入正文"
}
};
},
computed
: {
editor() {
return this.$refs
.myQuillEditor
.quill
;
}
},
methods
: {
onEditorReady() {},
onEditorBlur() {},
onEditorFocus() {},
onEditorChange() {},
uploadImg
: async function() {
var _this
= this;
var formData
= new FormData();
formData
.append("file", document
.getElementById(_this
.uniqueId
).files
[0]);
try {
this.$http
.productapi
.uploadImgReq(formData
).then(res
=> {
let url
= res
;
if (url
!= null && url
.length
> 0) {
let Range
= _this
.editor
.getSelection();
url
= url
.indexOf("http") != -1 ? url
: "http:" + url
;
_this
.editor
.insertEmbed(
Range
!= null ? Range
.index
: 0,
"image",
url
);
} else {
_this
.$message
.warning("图片上传失败");
}
document
.getElementById(_this
.uniqueId
).value
= "";
});
} catch ({ message
: msg
}) {
document
.getElementById(_this
.uniqueId
).value
= "";
_this
.$message
.warning(msg
);
}
}
},
mounted() {
var _this
= this;
var imgHandler
= async function(image
) {
if (image
) {
var fileInput
= document
.getElementById(_this
.uniqueId
);
fileInput
.click();
}
};
_this
.editor
.getModule("toolbar").addHandler("image", imgHandler
);
}
};
</script
>
样式直接使用上面的css样式配置即可
7.实现图片在富文本中自由缩放
虽然实现了图片上传,解决了base64的问题,但是呢,我们发现图片回显的时候,体验感比较差,占满了整个富文本窗口.所有呢,接下来我们要实现图片能在富文本中可以自由缩放
1.安装拖动和缩放的依赖
npm install quill-image-resize-module -S //缩放
npm install quill-image-drop-module -S //拖动
//还需要安装quill 因为这几个插件都是依赖于quill
npm install quill -S
2.加入相关引用
import Quill
from "quill";
import ImageResize
from "quill-image-resize-module";
import { ImageDrop
} from "quill-image-drop-module";
Quill
.register("modules/imageDrop", ImageDrop
);
Quill
.register("modules/imageResize", ImageResize
);
3.配置editorOption
editorOption
: {
theme
: "snow",
placeholder
: "请输入正文",
modules
: {
imageDrop
: true,
imageResize
: {
displayStyles
: {
backgroundColor
: "black",
border
: "none",
color
: "white"
},
modules
: ["Resize", "DisplaySize", "Toolbar"]
},
toolbar
: {
container
: toolbarOptions
}
}
}
至此,拖动自由缩放功能就搞定了