vue-quill-editor富文本编辑框使用

news2025/1/20 18:31:28

vue富文本中实现上传图片及修改图片大小等功能。

1,配置使用

        配置使用网上很多,记录下自己的使用过程

        第一步:components/Editor文件夹下创建QuillEditor.vue文件

<template>
  <div :class="prefixCls">
    <quill-editor
      v-model="value"
      ref="myQuillEditor"
      :options="editorOption"
      @blur="onEditorBlur($event)"
      @focus="onEditorFocus($event)"
      @ready="onEditorReady($event)"
      @change="onEditorChange($event)">
    </quill-editor>
    <!-- antvue上传 -->
   <!-- <el-upload
      name="file"
      :multiple="true"
      accept=".pdf,.doc,.docx,.xml,xls,xlsx,application/msword"
      action= "http://localhost:8080/common/uploadBack"
      :showUploadList="false"
      :headers="headers"
      @change="handleChange"
      class="uploadFile"
    >
    </el-upload>-->
  </div>
</template>

<script>

// 组件载入Vue-Quill-Editor
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'
import { quillEditor } from 'vue-quill-editor'
// register quill module
import Quill from 'quill' // 引入编辑器
// 图片可以放大和缩小
import { ImageDrop } from 'quill-image-drop-module'
import ImageResize from 'quill-image-resize-module'
// 提供图片上传到服务器的功能
import { ImageExtend, QuillWatch } from 'quill-image-extend-module'
// 注册组件
Quill.register('modules/imageDrop', ImageDrop)
Quill.register('modules/imageResize', ImageResize)
Quill.register('modules/ImageExtend', ImageExtend)

// 自定义插入a链接
const Link = Quill.import('formats/link')
class FileBlot extends Link { // 继承Link Blot
  static create (value) {
    let node
    if (value && !value.href) { // 适应原本的Link Blot
      node = super.create(value)
    } else { // 自定义Link Blot
      node = super.create(value.href)
      // node.setAttribute('download', value.innerText) // 左键点击即下载
      node.innerText = value.innerText
      node.download = value.innerText
    }
    return node
  }
}
FileBlot.blotName = 'link'
FileBlot.tagName = 'A'
Quill.register(FileBlot)

import { getToken } from "@/utils/auth";

