1.安装vue-quill-editor

npm install vue-quill-editor --save

2.main.js全局引用

import VueQuillEditor from 'vue-quill-editor'
//一定要引入这三个css,不然文本编辑器会出现不规则黑白几何图形
//这三个css可以在main.js中引入,也可以在具体使用的.vue文件中引入,建议在main.js中引用。因为在添加quill-image-resize时发现在组件中引用报错,暂时没有发现问题出现在哪里
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'
Vue.use(VueQuillEditor)

  3.二次封装vue-quill-editor(v-model双向绑定)

<template>
  <quill-editor
    :id="randomId(3)"
    v-model="content"
    :ref="editorRef"
    :options="editorOption"
    @focus="onEditorFocus($event)"
    @blur="onEditorBlur($event)"
    @change="onEditorChange($event)"
    class="editor"
  />
</template>
<script>
import { Quill } from 'vue-quill-editor'
const toolbarOptions = [
  ['bold', 'italic', 'underline', 'strike'], //加粗,斜体,下划线,删除线
  ['blockquote', 'code-block'], //引用,代码块
  [{ header: 1 }, { header: 2 }], // 标题,键值对的形式;1、2表示字体大小
  [{ list: 'ordered' }, { list: 'bullet' }], //列表
  [{ script: 'sub' }, { script: 'super' }], // 上下标
  [{ indent: '-1' }, { indent: '+1' }], // 缩进
  [{ direction: 'rtl' }], // 文本方向
  [{ header: [1, 2, 3, 4, 5, 6, false] }], //几级标题
  [{ color: [] }, { background: [] }], // 字体颜色,字体背景颜色
  [{ font: [] }], //字体
  [{ align: [] }], //对齐方式
  ['clean'], //清除字体样式
  ['image', 'video'] //上传图片、上传视频
]

export default {
  name: 'TestQuillEditor',
  props: {
    // 编辑器的内容
    editorContent: {
      type: String,
      required: true
    },
    editorRef: {
      type: String,
      required: true
    }
  },
  data() {
    return {
      content: this.editorContent,
      editorOption: {
        theme: 'snow',
        modules: {
          toolbar: toolbarOptions,
          //   handlers: {
          //     image: function(value) {
          //       if (value) {
          //         // 调用iview图片上传
          //         console.log(123)
          //         document.querySelector('.ivu-upload .ivu-btn').click()
          //       } else {
          //         this.quill.format('image', false)
          //       }
          //     }
          //   }
        }
      }
    }
  },
  computed: {
    //当前富文本实例
    editor() {
      return this.$refs.editorRef.quillEditor
    }
  },
  watch: {
    editorContent() {
      this.content = this.editorContent
    }
  },
  methods: {
    randomId(len) {
      var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
      var tempLen = chars.length,
        tempStr = ''
      for (var i = 0; i < len; ++i) {
        tempStr += chars.charAt(Math.floor(Math.random() * tempLen))
      }
      return tempStr
    },
    // 准备富文本编辑器
    onEditorReady() {},
    // 富文本编辑器 失去焦点事件
    onEditorBlur() {},
    // 富文本编辑器 获得焦点事件
    onEditorFocus() {},
    // 富文本编辑器 内容改变事件
    onEditorChange({ html }) {
      //内容改变事件
      // console.log('内容改变事件');
      this.$emit('input', this.content)
    }
  }
}
</script>

4.父组件引用

 <QuillEditor v-model="form.decript" :editorContent="form.decript"  editorRef="editorRef"/>

5.安装 quill-image-resize

npm install quill-image-resize-module -S

6.在子组件(封装的vue-quill-editor)中引用 quill-image-resize

import ImageResize from 'quill-image-resize-module'
Quill.register('modules/imageResize', ImageResize)


//在富文本配置对象中添加imageResize对象


editorOption: {
        theme: 'snow',
        modules: {
          toolbar: toolbarOptions,
          imageResize: {  //就是这个,配置图片缩放
            displayStyles: {
              backgroundColor: 'black',
              border: 'none',
              color: 'white'
            },
            modules: ['Resize', 'DisplaySize', 'Toolbar']
          }
        }
      }

7.运行后会发现操作,需要进行webpack配置

如果是vue-cli2.0版本

     在webpack.config.js中添加

const webpack = require('webpack')

new webpack.ProvidePlugin({
  'window.Quill': 'quill/dist/quill.js',
  'Quill': 'quill/dist/quill.js'
}),

 如果是3.0版本需要在vue.config修改(没有需要自己创建)

const webpack = require('webpack')

module.exports = {
  chainWebpack(config) {
    config.plugin('provide').use(webpack.ProvidePlugin, [{
      'window.Quill': 'quill/dist/quill.js',
      'Quill': 'quill/dist/quill.js'
    }])
    }
}

完成以上步骤就可以获得到下面的富文本框

 8.增加字号大小的工具栏(因为自带的只有大中小字体,所以需要自己添加)

   

   9. 创建一个size-set.css文件(随便放到哪里,记住路径就行)

