1、npm安装:
npm install vue-quill-editor //富文本编辑器
npm install quill //依赖项
2、在main.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)
3、要放大缩小图片先安装:
- npm i quill-image-drop-module -S
- npm i quill-image-resize-module -S
4、创建组件写入以下代码,支持图片上传、放大、缩小、拖拽、
<template>
<div>
<!-- 图片上传组件辅助-->
<el-upload
class="avatar-uploader"
:action="serverUrl"
:data="upload_tokey"
name="imgfile"
:headers="header"
:show-file-list="false"
list-type="picture"
:multiple="false"
:on-success="uploadSuccess"
:on-error="uploadError"
:before-upload="beforeUpload"
>
</el-upload>
<quill-editor
class="editor"
v-model="content"
ref="myQuillEditor"
:options="editorOption"
@blur="onEditorBlur($event)"
@focus="onEditorFocus($event)"
@change="onEditorChange($event)"
>
</quill-editor>
</div>
</template>
<script>/
/ 工具栏配置
const toolbarOptions = [
["bold", "italic", "underline", "strike"], // 加粗 斜体 下划线 删除线
["blockquote", "code-block"], // 引用 代码块
[{ header: 1 }, { header: 2 }], // 1、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"], // 清除文本格式
["link", "image", "video"] // 链接、图片、视频
];
import { quillEditor } from "vue-quill-editor";import Quill from "quill"; //引入编辑器
import { ImageDrop } from "quill-image-drop-module";
import ImageResize from "quill-image-resize-module";
Quill.register("modules/imageDrop", ImageDrop);
Quill.register("modules/imageResize", ImageResize);
export default {
components: {
quillEditor
},
data() {
return {
upload_tokey: {},
content: this.value,
quillUpdateImg: false, // 根据图片上传状态来确定是否显示loading动画,刚开始是false,不显示
editorOption: {
placeholder: "",
theme: "snow", // or 'bubble'
placeholder: "您想说点什么?",
modules: {
imageDrop: true, //图片拖拽
imageResize: { //放大缩小
displaySize: true
},
// theme:'snow',
toolbar: {
container: toolbarOptions,
// container: "#toolbar",
handlers: {
image: function(value) {
if (value) {
// 触发input框选择图片文件
document.querySelector(".avatar-uploader input").click();
} else {
this.quill.format("image", false);
}
}
}
}
}
},
serverUrl: "http://106.53.237.189:803/photo.php", // 这里写你要上传的图片服务器地址
header: {
// token: sessionStorage.token
}, // 有的图片服务器要求请求头需要有token // 切图器数据
isShowCropper: false
};
},
methods: {
//富文本内容改变事件
onEditorChange() {
console.log(this.content);
},
//失去焦点事件
onEditorBlur() {},
//获得焦点事件
onEditorFocus() {},
// 富文本图片上传前
beforeUpload() {
// 显示loading动画
console.log("我要上传图片咯");
this.quillUpdateImg = true;
},
uploadSuccess(res, imgfile) {
// console.log('上传成功图片结果----')
// console.log(res,file) // res为图片服务器返回的数据
// 获取富文本组件实例
let quill = this.$refs.myQuillEditor.quill; // 如果上传成功
console.log("44", res);
if (res.code == 200) {
// 获取光标所在位置
let length = quill.getSelection().index;
// 插入图片 res.url为服务器返回的图片地址
quill.insertEmbed(length, "image", res.data.filePath);
// 调整光标到最后
quill.setSelection(length + 1);
} else {
this.$message.error("图片插入失败"); } // loading动画消失
this.quillUpdateImg = false; }, // 富文本图片上传失败
uploadError() { // loading动画消失
this.quillUpdateImg = false;
this.$message.error("图片插入失败");
}
}};
</script>
//汉化样式
<style>
.editor {
line-height: normal !important;
height: 800px;
}
.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>
4、在vue页面中引入使用:
<template>
<div>
<vue-quill-editor></vue-quill-editor>
</div>
</template>
<script>
import VueQuillEditor from '../../components/VueQuillEditor';
export default({
components: {
"vue-quill-editor": VueQuillEditor, //富文本编辑器
},
data(){
return {
}
},
created(){
},
methods:{
}
})
</script>
vue quill-image-resize-module imports报错处理
1、vue-cli2在build文件夹下,找到webpack.dev.conf.js 和 webpack.prod.conf.js 文件,打开,找到plugins属性,然后在其中添加如下代码:
new webpack.ProvidePlugin({
'window.Quill':'quill/dist/quill.js','Quill':'quill/dist/quill.js'
}),
2、如果是Vue-cli3 在 vue.config.js文件添加以下代码即可:
**
**
然后npm start或者npm run dev重新启动,这样就不会控制台报错imports is undefined了。