export default {
  name: 'QuillEditor',
  components: {
    quillEditor
  },
  props: {
    prefixCls: {
      type: String,
      default: 'ant-editor-quill'
    },
    // 表单校验用字段
    // eslint-disable-next-line
    value: {
      type: String
    }
  },
  data () {
    return {
      // upload 上传header
      headers: {
        requestType: '0'
      },
      content: null,
      // 富文本插件配置
      editorOption: {
        modules: {
          imageDrop: true,
          imageResize: {
            displaySize: true
          },
          ImageExtend: { // 使用的图片上传扩展插件
            name: 'file', // 传的参数名
            size: 10, // 单位为M, 1M = 1024KB
            action: process.env.VUE_APP_BASE_API +'/common/imortImg', // 后台上传图片的接口地址
            headers: (xhr) => { // 请求头
              xhr.setRequestHeader("Authorization", "Bearer " + getToken());
              return xhr
            },
            response: (res) => {
              console.log(res);
              return res.data.imgUrl // 返回的图片信息
            },
            // 图片超过大小的回调
            sizeError: () => {
              this.$message.error('上传图片大小不超2M')
            },
            start: () => {}, // 可选参数 自定义开始上传触发事件
            end: () => {}, // 可选参数 自定义上传结束触发的事件,无论成功或者失败
            error: () => {}, // 可选参数 上传失败触发的事件
            success: () => {}, // 可选参数  上传成功触发的事件
            // 可选参数 每次选择图片触发,也可用来设置头部,但比headers多了一个参数,可设置formData
            change: (xhr, formData) => {
            // xhr.setRequestHeader('myHeader','myValue')
            // formData.append('token', 'myToken')
            }
          },
          toolbar: {
            container: [
                        ['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: [] }], // 对齐方式
                        ['link', 'image'], // 链接、图片、视频、上传
                        ['clean'] // 清除文本格式
                      ],
            handlers: {
                  'image': function () { // 劫持原来的图片点击按钮事件
                    QuillWatch.emit(this.quill.id)
                  }
            }
          }
        },
        placeholder: '请输入内容', // 提示
        readyOnly: false, // 是否只读
        theme: 'snow', // 主题 snow/bubble
        syntax: true // 语法检测
      }
    }
  },
  methods: {
    onEditorBlur (quill) {
      // console.log('editor blur!', quill)
    },
    onEditorFocus (quill) {
      // console.log('editor focus!', quill)
    },
    onEditorReady (quill) {
      // console.log('editor ready!', quill)
    },
    onEditorChange ({ quill, html, text }) {
      // console.log('editor change!', quill, html, text)
      this.$emit('input', html)
    },
    handleChange (info) {
      // console.log(info, '==============info============')
      // if (info.file.status !== 'uploading') {
      //   console.log(info.file, info.fileList)
      // }
      // if (info.file.status === 'done') {
      //   this.$message.success(`${info.file.name} file uploaded successfully`)
      // } else if (info.file.status === 'error') {
      //   this.$message.error(`${info.file.name} file upload failed.`)
      // }
      console.log("上传回调"+info);
      if (info.file.status === 'done') {
        const fileNameLength = info.file.name.length
        // 插入链接
        const quill = this.$refs.myQuillEditor.quill
        const length = quill.getSelection().index
        const reshref = info.fileList[0].response.data.ImgUrl // 文件链接地址
        quill.insertEmbed(length, 'link', { href: reshref, innerText: info.file.name }, 'api')
        quill.setSelection(length + fileNameLength)
      }
    }
  },
  watch: {}
}
</script>
<style>
.ql-snow.ql-toolbar .ql-upload{
  /*background:url('../../assets/cloudUpload.svg');*/
  background-size:24px 24px;
  background-position:center center;
  background-repeat:no-repeat;
  /*background-color:red;*/
}
.ql-snow .ql-tooltip::before {
    /*// content: "Visit URL:";*/
    /*// line-height: 26px;*/
    /*// margin-right: 8px;*/
    vertical-align: middle;
}
.ql-snow .ql-tooltip a.ql-preview {
    /*// display: inline-block;*/
    /*// max-width: 200px;*/
    /*// overflow-x: hidden;*/
    /*// text-overflow: ellipsis;*/
    vertical-align: middle;
}
</style>
<style scoped>
</style>

        第二步:代码中加入QuillEditor的引入

import quillEditor from "@/components/Editor/QuillEditor";
export default {
    name: "Biz_ztxx_text_manager",
    components: { quillEditor },
    ......

        

         第三步:vue.config.js中加入webpack

在文件顶部加入:

const webpack = require('webpack')

在文件底部加入:

config.plugin('provide').use(webpack.ProvidePlugin, [{
      // 'window.Quill': 'quill'
      'window.Quill': 'quill'
    }])

         第四步:代码中引用

<quill-editor v-model="form.textDetail" />

         第五步:命令行中执行安装

npm install vue-quill-editor
npm install quill-image-resize-module --save
npm install quill-image-drop-module --save
npm install quill-image-extend-module --save

        若安装失败,执行npm install 或者npm install --registry=https://registry.npmmirror.com

大部分情况都能成功。之后执行启动即可,可以在富文本中进行上传图片及修改图片大小等功能。

2,富文本框无法调整默认高度

参考:vue 的Quill Editor如何设置默认高度?_quill-editor 高度_Rocket MAN的博客-CSDN博客

添加此样式

<style>
    .edit_container {
        font-family: 'Avenir', Helvetica, Arial, sans-serif;
        -webkit-font-smoothing: antialiased;
        -moz-osx-font-smoothing: grayscale;
        text-align: center;
        color: #2c3e50;
        margin-top: 60px;
    }
    .ql-editor{
         height:400px;
     }
</style>

3,设置富文本框只读

vue-quill-editor设置readonly等不起作用

使用此命令设置只读,其他的设置disabled等的均不好使

<editor v-model="form.textDetail" :min-height="222" ref="quillEditor"/>
let that = this
this.$nextTick(()=>{
        that.$refs.quillEditor.Quill.enable(false);
})

4,出现报错等,参考Vue Element UI 之富文本插件实现图片调整大小(quill-image-resize-module)、图片粘贴(quill-image-drop-module) - 灰信网(软件开发博客聚合)

5,设置复制黏贴自动上传

参考:Vue Element UI 之富文本插件实现图片调整大小(quill-image-resize-module)、图片粘贴(quill-image-drop-module) - 灰信网(软件开发博客聚合)

进行部分调整

QuillEditor.vue中添加监听

 @paste.native="handlePaste($event)"

安装及引入jquery

npm install jquery --save

import $ from 'jquery';

 增加handlePaste方法

handlePaste(evt) {
      let that = this
      if (evt.clipboardData &&
        evt.clipboardData.files &&
        evt.clipboardData.files.length) {
        evt.preventDefault();
        [].forEach.call(evt.clipboardData.files, (file) => {
          if (!file.type.match(/^image\/(gif|jpe?g|a?png|bmp)/i)) {
            return;
          }
          const formData = new FormData();
          formData.append("file", file);//后台上传接口的参数名
          // 实现上传
          $.ajax({
            type: "post",
            url: process.env.VUE_APP_BASE_API +'/common/imortImg', // 上传的图片服务器地址
            data: formData,
            headers:{'Authorization': "Bearer " + getToken()},//必须
            dataType: "json",
            processData: false,
            contentType: false,//设置文件上传的type值,必须
            success: (response) => {
              if (response.code == 200) {
                //当编辑器中没有输入文本时,这里获取到的 range 为 null
                debugger
                var range = that.$refs.myQuillEditor.quill.selection.savedRange;
                //图片插入在富文本中的位置
                var index = 0;
                if (range == null) {
                  index = 0;
                } else {
                  index = range.index;
                }
                //将图片链接插入到当前的富文本当中
                that.$refs.myQuillEditor.quill.insertEmbed(index, "image", response.data.imgUrl);
                // 调整光标到最后
                that.$refs.myQuillEditor.quillsetSelection(index + 1); //光标后移一位
              }
            },
            error: function () {
              this.$message.error('上传失败!')
            },
          });
        });
      }
    },

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/434611.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

bitset的用法

bitset的用法 bitset介绍 C的 bitset 在 bitset 头文件中&#xff0c;它是一种类似数组的结构&#xff0c;它的每一个元素只能是&#xff10;或&#xff11;&#xff0c;每个元素仅用&#xff11;bit空间&#xff0c;相当于一个char元素所占空间的八分之一。 bitset中的每个…

MyBatis-Plus Generator v3.5.1 最新代码自动生成器

一、概述 官网&#xff1a;https://baomidou.com/ 官方文档 &#xff1a;https://baomidou.com/pages/56bac0/ 官方源码地址&#xff1a; https://gitee.com/baomidou/mybatis-plus 官方原话&#xff1a; AutoGenerator 是 MyBatis-Plus 的代码生成器&#xff0c;通过 Auto…

【TMT数据传不到MES中间库】-F18

MES中间库有张表:T_Z_ERPSCInfo TMT机台落纱后,会把落纱的数据传到T_Z_ERPSCInfo去。 目前总是有几个机台(以F18举例),落纱了,数据没有过来。 起初以为是没有访问权限的问题,在机台上telnet ip+端口,发现没问题。 后来认为是数据库的账号有问题。 download了一份日…

Oracle EBS数据定义移植工具:FNDLOAD

在实际的EBS二次开发中&#xff0c;我们经常会碰到需要在各个环境之间移植二次开发的程序对象以及数据定义&#xff0c;如在EBS二次开发中并发请求的定义会涉及到&#xff1a; 可执行、并发程序、值集、请求组等的定义&#xff0c;定义需要从开发环境、测试环境、UAT环境一直到…

AI智慧工地视频分析系统 yolov7

AI智慧工地视频分析系统通过yolov7网络模型视频智能分析技术&#xff0c;AI智慧工地视频分析算法模型对画面中物的不安全状态以及现场施工作业人员的不合规行为及穿戴进行全天候不间断实时分析&#xff0c;发现有人不合规行为及违规穿戴抽烟打电话等立即自动抓拍存档告警。在架…

跨平台开发之 Tauri

比起 Electron&#xff0c;Tauri 打包后的安装包体积是真的小。 跨平台开发 最近使用跨平台开发框架写了一个软件&#xff0c;在此记录一下。 说起跨平台开发&#xff0c;我的理解是这样的&#xff1a; 多依赖浏览器环境运行多使用前端语言进行开发只需一次编码&#xff0c;…

JavaScript的this关键字

文章目录 一、JavaScript this 关键字总结 一、JavaScript this 关键字 面向对象语言中 this 表示当前对象的一个引用。 但在 JavaScript 中 this 不是固定不变的&#xff0c;它会随着执行环境的改变而改变。 在方法中&#xff0c;this 表示该方法所属的对象。 如果单独使用&a…

2023/4/18总结

项目 实现了服务器和客户端的连接&#xff0c;在登录注册上面。 然后去实现了密码MD5化&#xff0c;通过java自带的&#xff0c;去实现了MD5. public String getMD5(String str) throws NoSuchAlgorithmException {MessageDigest mdMessageDigest.getInstance("MD5&quo…

SSTI模板注入小结

文章目录 一、漏洞简述&#x1f37a;二、flask模板注入&#x1f37a;三、shrine&#xff08;攻防世界&#xff09;&#x1f37a;四、SSTI注入绕过&#x1f37a; 一、漏洞简述&#x1f37a; 1、SSTI&#xff08;Server-Side Template Injection&#xff0c;服务器端模板注入&am…

5个面向Python高级开发者的技巧

使用这些用于自定义类行为、编写并发代码、管理资源、存储和操作数据以及优化代码性能的高级技术来探索 Python 的深度。 本文探讨了 Python 中的五个高级主题&#xff0c;它们可以为解决问题和提高代码的可靠性和性能提供有价值的见解和技术。从允许您在定义类时自定义类行为的…

SpringBoot基础学习之(二十):Shiro与Thymeleaf的整合版本

还是一样&#xff0c;本篇文章是在上一篇文章的基础上&#xff0c;实施再次进阶 Shiro是一种特别的流行的安全框架&#xff0c;Thymeleaf则是spring boot架构中使用的一种特别引擎。今天介绍的则是它们俩的整合版本。 实现的功能&#xff1a;前端的显示的内容&#xff0c;是根…

vi/vim命令,使用vi编辑器命令详解

linux常用命令:vi/vim vi命令有三种模式&#xff1a;一般模式&#xff0c;编辑模式&#xff0c;命令模式&#xff08;底行模式&#xff09; 可以通过 vi [文件路径]文件名 的命令启动vi&#xff0c;并且打开指定的文件进行查看、编辑&#xff0c;其中[文件路径] 是可选参数。如…

微信小程序开发:实现毛玻璃效果

前言 在微信小程序开发的时候&#xff0c;也会遇到一些和在前端开发一样的样式需求&#xff0c;二者的相通类似性非常的高&#xff0c;就拿样式相关的需求来说&#xff0c;可以说是一模一样的操作。那么本文就来分享一个关于实现高斯模糊效果的需求&#xff0c;微信小程序和前端…

【Linux网络服务】FTP服务

FTP服务 一、FTP服务1.1FTP服务概述1.2FTP服务的特点1.3FTP服务工作过程 二、设置FTP服务2.1实验一&#xff1a;设置匿名用户访问FTP服务&#xff08;最大权限&#xff09;2.2实验二&#xff1a;设置本地用户验证访问ftp&#xff0c;并禁止切换到ftp以外的目录&#xff08;默认…

Linux- 进程的切换和系统的一般执行过程

我想在介绍进程切换之前&#xff0c;先引入中断的相关知识&#xff0c;它是我们理解进程切换的重要前提&#xff0c;也是Linux操作系统的核心机制。 中断的类型 • 硬件中断&#xff08;Interrupt&#xff09;&#xff0c;也称为外部中断&#xff0c;就是CPU的两根引脚&…

微服务学习-SpringCloud -Nacos (集群及CP架构相关学习)

文章目录 Nacos集群下心跳机制相对于单机会有怎样的改变&#xff1f;CAP原则和BASE原则常见的注册中心实现对比Nacos集群实现协议Nacos CP架构实现源码Nacos CP架构leader是如何选举的呢&#xff1f; Nacos集群下心跳机制相对于单机会有怎样的改变&#xff1f; 在上一遍单机模…

百万赞同:网络安全为什么缺人? 缺什么样的人?

1.网络安全为什么缺人? 缺人的原因是有了新的需求 以前的时候&#xff0c;所有企业是以产品为核心的&#xff0c;管你有啥漏洞&#xff0c;管你用户信息泄露不泄露&#xff0c;我只要做出来的产品火爆就行。 这一切随着《网络安全法》、《数据安全法》、《网络安全审查办法》…

No.041<软考>《(高项)备考大全》【第25章】量化项目管理

第25章】量化项目管理 1 考试相关2 量化项目管理3 准备量化管理项目4 量化的管理项目5 练习题参考答案: 1 考试相关 选择可能考0-1分&#xff0c;案例论文不考。 2 量化项目管理 量化项目管理&#xff08;QPM&#xff09;的目的在于量化地管理项目&#xff0c;以达成项目已建…

Auto-GPT 5分钟详细部署指南

安装 conda 1. 下载安装 miniconda3 &#xff1a; Miniconda — conda documentation conda是一个包和环境管理工具&#xff0c;它不仅能管理包&#xff0c;还能隔离和管理不同python版本的环境。类似管理nodejs环境的nvm工具。 2. conda环境变量&#xff1a; 新建 CONDA_H…

混合网络监控工具

多年来&#xff0c;网络不可避免地变得更加复杂。混合网络架构包括跨多个供应商的 LAN、WAN、公共或私有云存储以及混合云。简而言之&#xff0c;它是虚拟和物理网络组件的混合体&#xff0c;自远程工作出现以来&#xff0c;这种类型的网络架构已经起飞。 什么是混合网络 混合…