Vue使用富文本编辑器Vue-Quill-Editor(含图片自定义上传服务、清除复制粘贴样式等)


Posted in Javascript onMay 15, 2020

使用教程(注意细看总结部分,写了几点,希望有所帮助):
1、安装插件:npm install vue-quill-editor
2、安装插件依赖:npm install quill
3、main.js文件中引入:

import Vue from 'vue'
import VueQuillEditor from 'vue-quill-editor'

import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'

Vue.use(VueQuillEditor)
new Vue({
 VueQuillEditor,
 render: h => h(App),
}).$mount('#app')

4、vue页面中使用(代码完整,复制就能使用):

<template>
 <div id="quillEditorId">
  <el-upload
   class="avatarUploader"
   action="https://jsonplaceholder.typicode.com/posts/"
   :show-file-list="false"
   :on-success="handleAvatarSuccess"
   :before-upload="beforeAvatarUpload"
  >
   <img v-if="imageUrl" :src="imageUrl" class="avatar" />
   <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  </el-upload>
  <quill-editor
   id="myQuillEditorId"
   ref="myQuillEditor"
   v-model="ruleForm.editeContent"
   :options="editorOption"
   @change="handelEditorChange($event)"
  >
  </quill-editor>
 </div>
</template>
<script>
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' }], //文本方向
 [{ size: ['small', false, 'large', 'huge'] }], //字体大小
 [{ header: [1, 2, 3, 4, 5, 6, false] }], //几级标题
 [{ color: [] }, { background: [] }], //字体颜色,字体背景颜色
 [{ font: [] }], //字体
 [{ align: [] }], //对齐方式
 ['clean'], //清除字体样式
 ['image'], //上传图片、上传视频(video)、超链接(link)
]
export default {
 data() {
  return {
   imageUrl: '',
   editeContent: '',
   editorOption: {
    modules: {
     clipboard: {
      // 粘贴版,处理粘贴时候的自带样式
      matchers: [[Node.ELEMENT_NODE, this.HandleCustomMatcher]],
     },
     toolbar: {
      container: toolbarOptions, // 工具栏
      handlers: {
       image: function(value) {
        if (value) {
         // 获取隐藏的上传图片的class,不一定是.el-icon-plus。触发上传图片事件
         document.querySelector('.el-icon-plus').click()
        } else {
         this.quill.format('image', false)
        }
       },
      },
     },
    },
    placeholder: '',
   },
  }
 },
 computed: {},
 async mounted() {},
 methods: {
  handleAvatarSuccess(res, file) {
   // 图片上传成功后的回调
   console.log(res, file)
  },
  beforeAvatarUpload(data) {
   // 思路:上传图片至服务后,拿到返回的图片地址。直接创建image标签插入光标所在的位置
   // 图片上传服务(本地服务或者阿里云服务)
   // 获取富文本组件实例
   let quill = this.$refs.myQuillEditor.quill
   // 上传服务成功后,按根据光标位置把图片插入编辑器中
   if (data.url) {
    // 获取光标所在位置,data.url表示上传服务后返回的图片地址
    let length = quill.getSelection().index
    // 插入图片,data.url为服务返回的图片链接地址
    quill.insertEmbed(length, 'image', data.url)
    // 调整光标到最后
    quill.setSelection(length + 1)
   } else {
    this.$message.closeAll()
    this.$message.error('图片插入失败')
   }
  },
  handelEditorChange(el) {
   console.log(el, 'el')
  },
  HandleCustomMatcher(node, Delta) {
   // 文字、图片等,从别处复制而来,清除自带样式,转为纯文本
   let ops = []
   Delta.ops.forEach(op => {
    if (op.insert && typeof op.insert === 'string') {
     ops.push({
      insert: op.insert,
     })
    }
   })
   Delta.ops = ops
   return Delta
  },
 },
}
</script>
<style scoped lang="scss">
#quillEditorId {
 .avatarUploader {
  display: none; // 隐藏上传图片组件
 }
}
</style>

总结:

1、变量toolbarOptions表示自定义的工具栏,可以参照官网(官网写的比较简单)或者细看本文代码(有详细注释);
2、如果不单独处理图片,图片会被直接转义成base64,跟随DOM一块儿上传服务;
3、本文对图片做了自定义处理,选择本地图片时,会单独上传到服务,返回地址后,直接插入到富文本编辑中的当前节点。看代码中editorOption的handlers的image函数,以及插入富文本编辑器当前光标函数beforeAvatarUpload,代码中有详细注释;
4、粘贴板,变量clipboard。如果需要清理复制的自带样式,使用粘贴板进行清理,函数HandleCustomMatcher;
5、对于复制粘贴的情况,多说一句。过程中,编辑器已经将原有的DOM转为编辑器允许存在的DOM元素,所以这块儿不用再处理(处理起来,也会有点复杂)。

