Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 394|回复: 0

vue-quill-editor 封装成组件;图片文件流上传;同一页面多个编辑器样式异常解决办法

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-4-29 23:05:45 | 显示全部楼层 |阅读模式

     

     

    使用方法:

      引入并注册组件,然后直接使用;

        @getcode是同步获取编辑器内容的;:contentDefault是编辑器的默认内容;

      注意:如果同一个页面多个编辑器,参数id不能相同,否则只有第一个编辑器有样式;

     

    封装组件:

      工具栏可以自己添加配置,看自己项目需求

    <template>
      <div class="quill_box">
        <quill-editor
          v-model="content"
          ref="myTextEditor"
          :options="editorOption"
          @blur="onEditorBlur($event)"
          @focus="onEditorFocus($event)"
          @change="onEditorChange($event)"
        >
          <div :id="id" slot="toolbar">
            <select class="ql-size">
              <option value="small"></option>
              <option selected>常规</option>
              <option value="large"></option>
              <option value="huge">特大</option>
            </select>
            <!-- Add subscript and superscript buttons -->
            <span class="ql-formats">
              <button type="button" class="ql-bold"></button>
            </span>
            <span class="ql-formats">
              <select class="ql-color">
                <option selected="selected"></option>
                <option value="#e60000"></option>
                <option value="#ff9900"></option>
                <option value="#ffff00"></option>
                <option value="#008a00"></option>
                <option value="#0066cc"></option>
                <option value="#9933ff"></option>
                <option value="#ffffff"></option>
                <option value="#facccc"></option>
                <option value="#ffebcc"></option>
                <option value="#ffffcc"></option>
                <option value="#cce8cc"></option>
                <option value="#cce0f5"></option>
                <option value="#ebd6ff"></option>
                <option value="#bbbbbb"></option>
                <option value="#f06666"></option>
                <option value="#ffc266"></option>
                <option value="#ffff66"></option>
                <option value="#66b966"></option>
                <option value="#66a3e0"></option>
                <option value="#c285ff"></option>
                <option value="#888888"></option>
                <option value="#a10000"></option>
                <option value="#b26b00"></option>
                <option value="#b2b200"></option>
                <option value="#006100"></option>
                <option value="#0047b2"></option>
                <option value="#6b24b2"></option>
                <option value="#444444"></option>
                <option value="#5c0000"></option>
                <option value="#663d00"></option>
                <option value="#666600"></option>
                <option value="#003700"></option>
                <option value="#002966"></option>
                <option value="#3d1466"></option>
              </select>
            </span>
            <span class="ql-formats">
              <select class="ql-background">
                <option value="#000000"></option>
                <option value="#e60000"></option>
                <option value="#ff9900"></option>
                <option value="#ffff00"></option>
                <option value="#008a00"></option>
                <option value="#0066cc"></option>
                <option value="#9933ff"></option>
                <option selected="selected"></option>
                <option value="#facccc"></option>
                <option value="#ffebcc"></option>
                <option value="#ffffcc"></option>
                <option value="#cce8cc"></option>
                <option value="#cce0f5"></option>
                <option value="#ebd6ff"></option>
                <option value="#bbbbbb"></option>
                <option value="#f06666"></option>
                <option value="#ffc266"></option>
                <option value="#ffff66"></option>
                <option value="#66b966"></option>
                <option value="#66a3e0"></option>
                <option value="#c285ff"></option>
                <option value="#888888"></option>
                <option value="#a10000"></option>
                <option value="#b26b00"></option>
                <option value="#b2b200"></option>
                <option value="#006100"></option>
                <option value="#0047b2"></option>
                <option value="#6b24b2"></option>
                <option value="#444444"></option>
                <option value="#5c0000"></option>
                <option value="#663d00"></option>
                <option value="#666600"></option>
                <option value="#003700"></option>
                <option value="#002966"></option>
                <option value="#3d1466"></option>
              </select>
            </span>
            <span class="ql-formats">
              <button type="button" class="ql-italic"></button>
            </span>
            <span class="ql-formats">
              <button type="button" class="ql-underline"></button>
            </span>
            <span class="ql-formats">
              <button type="button" class="ql-strike"></button>
            </span>
            <span class="ql-formats">
              <button type="button" class="ql-blockquote"></button>
            </span>
            <span class="ql-formats">
              <button type="button" class="ql-list" value="ordered"></button>
            </span>
            <span class="ql-formats">
              <button type="button" class="ql-list" value="bullet"></button>
            </span>
            <span class="ql-formats">
              <button type="button" class="ql-link"></button>
            </span>
            <span class="ql-formats">
              <button type="button" @click="imgClick" style="outline:none">
                <svg viewBox="0 0 18 18">
                  <rect class="ql-stroke" height="10" width="12" x="3" y="4" />
                  <circle class="ql-fill" cx="6" cy="7" r="1" />
                  <polyline class="ql-even ql-fill" points="5 12 5 11 7 9 8 10 11 7 13 9 13 12 5 12" />
                </svg>
              </button>
            </span>
          </div>
        </quill-editor>
      </div>
    </template> 
    <script>
    import Vue from "vue";
    import { imgUpload } from "../../http/api";
    
    // 富文本编辑器
    import VueQuillEditor from "vue-quill-editor";
    // require styles 引入样式
    import "quill/dist/quill.core.css";
    import "quill/dist/quill.snow.css";
    import "quill/dist/quill.bubble.css";
    Vue.use(VueQuillEditor);
    
    export default {
      data() {
        let _this = this;
        return {
          content: "",
          editorOption: {
            placeholder: "请在此处编辑富文本",
            modules: {
              toolbar: '#'+_this.id
            }
          }
        };
      },
      computed: {
        editor() {
          return this.$refs.myTextEditor.quill;
        }
      },
      props: {
        id:'',
        //默认内容
        contentDefault: {
          type: String,
          default: ""
        },
        /*上传图片的地址*/
        uploadUrl: {
          type: String,
          default: "/"
        },
        /*上传图片的file控件name*/
        fileName: {
          type: String,
          default: "file"
        }
      },
      watch: {
        contentDefault: function() {
          this.content = this.contentDefault;
        }
      },
      mounted: function() {
        this.content = this.contentDefault;
      },
      methods: {
        onEditorBlur() {
          //失去焦点事件
          // console.log('失去焦点');
        },
        onEditorFocus() {
          //获得焦点事件
          // console.log('获得焦点事件');
        },
        onEditorChange() {
          //内容改变事件
          // console.log('内容改变事件');
          this.$emit("getcode", this.content);
        },
    
        /*点击上传图片按钮*/
        imgClick() {
          // if (this.uploadUrl=='/') {
          //   console.log('no editor uploadUrl');
          //   return;
          // };
          /*内存创建input file*/
          var input = document.createElement("input");
          input.type = "file";
          input.name = this.fileName;
          input.accept = "image/jpeg,image/png,image/jpg,image/gif";
          input.onchange = this.onFileChange;
          input.click();
        },
        /*选择上传图片切换*/
        onFileChange(e) {
          var fileInput = e.target;
          if (fileInput.files.length === 0) {
            return;
          }
          this.editor.focus();
          if (fileInput.files[0].size > 1024 * 1024 * 2) {
            this.$message.error("图片不能大于2M", "图片尺寸过大");
          }
          this.uploadFilePic(fileInput.files[0]);
        },
        // 上传图片到服务器
        uploadFilePic: function(imgSource) {
          console.log(imgSource);
    
          let formData = new FormData();
          formData.append("imageFile", imgSource);
          console.log(formData);
    
          imgUpload(formData)
            .then(res => {
              console.log(res);
              // 获取光标所在位置
                let length = this.editor.getSelection().index;
                this.editor.insertEmbed(length, 'image',res.response.fileUrl);
                // 调整光标到最后
                this.editor.setSelection(length + 1)
            })
            .catch(err => {
              console.log(err);
            });
        }
      }
    };
    </script> 
    
    <style lang="less">
    .quill_box {
      select{outline: none;}
      .ql-toolbar.ql-snow {
        border-color: #dcdfe6;
      }
      .ql-container {
        height: 200px !important;
        border-color: #dcdfe6;
      }
      .ql-snow .ql-color-picker .ql-picker-label svg,
      .ql-snow .ql-icon-picker .ql-picker-label svg {
        position: relative;
        top: -6px;
      }
      .ql-color{padding-top:3px;}
      .ql-background{padding-top:2px;}
      .ql-size{height:30px;line-height:30px;}
    
    }
    </style>

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-19 05:57 , Processed in 0.090671 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表