<template>
<div>
<el-upload
:action="uploadUrl"
:before-upload="handleBeforeUpload"
:on-success="handleUploadSuccess"
:on-error="handleUploadError"
name="file"
:show-file-list="false"
:headers="headers"
style="display: none"
ref="upload"
v-if=" == 'url'"
></el-upload>
<div class="editor" ref="editor" :style="styles"></div>
</div>
</template>
<script>
import Quill from "quill";
import "quill/dist/";
import "quill/dist/";
import "quill/dist/";
import { getToken } from "@/utils/auth";
let fontFamily = [
"标准字体",
"宋体",
"黑体",
"微软雅黑",
"楷体",
"仿宋",
"Arial",
"苹方"
];
["attributors/style/font"].whitelist = fontFamily;
(["attributors/style/font"]);
// 自定义文字大小
let fontSize = ["16px", "18px", "20px", "22px", "24px", "36px"];
["attributors/style/size"].whitelist = fontSize;
(["attributors/style/size"]);
// 新增行高 没效果
// let Parchment = ("parchment");
// let lingHeight = ["initial", "10", "25", "1.75", "2", "3", "4"];
// class lineHeightAttributor extends {}
// const lineHeightStyle = new lineHeightAttributor("lineHeight", "line-height", {
// scope: ,
// whitelist: lingHeight
// });
// ({ "formats/lineHeight": lineHeightStyle }, true);
// 对齐方式样式都改成style方式,而不是class
let Align = ("attributors/style/align");
= ["right", "center", "justify"];
(Align, true);
export default {
name: "Editor",
props: {
/* 编辑器的内容 */
value: {
type: String,
default: ""
},
/* 高度 */
height: {
type: Number,
default: null
},
/* 最小高度 */
minHeight: {
type: Number,
default: null
},
/* 只读 */
readOnly: {
type: Boolean,
default: false
},
// 上传文件大小限制(MB)
fileSize: {
type: Number,
default: 5
},
/* 类型(base64格式、url格式) */
type: {
type: String,
default: "url"
}
},
data() {
return {
uploadUrl: .VUE_APP_BASE_API + "/common/upload", // 上传的图片服务器地址
headers: {
Authorization: "Bearer " + getToken()
},
Quill: null,
currentValue: "",
options: {
theme: "snow",
bounds: ,
debug: "warn",
modules: {
// 工具栏配置
toolbar: [
["bold", "italic", "underline", "strike"], // 加粗 斜体 下划线 删除线
["blockquote", "code-block"], // 引用 代码块
[{ list: "ordered" }, { list: "bullet" }], // 有序、无序列表
[{ indent: "-1" }, { indent: "+1" }], // 缩进
// [{ size: ["small", false, "large", "huge"] }], // 字体大小
[{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题
[{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色
[{ align: [] }], // 对齐方式
["clean"], // 清除文本格式
["link", "image", "video"], // 链接、图片、视频
[{ font: fontFamily }],
[{ size: fontSize }], // 文字大小
// [{ lineheight: lingHeight }] // 行高
]
},
placeholder: "请输入内容",
readOnly:
}
};
},
computed: {
styles() {
let style = {};
if () {
= `${}px`;
}
if () {
= `${}px`;
}
return style;
}
},
watch: {
value: {
handler(val) {
if (val !== ) {
= val === null ? "" : val;
if () {
();
}
}
},
immediate: true
}
},
mounted() {
();
},
beforeDestroy() {
= null;
},
methods: {
init() {
const editor = this.$;
= new Quill(editor, this.options);
// 如果设置了上传地址则自定义图片上传事件
if (this.type == "url") {
let toolbar = ("toolbar");
("image", value => {
= "image";
if (value) {
this.$.$children[0].$refs.input.click();
} else {
.format("image", false);
}
});
}
();
.on("text-change", (delta, oldDelta, source) => {
const html = this.$[0].innerHTML;
const text = ();
const quill = ;
= html;
this.$emit("input", html);
this.$emit("on-change", { html, text, quill });
});
.on("text-change", (delta, oldDelta, source) => {
this.$emit("on-text-change", delta, oldDelta, source);
});
.on("selection-change", (range, oldRange, source) => {
this.$emit("on-selection-change", range, oldRange, source);
});
.on("editor-change", (eventName, ...args) => {
this.$emit("on-editor-change", eventName, ...args);
});
},
// 上传前校检格式和大小
handleBeforeUpload(file) {
// 校检文件大小
if () {
const isLt = file.size / 1024 / 1024 < ;
if (!isLt) {
this.$message.error(`上传文件大小不能超过 ${} MB!`);
return false;
}
}
return true;
},
handleUploadSuccess(res, file) {
// 获取富文本组件实例
let quill = ;
// 如果上传成功
if (res.code == 200) {
// 获取光标所在位置
let length = ().index;
// 插入图片 为服务器返回的图片地址
(
length,
"image",
.VUE_APP_BASE_API +
);
// 调整光标到最后
(length + 1);
} else {
this.$message.error("图片插入失败");
}
},
handleUploadError() {
this.$message.error("图片插入失败");
}
}
};
</script>
<style>
.editor,
.ql-toolbar {
white-space: pre-wrap !important;
line-height: normal !important;
}
.quill-img {
display: none;
}
.ql-snow .ql-tooltip[data-mode="link"]::before {
content: "请输入链接地址:";
}
.ql-snow .-editing -action::after {
border-right: 0px;
content: "保存";
padding-right: 0px;
}
.ql-snow .ql-tooltip[data-mode="video"]::before {
content: "请输入视频地址:";
}
.ql-snow .-size .ql-picker-label::before,
.ql-snow .-size .ql-picker-item::before {
content: "14px";
}
.ql-snow .-size .ql-picker-label[data-value="small"]::before,
.ql-snow .-size .ql-picker-item[data-value="small"]::before {
content: "10px";
}
.ql-snow .-size .ql-picker-label[data-value="large"]::before,
.ql-snow .-size .ql-picker-item[data-value="large"]::before {
content: "18px";
}
.ql-snow .-size .ql-picker-label[data-value="huge"]::before,
.ql-snow .-size .ql-picker-item[data-value="huge"]::before {
content: "32px";
}
.ql-snow .-header .ql-picker-label::before,
.ql-snow .-header .ql-picker-item::before {
content: "文本";
}
.ql-snow .-header .ql-picker-label[data-value="1"]::before,
.ql-snow .-header .ql-picker-item[data-value="1"]::before {
content: "标题1";
}
.ql-snow .-header .ql-picker-label[data-value="2"]::before,
.ql-snow .-header .ql-picker-item[data-value="2"]::before {
content: "标题2";
}
.ql-snow .-header .ql-picker-label[data-value="3"]::before,
.ql-snow .-header .ql-picker-item[data-value="3"]::before {
content: "标题3";
}
.ql-snow .-header .ql-picker-label[data-value="4"]::before,
.ql-snow .-header .ql-picker-item[data-value="4"]::before {
content: "标题4";
}
.ql-snow .-header .ql-picker-label[data-value="5"]::before,
.ql-snow .-header .ql-picker-item[data-value="5"]::before {
content: "标题5";
}
.ql-snow .-header .ql-picker-label[data-value="6"]::before,
.ql-snow .-header .ql-picker-item[data-value="6"]::before {
content: "标题6";
}
.ql-snow .-font .ql-picker-label::before,
.ql-snow .-font .ql-picker-item::before {
content: "标准字体";
}
/* .ql-snow .-font .ql-picker-label[data-value="serif"]::before,
.ql-snow .-font .ql-picker-item[data-value="serif"]::before {
content: "衬线字体";
}
.ql-snow .-font .ql-picker-label[data-value="monospace"]::before,
.ql-snow .-font .ql-picker-item[data-value="monospace"]::before {
content: "等宽字体";
} */
/*
字体
*/
.ql-snow .-font {
width: 80px;
}
.ql-snow .-font .ql-picker-label[data-value="宋体"]::before,
.ql-snow .-font .ql-picker-item[data-value="宋体"]::before {
content: "宋体";
}
.ql-snow .-font .ql-picker-label[data-value="黑体"]::before,
.ql-snow .-font .ql-picker-item[data-value="黑体"]::before {
content: "黑体";
}
.ql-snow .-font .ql-picker-label[data-value="微软雅黑"]::before,
.ql-snow .-font .ql-picker-item[data-value="微软雅黑"]::before {
content: "微软雅黑";
}
.ql-snow .-font .ql-picker-label[data-value="楷体"]::before,
.ql-snow .-font .ql-picker-item[data-value="楷体"]::before {
content: "楷体";
}
.ql-snow .-font .ql-picker-label[data-value="仿宋"]::before,
.ql-snow .-font .ql-picker-item[data-value="仿宋"]::before {
content: "仿宋";
}
.ql-snow .-font .ql-picker-label[data-value="Arial"]::before,
.ql-snow .-font .ql-picker-item[data-value="Arial"]::before {
content: "Arial";
}
.ql-snow .-font .ql-picker-label[data-value="苹方"]::before,
.ql-snow .-font .ql-picker-item[data-value="苹方"]::before {
content: "苹方";
}
.ql-snow .-size .ql-picker-label[data-value="16px"]::before,
.ql-snow .-size .ql-picker-item[data-value="16px"]::before {
content: "16px";
}
.ql-snow .-size .ql-picker-label[data-value="18px"]::before,
.ql-snow .-size .ql-picker-item[data-value="18px"]::before {
content: "18px";
}
.ql-snow .-size .ql-picker-label[data-value="20px"]::before,
.ql-snow .-size .ql-picker-item[data-value="20px"]::before {
content: "20px";
}
.ql-snow .-size .ql-picker-label[data-value="22px"]::before,
.ql-snow .-size .ql-picker-item[data-value="22px"]::before {
content: "22px";
}
.ql-snow .-size .ql-picker-label[data-value="24px"]::before,
.ql-snow .-size .ql-picker-item[data-value="24px"]::before {
content: "24px";
}
.ql-snow .-size .ql-picker-label[data-value="36px"]::before,
.ql-snow .-size .ql-picker-item[data-value="36px"]::before {
content: "36px";
}
/* .ql-snow .-lineheight {
width: 70px;
}
.ql-snow .-lineheight .ql-picker-label::before {
content: "行高";
}
.ql-snow
.-lineheight
.ql-picker-item[data-value="initial"]::before {
content: "默认";
}
.ql-snow .-lineheight .ql-picker-item[data-value="10"]::before {
content: "10";
}
.ql-snow .-lineheight .ql-picker-item[data-value="25"]::before {
content: "25";
}
.ql-snow .-lineheight .ql-picker-item[data-value="1.75"]::before {
content: "1.75";
}
.ql-snow .-lineheight .ql-picker-item[data-value="2"]::before {
content: "2";
}
.ql-snow .-lineheight .ql-picker-item[data-value="3"]::before {
content: "3";
}
.ql-snow .-lineheight .ql-picker-item[data-value="4"]::before {
content: "4";
}
.ql-snow .-lineheight .ql-picker-item[data-value="5"]::before {
content: "5";
} */
</style>