详解vue中使用vue-quill-editor富文本小结(图片上传)


Posted in Javascript onApril 24, 2019

vue-quill-editor是我们再使用vue框架的时候常用的一个富文本编辑器,在进行富文本编辑的时候,我们往往要插入一些图片,vue-quill-editor默认的处理方式是直接将图片转成base64编码,这样的结果是整个富文本的html片段十分冗余,通常来讲,每个服务器端接收的post的数据大小都是有限制的,这样的话有可能导致提交失败,或者是用户体验很差,数据要传递很久才全部传送到服务器。

1.下载Vue-Quill-Editor

npm install vue-quill-editor --save

2.下载quill(Vue-Quill-Editor需要依赖)

npm install quill --save

3.使用

import { quillEditor } from "vue-quill-editor"; //调用编辑器
import 'quill/dist/quill.core.css';
import 'quill/dist/quill.snow.css';
import 'quill/dist/quill.bubble.css';

本次使用到了富文本的封装和上传图片,因要求使用element-ui框架,我上传图片的时候选择了element-ui的Upload上传组件将图片上传到服务器。再将图片链接插入到富文本中,以达到最优的体验。

子组件中将改变的值,直接发送给父组件,父组件来完成逻辑处理

<template>
 <div>
  <el-upload      //直接隐藏掉就好了,用功能不用样式
   v-show="false"
   id="quill-upload"
   action="/api/product/upload.do"
   name="upload_file"
   multiple
   :limit="3"
   list-type="picture"
   :show-file-list="false"
   :before-upload="beforeUpload"
   :on-error="uploadError"
   :on-success="handleExceed">
   <el-button size="small" type="primary" ></el-button>
   <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
  </el-upload>
  <el-row v-loading="uillUpdateImg">
   <quillEditor
    ref="myQuillEditor"
    @change="onEditorChange($event)"
    v-model="value"
    :options="editorOption"/>
  </el-row>
 </div>
</template>
<script>
import { quillEditor } from 'vue-quill-editor'
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'
export default {
 name: "richText",
 components:{quillEditor},
 props:['content'],               //父组件传过来的,将传过来的渲染到富文本编辑器
 data(){
  return{
   uillUpdateImg:false,            //根据图片上传状态来确定是否显示loading动画
   serverUrl:'', //上传的图片服务器地址
   value:this.content,             //富文本内容
   editorOption: {               //符文本编辑器的配置
    placeholder: '',
    theme: 'snow',
    modules: {
     toolbar: {
      container: [             // 工具栏配置, 默认是全部
       ['bold'],
       ['italic'],
       ['underline'],
       ['strike'],
       [{'list':'ordered'},{'list': 'bullet' }],
       ['blockquote'], ['code-block'],
       ['link'],
       ['image'],
       [{'list': 'ordered'}, {'list': 'bullet'}],
      ],
      handlers: {
       'image': function (value) {
        if (value) {
         // 给个点击触发Element-ui,input框选择图片文件
         document.querySelector('#quill-upload input').click()
        } else {
         this.quill.format('image', false);
        }
       }
      }
     }
    }
   }
  }
 },
 methods:{
  onEditorChange({ quill, html, text }) {   //富文本编辑器内容发生改变的时候
   this.value = html
   this.$emit('textChange',html)       //将富文本编辑器输入的文本发送给父组件,父组件涉及提交添加或者更改
  },
  beforeUpload(){               //上传图片之前开启loading
   this.uillUpdateImg = true
  },
  uploadError(){               //图片上传失败,关闭loading
   this.uillUpdateImg = false
   this.$message.error('图片插入失败')
  },
  handleExceed(response, file, fileList){   //图片添加成功
   let quill = this.$refs.myQuillEditor.quill
   console.log(response)
   if (response.status === 0) {
    let length = quill.getSelection().index;
    // 插入图片 response.data.url为服务器返回的图片地址
    quill.insertEmbed(length, 'image', response.data.url)
    // 调整光标到最后
    quill.setSelection(length + 1)
   }else{
    this.$message.error('图片插入失败')
   }
   this.fileList = fileList
   this.uillUpdateImg = false
  },
 }
}
</script>
<style scoped>
</style>

配置中的handlers是用来定义自定义程序的,然而我们配置完后会懵逼地发现,整个富文本编辑器的工具栏的图片上传等按钮都不见了 只保留了几个基本的富文本功能。

这个是因为添加自定义处理程序将覆盖默认的工具栏和主题行为

