<template>  <div class="contentBox">       <!-- 图片上传组件辅助-->    <!-- 留神quill默认的图片上传办法限度图片大小,几兆的图片间接报错,    所以采纳elementUI的图片上传组件将图片先上传到本地,再赋值到Qill-Editor的图片上传函数中-->    <el-upload      class="uploaders"      multiple      :limit="5"      :action="serverUrl"      :headers="header"      :data="data"      :on-success="uploadSuccess"      :on-error="uploadError"      :before-upload="beforeUpload"    >    </el-upload>    <quill-editor      v-model="content"      ref="myQuillEditor"      :options="editorOption"      @change="onEditorChange($event)"      class="ql-snow ql-editor"    ></quill-editor>    <el-button :plain="true" class="warning" @click="warningFn" style="display:none"></el-button>  </div></template><script>import Quill from "quill";let fontSizeStyle = Quill.import("attributors/style/size");fontSizeStyle.whitelist = [  "18px",  "20px",  "22px",  "24px",  "26px",  "28px",  "30px",  "32px"];Quill.register(fontSizeStyle, true);const toolbarOptions = [  ["bold", "italic", "underline"],  [{ header: 1 }, { header: 2 }],  [{ list: "ordered" }, { list: "bullet" }],  [{ indent: "-1" }, { indent: "+1" }],  [{ direction: "rtl" }],  [{ size: fontSizeStyle.whitelist }],  [{ header: [1, 2, 3, 4, 5, 6, false] }],  [{ color: [] }],  [{ font: [] }],  [{ align: [] }],  ["link", "image"] ] export default {    props: {        editorValue: {            type: [Number, Object, Array, String],            default: ''        }    },  data() {   return {    quillUpdateImg: false, // 依据图片上传状态来确定是否显示loading动画,刚开始是false,不显示    content: null,    editorOption: {     placeholder: '',     theme: 'snow', // or 'bubble'     modules: {      toolbar: {       container: toolbarOptions,       handlers: {        'image': function (value) {         if (value) {          // 触发upload抉择图片文件          document.querySelector('.uploaders input').click()         } else {          // formate('name',value) 这里是设置图片为空          this.quill.format('image', false);         }        }       }      }     }    },    serverUrl: window.location.origin  + "/sys/base/file/upload", // 这里写你要上传的图片服务器地址     header: {  //这里是把图片上传到你我的项目服务器时的申请头配置        Authorization: 'bearer ' + this.$auth.getToken(),        TenantKey: '2715972430958149632'    },    data: { //这里是把图片上传到你我的项目服务器时的申请参数配置          type: 4    }   }  },  mounted(){   this.content= this.editorValue  },  watch:{    editorValue:{           handler(newVal){        this.content = newVal      },       immediate: true,    },    content:{      handler(newVal){        this.$emit('getSonContent', newVal)      },       immediate: true,    }  },  methods: {   onEditorChange({html, text}) {//内容扭转事件     if(text.length>1001){          document.querySelector('.warning').click()    }else{      this.content = html    }      },   // 富文本图片上传前   beforeUpload() {    // 显示loading动画    this.quillUpdateImg = true   },     uploadSuccess(res) {    // res为图片服务器返回的数据    // 获取富文本组件实例    let quill = this.$refs.myQuillEditor.quill    // 如果上传胜利    if (res.resultCode == 200 ) {     // 获取光标所在位置     let length = quill.getSelection().index;     // 插入图片 res.url为服务器返回的图片地址     quill.insertEmbed(length, 'image', res.resultData.fileUrl)     // 调整光标到最初      quill.setSelection(length + 1)    } else {     this.$message.error('图片上传失败')    }    // loading动画隐没    this.quillUpdateImg = false   },   // 富文本图片上传失败   uploadError() {    // loading动画隐没    this.quillUpdateImg = false    this.$message.error('图片插入失败')   },   warningFn(){     this.$message.error('字符个数不能超过1000');   }  } }</script><style lang="scss" >.required{    // content: '*';    color: red;    font-size: 12px;    height: 12px;}  .uploaders{    display: none;  }  .ql-container.ql-snow {      line-height: normal !important;      height: 250px !important;      font-size: 14px;    } .ql-snow {      .ql-tooltip[data-mode="link"]::before {        content: "请输出链接地址:";      }      .ql-tooltip.ql-editing a.ql-action::after {        border-right: 0px;        content: "保留";        padding-right: 0px;      }      .ql-tooltip[data-mode="video"]::before {        content: "请输出视频地址:";      }      .ql-picker.ql-size {        .ql-picker-label[data-value="12px"]::before,        .ql-picker-item[data-value="12px"]::before {          content: "12px";        }        .ql-picker-label[data-value="14px"]::before,        .ql-picker-item[data-value="14px"]::before {          content: "14px";        }        .ql-picker-label[data-value="16px"]::before,        .ql-picker-item[data-value="16px"]::before {          content: "16px";        }        .ql-picker-label[data-value="18px"]::before,        .ql-picker-item[data-value="18px"]::before {          content: "18px";        }        .ql-picker-label[data-value="20px"]::before,        .ql-picker-item[data-value="20px"]::before {          content: "20px";        }        .ql-picker-label[data-value="22px"]::before,        .ql-picker-item[data-value="22px"]::before {          content: "22px";        }        .ql-picker-label[data-value="24px"]::before,        .ql-picker-item[data-value="24px"]::before {          content: "24px";        }        .ql-picker-label[data-value="26px"]::before,        .ql-picker-item[data-value="26px"]::before {          content: "26px";        }        .ql-picker-label[data-value="28px"]::before,        .ql-picker-item[data-value="28px"]::before {          content: "28px";        }        .ql-picker-label[data-value="30px"]::before,        .ql-picker-item[data-value="30px"]::before {          content: "30px";        }        .ql-picker-label[data-value="32px"]::before,        .ql-picker-item[data-value="32px"]::before {          content: "32px";        }        .ql-picker-label[data-value="34px"]::before,        .ql-picker-item[data-value="34px"]::before {          content: "34px";        }        .ql-picker-label[data-value="36px"]::before,        .ql-picker-item[data-value="36px"]::before {          content: "36px";        }      }      .ql-picker.ql-header {        .ql-picker-label::before,        .ql-picker-item::before {          content: "文本";        }        .ql-picker-label[data-value="1"]::before,        .ql-picker-item[data-value="1"]::before {          content: "题目1";        }        .ql-picker-label[data-value="2"]::before,        .ql-picker-item[data-value="2"]::before {          content: "题目2";        }        .ql-picker-label[data-value="3"]::before,        .ql-picker-item[data-value="3"]::before {          content: "题目3";        }        .ql-picker-label[data-value="4"]::before,        .ql-picker-item[data-value="4"]::before {          content: "题目4";        }        .ql-picker-label[data-value="5"]::before,        .ql-picker-item[data-value="5"]::before {          content: "题目5";        }        .ql-picker-label[data-value="6"]::before,        .ql-picker-item[data-value="6"]::before {          content: "题目6";        }         .ql-picker-label[data-value="7"]::before,        .ql-picker-item[data-value="7"]::before {          content: "题目7";        }      }      .ql-picker.ql-font {        .ql-picker-label[data-value="SimSun"]::before,        .ql-picker-item[data-value="SimSun"]::before {          content: "宋体";          font-family: "SimSun" !important;        }        .ql-picker-label[data-value="SimHei"]::before,        .ql-picker-item[data-value="SimHei"]::before {          content: "黑体";          font-family: "SimHei";        }        .ql-picker-label[data-value="Microsoft-YaHei"]::before,        .ql-picker-item[data-value="Microsoft-YaHei"]::before {          content: "微软雅黑";          font-family: "Microsoft YaHei";        }        .ql-picker-label[data-value="KaiTi"]::before,        .ql-picker-item[data-value="KaiTi"]::before {          content: "楷体";          font-family: "KaiTi" !important;        }        .ql-picker-label[data-value="FangSong"]::before,        .ql-picker-item[data-value="FangSong"]::before {          content: "仿宋";          font-family: "FangSong";        }      }    }</style>