You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

239 lines
8.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

以下是为您的代码添加详细注释后的版本
<template>
<div>
<!-- 图片上传组件辅助 -->
<el-upload
class="avatar-uploader"
:action="getActionUrl" <!-- -->
name="file" <!-- 文件字段名 -->
:headers="header" <!-- 请求头 -->
:show-file-list="false" <!-- 不显示已上传文件列表 -->
:on-success="uploadSuccess" <!-- 上传成功回调 -->
:on-error="uploadError" <!-- 上传失败回调 -->
:before-upload="beforeUpload" <!-- 上传前回调 -->
>
<!-- 隐藏的文件输入框 -->
<input type="file" style="display:none;">
</el-upload>
<!-- 富文本编辑器 -->
<quill-editor
class="editor"
v-model="value" <!-- -->
ref="myQuillEditor" <!-- 引用编辑器实例 -->
:options="editorOption" <!-- 编辑器配置 -->
@blur="onEditorBlur($event)" <!-- 失去焦点事件 -->
@focus="onEditorFocus($event)" <!-- 获得焦点事件 -->
@change="onEditorChange($event)" <!-- 内容改变事件 -->
></quill-editor>
</div>
</template>
<!-- 工具栏配置 -->
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"], // 清除文本格式
["link", "image", "video"] // 链接、图片、视频
];
import { quillEditor } from "vue-quill-editor";
import "quill/dist/quill.core.css"; // 富文本核心样式
import "quill/dist/quill.snow.css"; // 富文本雪地主题样式
import "quill/dist/quill.bubble.css"; // 富文本气泡主题样式
export default {
props: {
/* 编辑器的内容 */
value: {
type: String
},
action: {
type: String
},
/* 图片大小限制 */
maxSize: {
type: Number,
default: 4000 // kb
}
},
components: {
quillEditor
},
data() {
return {
content: this.value, // 当前编辑器内容
quillUpdateImg: false, // 是否显示加载动画
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);
}
}
// link: function(value) {
// if (value) {
// var href = prompt('请输入url');
// this.quill.format("link", href);
// } else {
// this.quill.format("link", false);
// }
// },
}
}
}
},
header: {
'Token': this.$storage.get("Token") // 请求头中的 Token
}
};
},
computed: {
// 动态计算上传接口 URL
getActionUrl: function() {
return `/${this.$base.name}/` + this.action;
}
},
methods: {
onEditorBlur() {
// 失去焦点事件
},
onEditorFocus() {
// 获得焦点事件
},
onEditorChange() {
console.log(this.value);
// 内容改变事件
this.$emit("input", this.value);
},
// 富文本图片上传前
beforeUpload(file) {
// 显示加载动画
this.quillUpdateImg = true;
const isLtMaxSize = file.size / 1024 < this.maxSize; // 检查文件大小是否超过限制
if (!isLtMaxSize) {
this.$message.error(`上传图片大小不能超过 ${this.maxSize} KB!`);
}
return isLtMaxSize;
},
uploadSuccess(res, file) {
// 上传成功回调
let quill = this.$refs.myQuillEditor.quill; // 获取富文本实例
if (res.code === 0) {
let length = quill.getSelection().index; // 获取光标位置
quill.insertEmbed(length, "image", this.$base.url + "upload/" + res.file); // 插入图片
quill.setSelection(length + 1); // 移动光标
} else {
this.$message.error("图片插入失败");
}
this.quillUpdateImg = false; // 隐藏加载动画
},
uploadError() {
// 上传失败回调
this.quillUpdateImg = false; // 隐藏加载动画
this.$message.error("图片插入失败");
}
}
};
/* 样式部分 */
<style>
.editor {
line-height: normal !important; /* 设置行高 */
}
.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-container {
height: 400px; /* 设置富文本高度 */
}
.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"; /* 设置标题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"; /* 设置标题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"; /* 设置标题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"; /* 设置标题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"; /* 设置标题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"; /* 设置标题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>