<template>
|
<view class="editor-container">
|
<div class="editor">
|
<!-- <QuillEditor v-model:content="content"-->
|
<!-- contentType="html"-->
|
<!-- @textChange="(e) => emit('update:modelValue', content)"-->
|
<!-- :options="options"-->
|
<!-- :style="styles" />-->
|
</div>
|
</view>
|
</template>
|
|
<script setup>
|
import { ref, computed, watch } from "vue";
|
// import { QuillEditor } from "@vueup/vue-quill";
|
import "@vueup/vue-quill/dist/vue-quill.snow.css";
|
import { getToken } from "@/utils/auth";
|
|
const props = defineProps({
|
/* 编辑器的内容 */
|
modelValue: {
|
type: String,
|
},
|
/* 高度 */
|
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",
|
},
|
});
|
|
const emit = defineEmits(["update:modelValue"]);
|
|
const styles = computed(() => {
|
let style = {};
|
if (props.minHeight) {
|
style.minHeight = `${props.minHeight}px`;
|
}
|
if (props.height) {
|
style.height = `${props.height}px`;
|
}
|
return style;
|
});
|
|
const content = ref("");
|
|
watch(
|
() => props.modelValue,
|
v => {
|
if (v !== content.value) {
|
content.value = v == undefined ? "<p></p>" : v;
|
}
|
},
|
{ immediate: true }
|
);
|
|
const options = {
|
theme: "snow",
|
bounds: document.body,
|
debug: "warn",
|
modules: {
|
// 工具栏配置
|
toolbar: [
|
[{ align: [] }], // 对齐方式
|
["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: [] }], // 字体颜色、字体背景颜色
|
["clean"], // 清除文本格式
|
["link", "image", "video"], // 链接、图片、视频
|
],
|
},
|
placeholder: "请输入内容",
|
readOnly: props.readOnly,
|
};
|
</script>
|
|
<style>
|
.editor-container {
|
width: 100%;
|
}
|
|
.editor-img-uploader {
|
display: none;
|
}
|
|
.editor {
|
width: 100%;
|
}
|
|
.quill-editor {
|
border: 1px solid #e8e8e8;
|
border-radius: 8px;
|
overflow: hidden;
|
}
|
|
/* Quill编辑器样式 */
|
:deep(.ql-toolbar.ql-snow) {
|
border-bottom: 1px solid #e8e8e8;
|
border-radius: 8px 8px 0 0;
|
padding: 8px 12px;
|
}
|
|
:deep(.ql-container.ql-snow) {
|
min-height: 300px;
|
border-radius: 0 0 8px 8px;
|
}
|
|
:deep(.ql-editor) {
|
min-height: 300px;
|
font-size: 14px;
|
line-height: 1.5;
|
padding: 12px;
|
}
|
|
/* 移动端适配 */
|
@media (max-width: 768px) {
|
:deep(.ql-toolbar.ql-snow) {
|
padding: 6px 8px;
|
}
|
|
:deep(.ql-editor) {
|
font-size: 13px;
|
padding: 10px;
|
}
|
}
|
|
/* 图片样式 */
|
:deep(.ql-editor img) {
|
max-width: 100%;
|
height: auto;
|
border-radius: 4px;
|
margin: 8px 0;
|
}
|
|
/* 工具栏按钮样式 */
|
:deep(.ql-toolbar.ql-snow .ql-button) {
|
height: 28px;
|
width: 28px;
|
padding: 4px;
|
}
|
|
:deep(.ql-toolbar.ql-snow .ql-picker-label) {
|
height: 28px;
|
padding: 4px 8px;
|
}
|
|
/* 提示框样式 */
|
:deep(.ql-snow .ql-tooltip[data-mode="link"])::before {
|
content: "请输入链接地址:";
|
}
|
|
:deep(.ql-snow .ql-tooltip.ql-editing a.ql-action)::after {
|
border-right: 0px;
|
content: "保存";
|
padding-right: 0px;
|
}
|
|
:deep(.ql-snow .ql-tooltip[data-mode="video"])::before {
|
content: "请输入视频地址:";
|
}
|
|
/* 字体大小选项 */
|
:deep(.ql-snow .ql-picker.ql-size .ql-picker-label)::before,
|
:deep(.ql-snow .ql-picker.ql-size .ql-picker-item)::before {
|
content: "14px";
|
}
|
|
:deep(.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="small"])::before,
|
:deep(.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="small"])::before {
|
content: "10px";
|
}
|
|
:deep(.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="large"])::before,
|
:deep(.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="large"])::before {
|
content: "18px";
|
}
|
|
:deep(.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="huge"])::before,
|
:deep(.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="huge"])::before {
|
content: "32px";
|
}
|
|
/* 标题选项 */
|
:deep(.ql-snow .ql-picker.ql-header .ql-picker-label)::before,
|
:deep(.ql-snow .ql-picker.ql-header .ql-picker-item)::before {
|
content: "文本";
|
}
|
|
:deep(.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"])::before,
|
:deep(.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"])::before {
|
content: "标题1";
|
}
|
|
:deep(.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"])::before,
|
:deep(.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"])::before {
|
content: "标题2";
|
}
|
|
:deep(.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"])::before,
|
:deep(.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"])::before {
|
content: "标题3";
|
}
|
|
:deep(.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"])::before,
|
:deep(.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"])::before {
|
content: "标题4";
|
}
|
|
:deep(.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"])::before,
|
:deep(.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"])::before {
|
content: "标题5";
|
}
|
|
:deep(.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"])::before,
|
:deep(.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"])::before {
|
content: "标题6";
|
}
|
|
/* 字体选项 */
|
:deep(.ql-snow .ql-picker.ql-font .ql-picker-label)::before,
|
:deep(.ql-snow .ql-picker.ql-font .ql-picker-item)::before {
|
content: "标准字体";
|
}
|
|
:deep(.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="serif"])::before,
|
:deep(.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="serif"])::before {
|
content: "衬线字体";
|
}
|
|
:deep(
|
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="monospace"]
|
)::before,
|
:deep(
|
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="monospace"]
|
)::before {
|
content: "等宽字体";
|
}
|
</style>
|