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 相关文章推荐
javaScript Array(数组)相关方法简述
Jul 25 Javascript
给应用部分的js代码设定一个统一的入口
Jun 15 Javascript
jQuery仿天猫实现超炫的加入购物车
May 04 Javascript
jquery使用ul模拟select实现表单美化的方法
Aug 18 Javascript
JavaScript:Date类型全面解析
May 19 Javascript
JavaScript Ajax编程 应用篇
Jul 02 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
Mar 22 Javascript
微信小程序 navbar实例详解
May 11 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
Mar 26 Javascript
vue项目使用.env文件配置全局环境变量的方法
Oct 24 Javascript
Openlayers显示地理位置坐标的方法
Sep 28 Javascript
jQuery实现二级导航菜单的示例
Sep 30 jQuery
用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 远程关机实现代码
2009/11/10 PHP
用Simple Excel导出xls实现方法
2012/12/06 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
php使用Jpgraph创建折线图效果示例
2017/02/15 PHP
远离JS灾难css灾难之 js私有函数和css选择器作为容器
2011/12/11 Javascript
jquery load事件(callback/data)使用方法及注意事项
2013/02/06 Javascript
解析Javascript中难以理解的11个问题
2013/12/09 Javascript
jquery获取tr并更改tr内容示例代码
2014/02/13 Javascript
jQuery设置与获取HTML,文本和值的简单实例
2014/02/26 Javascript
JS获取网页图片name属性的方法
2015/04/01 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
NodeJS远程代码执行
2016/08/28 NodeJs
详解js树形控件—zTree使用总结
2016/12/28 Javascript
详解.vue文件解析的实现
2018/06/11 Javascript
javascript系统时间设置操作示例
2019/06/17 Javascript
Node.js学习教程之Module模块
2019/09/03 Javascript
jQuery鼠标滑过横向时间轴样式(代码详解)
2019/11/01 jQuery
vue组件创建的三种方式小结
2020/02/03 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
Vue proxyTable配置多个接口地址,解决跨域的问题
2020/09/11 Javascript
python访问mysql数据库的实现方法(2则示例)
2016/01/06 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
2017/11/23 Python
python文件写入write()的操作
2019/05/14 Python
如何安装并使用conda指令管理python环境
2019/07/10 Python
python操作cfg配置文件方式
2019/12/22 Python
Python 列表的清空方式
2020/01/13 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
Python爬虫实现自动登录、签到功能的代码
2020/08/20 Python
Python爬取微信小程序Charles实现过程图解
2020/09/29 Python
一级方程式赛车官方网上商店:F1 Store(支持中文)
2018/01/12 全球购物
维氏瑞士军刀英国网站:Victorinox英国
2019/07/04 全球购物
在职研究生自我鉴定
2013/10/16 职场文书
公司新人试用期自我评价
2014/09/17 职场文书
公司管理制度范本
2015/08/03 职场文书
mybatis-plus模糊查询指定字段
2022/04/28 Java/Android
Python实现将多张图片合成MP4视频并加入背景音乐
2022/04/28 Python