.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='10px']::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='10px']::before {
    content: '10px';
  }
  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='12px']::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='12px']::before {
    content: '12px';
  }
  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='14px']::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='14px']::before {
    content: '14px';
  }
  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='16px']::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='16px']::before {
    content: '16px';
  }
  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='18px']::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='18px']::before {
    content: '18px';
  }
  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='20px']::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='20px']::before {
    content: '20px';
  }
  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='22px']::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='22px']::before {
    content: '22px';
  }
  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='24px']::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='24px']::before {
    content: '24px';
  }
  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='26px']::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='26px']::before {
    content: '26px';
  }
  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='28px']::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='28px']::before {
    content: '28px';
  }
  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='30px']::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='30px']::before {
    content: '30px';
  }
  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='32px']::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='32px']::before {
    content: '32px';
  }
  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='36px']::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='36px']::before {
    content: '36px';
  }
  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='38px']::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='38px']::before {
    content: '38px';
  }
  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='40px']::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='40px']::before {
    content: '40px';
  }
  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='45px']::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='45px']::before {
    content: '45px';
  }
  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='50px']::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='50px']::before {
    content: '50px';
  }
  /**设置默认字体显示
  **/
  .ql-container {
      font-size:16px;
  }

10.在子组件添加以下配置

import './size-set.css' //导入自己创建的css
let fontSizeStyle = Quill.import('attributors/style/size')
fontSizeStyle.whitelist = [
  '10px',
  '12px',
  '14px',
  '16px',
  '18px',
  '20px',
  '22px',
  '24px',
  '26px',
  '28px',
  '30px',
  '32px',
  '36px',
  '38px',
  '40px',
  '45px',
  '50px',
  false
]
Quill.register(fontSizeStyle, true)
const toolbarOptions = [
  ['bold', 'italic', 'underline', 'strike'], 
  ['blockquote', 'code-block'], 
  [{ size: fontSizeStyle.whitelist }], //重点是添加这个,其他的本来就有的
  [{ header: 1 }, { header: 2 }], 
  [{ list: 'ordered' }, { list: 'bullet' }],
  [{ script: 'sub' }, { script: 'super' }], 
  [{ indent: '-1' }, { indent: '+1' }], 
  [{ direction: 'rtl' }], 
  [{ header: [1, 2, 3, 4, 5, 6, false] }],
  [{ color: [] }, { background: [] }], 
  [{ font: [] }], 
  [{ align: [] }], 

  ['clean'], 
  ['image', 'video'] 
]

然后就OK啦

附上完整的封装源码

<template>
  <quill-editor
    :id="randomId(3)"
    v-model="content"
    :ref="editorRef"
    :options="editorOption"
    @focus="onEditorFocus($event)"
    @blur="onEditorBlur($event)"
    @change="onEditorChange($event)"
    class="editor"
  />
</template>
<script>
import VueQuillEditor, { Quill } from 'vue-quill-editor'
import ImageResize from 'quill-image-resize-module'
Quill.register('modules/imageResize', ImageResize)
import './size-set.css'
let fontSizeStyle = Quill.import('attributors/style/size')
fontSizeStyle.whitelist = [
  '10px',
  '12px',
  '14px',
  '16px',
  '18px',
  '20px',
  '22px',
  '24px',
  '26px',
  '28px',
  '30px',
  '32px',
  '36px',
  '38px',
  '40px',
  '45px',
  '50px',
  false
]
Quill.register(fontSizeStyle, true)
const toolbarOptions = [
  ['bold', 'italic', 'underline', 'strike'], //加粗,斜体,下划线,删除线
  ['blockquote', 'code-block'], //引用,代码块
  [{ size: fontSizeStyle.whitelist }],
  [{ header: 1 }, { header: 2 }], // 标题,键值对的形式;1、2表示字体大小
  [{ list: 'ordered' }, { list: 'bullet' }], //列表
  [{ script: 'sub' }, { script: 'super' }], // 上下标
  [{ indent: '-1' }, { indent: '+1' }], // 缩进
  [{ direction: 'rtl' }], // 文本方向
  [{ header: [1, 2, 3, 4, 5, 6, false] }], //几级标题
  [{ color: [] }, { background: [] }], // 字体颜色,字体背景颜色
  [{ font: [] }], //字体
  [{ align: [] }], //对齐方式

  ['clean'], //清除字体样式
  ['image', 'video'] //上传图片、上传视频
]

export default {
  name: 'TestQuillEditor',
  //   components: { quillEditor },
  props: {
    // 编辑器的内容
    editorContent: {
      type: String,
      required: true
    },
    editorRef: {
      type: String,
      required: true
    }
  },
  data() {
    return {
      content: this.editorContent,
      editorOption: {
        theme: 'snow',
        modules: {
          toolbar: toolbarOptions,
          imageResize: {
            displayStyles: {
              backgroundColor: 'black',
              border: 'none',
              color: 'white'
            },
            modules: ['Resize', 'DisplaySize', 'Toolbar']
          }
        }
      }
    }
  },
  computed: {
    //当前富文本实例
    editor() {
      return this.$refs.editorRef.quillEditor
    }
  },
  watch: {
    editorContent() {
      this.content = this.editorContent
    }
  },
  methods: {
    randomId(len) {
      var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
      var tempLen = chars.length,
        tempStr = ''
      for (var i = 0; i < len; ++i) {
        tempStr += chars.charAt(Math.floor(Math.random() * tempLen))
      }
      return tempStr
    },
    // 准备富文本编辑器
    onEditorReady() {},
    // 富文本编辑器 失去焦点事件
    onEditorBlur() {},
    // 富文本编辑器 获得焦点事件
    onEditorFocus() {},
    // 富文本编辑器 内容改变事件
    onEditorChange({ html }) {
      //内容改变事件
      // console.log('内容改变事件');
      this.$emit('input', this.content)
    }
  }
}
</script>
<style lang="scss" scoped>
.editor {
  // height: 400px;
}
</style>

时间问题,自定义上传图片还没有往上写,后面可能会加上

如果对你有帮助,点个赞吧

Logo

前往低代码交流专区

更多推荐