因此我们要再自行配置下我们需要的工具栏,所有功能的配置如下,大家可以按需配置,这里看起来一大堆,也不美观,大家也可以配置一个单独的config文件引入。

有一点注意的地方,父组件中传入子组件中的值,子组件里面发生改变以后再传给父组件。将变量时存放在props属性中的,我们在调用变量的时候是跟data里面的变量一样的,都是通过this.变量来调用,这个问题就是说父组件传入子组件的变量是不能this.变量直接改变的,要在data或者computed属性里面重新定义一个变量,或者监听props接受变量的变化。改变data或者computed属性里面的变量就不会报错了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS实现self的resend
Jul 22 Javascript
jQuery中setTimeout的几种使用方法小结
Apr 07 Javascript
简单实用jquery版三级联动select示例
Jul 04 Javascript
javascript作用域和闭包使用详解
Apr 25 Javascript
js中不同的height, top的区别对比
Sep 24 Javascript
详解js界面跳转与值传递
Nov 22 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
Nov 29 Javascript
JavaScript中this的用法及this在不同应用场景的作用解析
Apr 13 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
May 18 Javascript
你准备好迎接vue3.0了吗
Apr 28 Javascript
详解如何在Javascript中使用Object.freeze()
Oct 18 Javascript
微信小程序tab左右滑动切换功能的实现代码
Feb 08 Javascript
微信小程序实现的图片保存功能示例
Apr 24 #Javascript
vue中的inject学习教程
Apr 24 #Javascript
浅谈Webpack多页应用HMR卡住问题
Apr 24 #Javascript
微信小程序实现跳转的几种方式总结(推荐)
Apr 24 #Javascript
vue模仿网易云音乐的单页面应用
Apr 24 #Javascript
微信小程序分享功能onShareAppMessage(options)用法分析
Apr 24 #Javascript
详解关于webpack多入口热加载很慢的原因
Apr 24 #Javascript
You might like
收集的PHP中与数组相关的函数
2007/03/22 PHP
PHP ? EasyUI DataGrid 资料取的方式介绍
2012/11/07 PHP
smarty简单分页的实现方法
2014/10/27 PHP
PHP数组函数array_multisort()用法实例分析
2016/04/02 PHP
Nginx下ThinkPHP5的配置方法详解
2017/08/01 PHP
一个多次搜索+多次传值的解决方案
2007/01/20 Javascript
js location.replace与location.reload的区别
2010/09/08 Javascript
jquery $.ajax相关用法分享
2012/03/16 Javascript
jquery实现点击文字可编辑并修改保存至数据库
2014/04/15 Javascript
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
jQuery定义插件的方法
2015/12/18 Javascript
JS弹出窗口插件zDialog简单用法示例
2016/06/12 Javascript
AngularJS中一般函数参数传递用法分析
2016/11/22 Javascript
JavaScript 跨域之POST实现方法
2018/05/07 Javascript
webpack项目轻松混用css module的方法
2018/06/12 Javascript
基于vue实现web端超大数据量表格的卡顿解决
2019/04/02 Javascript
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
2019/11/14 Javascript
JS使用正则表达式实现常用的表单验证功能分析
2020/04/30 Javascript
[00:42]《辉夜杯》—职业组预选赛12月3日15点 正式打响
2015/12/03 DOTA
Python赋值语句后逗号的作用分析
2015/06/08 Python
Python基础练习之用户登录实现代码分享
2017/11/08 Python
浅析Python装饰器以及装饰器模式
2018/05/28 Python
Python在for循环中更改list值的方法【推荐】
2018/08/17 Python
对python操作kafka写入json数据的简单demo分享
2018/12/27 Python
python set内置函数的具体使用
2019/07/02 Python
python使用 __init__初始化操作简单示例
2019/09/26 Python
python字符串的拼接方法总结
2019/11/18 Python
wxpython绘制圆角窗体
2019/11/18 Python
Python机器学习工具scikit-learn的使用笔记
2021/01/28 Python
CSS3实现同时执行倾斜和旋转的动画效果
2016/10/27 HTML / CSS
纯css3使用vw和vh实现自适应的方法
2018/02/09 HTML / CSS
HTML5在线预览PDF的示例代码
2017/09/14 HTML / CSS
党的群众路线教育实践活动学习心得体会
2014/03/03 职场文书
陈安之励志演讲稿
2014/08/21 职场文书
优秀党员个人总结
2015/02/14 职场文书
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android