到此这篇关于Vue使用富文本编辑器Vue-Quill-Editor(含图片自定义上传服务、清除复制粘贴样式等)的文章就介绍到这了,更多相关vue富文本编辑器Vue-Quill-Editor内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
优化Node.js Web应用运行速度的10个技巧
Sep 03 Javascript
jQuery制作简洁的多级联动Select下拉框
Dec 23 Javascript
分享十五款 jQuery 社交网络分享插件
May 16 Javascript
使用JavaScript实现连续滚动字幕效果的方法
Jul 07 Javascript
js字符串截取函数slice、substring和substr的比较
May 17 Javascript
JavaScript之WebSocket技术详解
Nov 18 Javascript
AngularJS中重新加载当前路由页面的方法
Mar 09 Javascript
vuejs实现折叠面板展开收缩动画效果
Sep 06 Javascript
详解Vue.js 响应接口
Jul 04 Javascript
JS使用setInterval计时器实现挑战10秒
Nov 08 Javascript
vue 基于abstract 路由模式 实现页面内嵌的示例代码
Dec 14 Vue.js
vue递归实现树形组件
Jul 15 Vue.js
用Angular实现一个扫雷的游戏示例
May 15 #Javascript
Node.js API详解之 dns模块用法实例分析
May 15 #Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
May 15 #Javascript
js实现简单贪吃蛇游戏
May 15 #Javascript
Javascript执行流程细节原理解析
May 14 #Javascript
使用npm命令提示: 'npm' 不是内部或外部命令,也不是可运行的程序的处理方法
May 14 #Javascript
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
May 14 #Javascript
You might like
PHP中你应该知道的require()文件包含的正确用法
2015/06/12 PHP
php进行ip地址掩码运算处理的方法
2016/07/11 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
JavaScript 创建对象和构造类实现代码
2009/07/30 Javascript
禁止选中文字兼容IE、Chrome、FF等
2013/09/04 Javascript
用Jquery.load载入页面实现局部刷新
2014/01/22 Javascript
jQuery中get()方法用法实例
2014/12/27 Javascript
Bootstrap在线电子商务网站实战项目5
2016/10/14 Javascript
JS 实现百度搜索功能
2018/02/01 Javascript
Vue隐藏显示、只读实例代码
2018/07/18 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
Vue+ElementUI table实现表格分页
2019/12/14 Javascript
实例讲解Python设计模式编程之工厂方法模式的使用
2016/03/02 Python
Django框架教程之正则表达式URL误区详解
2018/01/28 Python
Django实现表单验证
2018/09/08 Python
Python中分支语句与循环语句实例详解
2018/09/13 Python
Django实现单用户登录的方法示例
2019/03/28 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
2019/05/06 Python
pytorch 输出中间层特征的实例
2019/08/17 Python
详解python中的生成器、迭代器、闭包、装饰器
2019/08/22 Python
python flask搭建web应用教程
2019/11/19 Python
Python pandas自定义函数的使用方法示例
2019/11/20 Python
Python实现播放和录制声音的功能
2020/08/12 Python
Scrapy中如何向Spider传入参数的方法实现
2020/09/28 Python
python集合的新增元素方法整理
2020/12/07 Python
纯HTML5+CSS3制作图片旋转
2016/01/12 HTML / CSS
HTML5之SVG 2D入门5—颜色的表示及定义方式
2013/01/30 HTML / CSS
HTML5 Canvas实现平移/放缩/旋转deom示例(附截图)
2013/07/04 HTML / CSS
阿迪达斯英国官方网站:adidas英国
2019/08/13 全球购物
莱德杯高尔夫欧洲官方商店:Ryder Cup Shop
2019/08/14 全球购物
师范生个人推荐信
2013/11/29 职场文书
机关门卫岗位职责
2013/12/30 职场文书
30年同学聚会邀请函
2014/01/25 职场文书
高校师德师风自我剖析材料
2014/09/29 职场文书
2015年六一儿童节活动总结
2015/02/11 职场文书
2016父亲节感恩话语
2015/12/09 职场文书