vue后台管理系统项目-vue-quill-editor实现富文本编辑器功能 可直接使用

news2025/1/13 17:44:02

富文本编辑器功能实现详细过程

目录

富文本编辑器功能实现详细过程

1.安装富文本插件

2.实现效果

3.实现详细过程 可直接使用

全局引入 

局部引入

配置option

扩展需求 自定义配置文字大小


1.安装富文本插件

npm install vue-quill-editor --save
//或者
yarn add vue-quill-editor

2.实现效果

3.实现详细过程 可直接使用

全局引入 

main.js注册

import quillEditor 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)

局部引入

vue页面中引用

 import {
    quillEditor
  } from "vue-quill-editor";
  import "quill/dist/quill.core.css";
  import "quill/dist/quill.snow.css";
  import "quill/dist/quill.bubble.css";
components: {
      quillEditor
},

重要代码

这里上传图片功能使用了vant-ui框架上传代码,因为项目有特殊要求,也可以使用默认富文本自带的功能,这里也可使用自定义上传图片功能,都会一一介绍使用,记得自定义的图片上传功能图标覆盖默认编辑的图标,根据项目需求自行选择使用

<el-col :span="24">
                <el-form-item style="height:600px;">
                  <quill-editor v-model="createModelForm.content" ref="myQuillEditor" style="height: 500px;"
                    :options="contentOption">
                  </quill-editor>
                  <!-- 自定义上传图片弹窗 -->
                  <!-- <el-upload
                      ref="ztphotoUrl"
                      class="upload-demo ivu-upload"
                      :action="baseUrl + '/file/upload'"
                      :headers="{ Authorization: token }"
                      :on-success="handleZtSuccess"
                      accept="image/jpeg,image/png,image/jpg"
                      list-type="picture">
                      <el-button v-throttle size="small" type="primary" class="ivu-btn">点击上传</el-button>
                    </el-upload> -->
                  <van-uploader :after-read="afterCard" :before-read="beforeRead" accept="image/*" class="uploadfile"
                    :max-size="10240 * 1024" @oversize="onOversize">
                    <img src="../../assets/upload.png">
                  </van-uploader>
                </el-form-item>
              </el-col>

配置option

  • 富文本全部功能配置

效果

// 富文本编辑器配置
      contentOption: {
        modules: {
          toolbar: [
            ['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: ['12', '14', '16', '18', '20', '22', '24', '28', '32', '36'] }], // 字体大小
            [{ header: [1, 2, 3, 4, 5, 6] }], // 标题
            [{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色
            // [{ font: ['songti'] }], // 字体种类
            [{ align: [] }], // 对齐方式
            ['clean'], // 清除文本格式
            ['image', 'video'] // 链接、图片、视频
          ]
        },
        placeholder: '请输入正文'
      },
  • 自定义配置使用

效果

本项目选择自定义配置

const toolbarOptions = [
    ['image'], //上传图片、上传视频
    ['bold', 'strike', 'underline'],
    [{
      'color': []
    }], // 字体颜色
    [{
      'align': []
    }], //对齐方式
    [{
      'size': [false, '16px', '18px', '20px']
    }], //字体大小
    ['clean'], //清除字体样式


  ];
contentOption: {
          placeholder: "请输入图文详情",
          // // 编辑器的配置
          // theme: "bubble"
          modules: {
            clipboard: {
              // 粘贴版,处理粘贴时候的自带样式
              matchers: [
                [Node.ELEMENT_NODE, this.handleCustomMatcher]
              ],
            },
            toolbar: {
              container: toolbarOptions, // 工具栏
              handlers: {
                'image': (value) => {
                  if (value) {
                    // 调用自定义上传图片
                    // document.querySelector('.ivu-btn').click();
                    this.afterCard();
                  } else {
                    this.quill.format('image', false);
                  }
                }
              }
            }
          }
        },
  • 自定义使用vant-ui图片上传功能实现过程

这里有使用图片压缩上传功能,图片压缩封装功能可查看vue实现文件上传压缩优化处理文章使用

// 文件压缩实现
      afterCard(file) {
        console.log(file, "1223213")
        this.$imgUpload.imgZip(file).then(resData => {
          const formData = new FormData();
          formData.append("file", resData);
          // 请求接口上传图片到服务器
          upload(formData).then(res => {
            console.log(res.data, "图片上传");
            showLoading();
            if (res.code == 200) {
              let quill = this.$refs.myQuillEditor.quill;
              // 设置焦点
              quill.focus();
              // 获取光标所在位置
              let length = quill.getSelection().index;
              // 插入图片,res为服务器返回的图片链接地址
              quill.insertEmbed(length, 'image', this.$baseImgUrl + res.data);
              // 调整光标到最后
              quill.setSelection(length + 1);
              hideLoading();
              let toastTimer = setTimeout(() => {
                this.$message.success('上传成功');
                clearTimeout(toastTimer);
              }, 0)
            } else {
              this.$message.warning('上传失败,请重新上传');
              hideLoading();
            }
          })
        });
      },
      
    // 限制上传大小图片
      onOversize(file) {
        console.log(file, "file");
        this.$message.warning("文件大小不能超过 10M");
      },

      // 上传之前的图片验证
      beforeRead(file) {
        console.log(file, "file,123");
        if (this.$utils.isImage(file.name)) {
          return true;
        } else {
          this.$message.warning("图片格式不正确");
        }
      },
  • 自定义使用element上传功能
// 自定义上传图片
      handleZtSuccess(res) {
        console.log(res);
        const imgType = res.data.split(".")[1];
        console.log(imgType, "图片格式");
        if (imgType == "jpeg" || imgType == "png" || imgType == "jpg") {
          showLoading();
          let quill = this.$refs.myQuillEditor.quill;
          // 如果上传成功
          if (res.data) {
            // 获取光标所在位置
            let length = quill.getSelection().index;
            // 插入图片,res为服务器返回的图片链接地址
            quill.insertEmbed(length, 'image', this.$baseImgUrl + res.data);
            // 调整光标到最后
            quill.setSelection(length + 1);
            hideLoading();
          } else {
            hideLoading();
            this.$message.error('图片插入失败');
            return;
          }
        } else {
          this.$message.warning("图片格式不正确")
          return;
        }

      },
  • 粘贴版,处理粘贴时候的自带样式

粘贴文字样式(包括背景色和文字颜色等)处理方式

粘贴图片时候不能直接复制本地图片,如果复制本地图片,编辑器识别不了,可以选择上传或者复制网络图片

// 粘贴版,处理粘贴时候的自带样式
matchers: [
  [Node.ELEMENT_NODE, this.handleCustomMatcher]
],
handleCustomMatcher(node, Delta) {
        let ops = []
        Delta.ops.forEach(op => {
          if (op.insert && typeof op.insert === 'string') { // 如果粘贴了图片,这里会是一个对象,所以可以这样处理
            ops.push({
              insert: op.insert,
              attributes: op.attributes //文字样式(包括背景色和文字颜色等)
            })
          } else {
            if (op.insert.image.includes('data:image/png;')) { //本地图片会使文件file开头
              this.$message.warning('不允许粘贴本地图片,请手动上传或者复制网络图片')
            } else {
              ops.push({
                insert: op.insert,
              })
            }
          }
        })
        Delta.ops = ops
        return Delta
      },

扩展需求 自定义配置文字大小

默认编辑器字体只有几种大小可以选择,满足不了产品的需求,主要是需要更改配置文件,以及对应的CSS和js文件。

改变 toolbarOptions的配置项

const toolbarOptions = [
//  原本是 'small',fasle,'large','huge',改成自己想要设置的大小,这会改变页面下拉框的个数以及每个选项的data-value值,插件的js会根据data-value的值去增加对应的class类名。 
[{'size': ['10px', '12px', '14px', '16px' ,'18px', '20px', '22px', '24px', '26px', '32px', '48px']}], 
]

再到node_modules下面找到 quill, 对目录dist 下面的 css文件和 js文件进行修改。

修改quill.core.js

// small,large,huge 这三个是默认的,可以删可以留。后面必须增加和editor配置项一样。
whitelist: ['small', 'large', 'huge','8px','10px','12px','14px','16px','18px','20px','22px','24px','26px','32px','48px']

修改quill.js

// 跟quill.core.js 同理,修改下面两项,huge及之前都是默认的
whitelist: ['small', 'large', 'huge','8px','10px','12px','14px','16px','18px','20px','22px','24px','26px','32px','48px']
var SIZES = ['small', false, 'large', 'huge','8px','10px','12px','14px','16px','18px','20px','22px','24px','26px','32px','48px'];

修改quill.bubble.css

// 需要全部增加一下css选项,需要注意的是data-value=如果是接数字要有引号,字符串可以不带引号
//10px,12px等等新设置的大小都要设置相应的类名字体大小
.ql-editor .ql-size-8px {
    font-size: 8px;
}
// select选择的字体大小
.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value="8px"]::before {
    font-size: 8px;
}
.ql-bubble .ql-picker.ql-size .ql-picker-label[data-value="8px"]::before,
.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value="8px"]::before {
    content: '8px';    
}

修改quill.core.css 

// 需要全部增加一下css选项
.ql-editor .ql-size-10px {
    font-size: 10px;
}

修改quill.snow.css 

// 需要全部增加一下css选项
.ql-editor .ql-size-8px {
    font-size: 8px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="8px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="8px"]::before {
    content: '8px';
}
// select选择的字体大小
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="8px"]::before {
    font-size: 8px;
}

如有疑问,可在文章下留言评论,看到后会及时 回复。

⭐️⭐️⭐️  作者:船长在船上
🚩🚩🚩  主页:来访地址船长在船上的博客
🔨🔨🔨  简介:CSDN前端领域博客专家,CSDN前端领域优质创作者,资深前端开发工程师,专注web前端领域开发,在CSDN分享工作中遇到的问题以及问题解决方法和对项目开发的实际案例总结以及新技术的认识。

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

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

相关文章

Android电源管理介绍

一、电源管理基础知识1.1电源管理的几种状态Android kernel源码中&#xff0c;定义了三种电源状态&#xff0c;在kernel/power/suspend.c中&#xff1a;对应的宏定义/include/linux/suspend.h1.2 电源管理状态的介绍&#xff1a;PM_SUSPEND_ON设备处于正常工作状态PM_SUSPEND_S…

VsCode搭建C语言运行环境以及终端乱码问题解决

在VsCode中搭建C/C运行环境需要先安装以下插件 1、安装c/c插件 2、安装code runner插件 当然也可以安装一些其他的美化插件根据个人习惯&#xff0c;但是以上这两个是必装的。 安装好插件后来到插件主页点击卸载旁边的小齿轮选择扩展设置 找到扩展设置中的下图选项并打上勾即可…

前端小知识:控制台打印(console)- 模拟Java日志打印、表格形式打印美化输出对象、代码运行时间统计

文章目录6. 控制台打印&#xff08;Console&#xff09;模拟Java日志打印格式美化对象打印&#xff08;表格形式打印输出&#xff09;日志等级输出&#xff08;让其在控制台显示时有颜色提示&#xff09;代码运行时间统计打印输出6. 控制台打印&#xff08;Console&#xff09;…

LeetCode HOT 100 —— 560. 和为 K 的子数组

题目 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的连续子数组的个数 思路 首先&#xff0c;要明白本题不能使用双指针或者滑动窗口&#xff0c;因为双指针和滑动窗口使用的一个必要条件就是能一步一步迭代&#xff0c;确定窗口的收缩方…

Unity3D教程:2D游戏技能特效

在我们的2D图形游戏中不可缺少大量的光影、技能特效&#xff0c;像Diablo II中的魔法效果的实现&#xff0c;幸好我们拥有强大的CPU来为我们实现Alpha混合与色彩饱和混合&#xff0c;接下来让我们来讨论一下如何用这些方法来实现我们游戏中所需要的技能特效。 一、Alpha混合特效…

【ArcGIS Pro微课1000例】0023:ArcGIS Pro 3.0中打开GeoPackage数据库(.gpkg)

本文讲解ArcGIS Pro 3.0中打开GeoPackage数据库(.gpkg)的两种方法。 文章目录 一、QGIS创建GeoPackage二、ArcGIS Pro 3.0打开GeoPackage1. 直接加载2. 添加数据库一、QGIS创建GeoPackage 本文使用到的GeoPackage是在QGIS中创建并入库的,具体操作可以参考: 【QGIS入门实战…

Kakarot:部署在Starknet上的ZK-EVM type 3

1. 引言 sayajin-labs团队开源的&#xff1a; https://github.com/sayajin-labs/kakarot&#xff08;ZK-EVM type 3 written in Cairo, leveraging STARK proof system.&#xff09; Kakarot提供了相应的playground&#xff1a; https://playground.kakarot.org/?forkmerg…

aardio - libxl库,一个dll操作excel

经常用到excel操作&#xff0c;也有几个现成的库能实现我需要的功能&#xff0c;但用起来总是感觉不顺手。 于是便抽了两天时间&#xff0c;在aaz.libxl库的基础上&#xff0c;按照我的使用习惯进行了修改。 以后再也不用为操作excel发愁啦。 下载地址&#xff1a;http://che…

基于docker部署nexus并创建发布npm包

1. nenus部署 1.1 搜索镜像 [rootsurpass ~]# docker search nexus INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/sonatype/nexus3 …

移动 IP(计算机网络-网络层)

目录 移动性对网络应用的影响 移动IP中数据报的转发过程 移动IP中数据报的转发过程 三角路由的低效性 解决三角路由的低效性 移动IP的标准 移动性对网络应用的影响 现在先考虑这样一种情况&#xff0c;一个用户拿着无线移动设备在一个Wi-Fi服务区内走动&#xff0c;并且边…

【Django】第一课 基于Django超市订单管理系统开发

概念 django服务器开发框架是一款基于Python编程语言用于web服务器开发的框架&#xff0c;采用的是MTV架构模式进行分层架构。 项目搭建 打开pycharm开发软件&#xff0c;打开开发软件的内置dos窗口操作命令行 在这里指定项目存放的磁盘路径&#xff0c;并使用创建django项…

UDP通信

目录 一.预备知识 1.1IP与MAC 1.2端口号 1.3TCP与UDP协议 2.4网络字节序 二.socket编程接口 2.1socket常见API 2.2sockaddr结构 3.UDP网络程序 3.1服务端 3.1.1服务端创建套接字 3.1.2绑定服务端 3.1.3recvfrom 3.2客户端 3.2.1客户端创建套接字 3.2.2客户端绑…

目标检测之Faster RCNN分析

基本流程 图像输入网络得到特征图使用RPN生成候选框&#xff0c;将候选框投影到特征图获得特征矩阵对特征矩阵使用ROI pooling得到特征图并展平&#xff0c;得到预测结果 重点解析 RPN在网络中的位置 在上图中&#xff0c;从feature map层来看&#xff0c;有两个指向上层的箭头…

善用数据框,让你的工作更严谨统一,让你的地图更优雅、更专业

前言:数据框,一个经常被忽略的东西,只有偶尔才被想起。善用数据框能更好的管理我们的投影,更能轻松的控制图层的范围,甚至利用裁剪数据框更能让我们的地图好看...什么是数据框 好吧,这个很基础,但是我还是要提一下,可能有的读者确实不知道,毕竟它的中文译名就很奇怪。…

get/post/put/delete请求头说明

目录 1.请求头说明 2.get 3.delete 4.post 5.put 6. 说明 7.Content-Type说明 1.请求头说明 前端发出的请求通过浏览器进行查看&#xff0c;可以发现分为四个部分。常规信息(General)&#xff0c;请求头信息(Request Headers)&#xff0c;响应头信息(Response Headers)…

[思维模式-12]:《如何系统思考》-8- 工具篇 - 因果回路图/系统循环图/系统控制图,系统思考的关键工具

目录 第1章 因果回路图概述 1.1 什么是因果回路图 1.2 反馈回路 第2章 因果图的组成 2.1 回路 2.2 变量 2.4 连接 > 不同变量之间的函数关系 2.5 增强回路 2.6 调节回路 2.7 时间延时 第3章 因果图的用途与应用 3.1 因果图的价值 3.2 因果图的用途 第4章 因果图…

分布式微服务技术栈-SpringCloud+RabbitMQ+Docker+Redis

微服务技术栈一、微服务 介绍了解1 架构结构案例与 springboot 兼容关系拆分案例拆分远程调用2 eureka注册中心3 Ribbon 负载均衡4 nacos 阿里注册中心一、微服务 介绍了解 分布式架构的一种 把服务进行 拆分 springcloud 解决了 服务拆分过程中的 治理问题 与单体应用 进行区…

云服务器ECS入门

云服务器ECS入门 一、什么是云服务器ECS 云服务器ECS (Elastic Compute Service) 是阿里云提供的性能卓越、稳定可靠、弹性扩展的laaS(Infrastructure as a Service) 级别云计算服务 云服务器ECS免去了您采购IT硬件的前期准备&#xff0c;让您像使用水、电、天然气等公共资源…

Linux 下 使用点阵在LCD上显示汉字,字符

文章目录前言一、显示字符1.获取点阵&#xff1a;2.描点&#xff08;显示字符函数&#xff09;&#xff1a;3. 要打开LCD设备&#xff1a;4. 通过ioctl 获取Framebuffer参数:5. 通过mmap映射出Framebuffer的地址&#xff1a;6.清屏并显示字符&#xff1a;二、显示汉字1.区位码&…

WSL2的安装、应用

WSL2的安装、应用WSL安装、升级常用命令WSL导入导出其他 - 图形界面、虚拟化WSL安装、升级 win10系统上开启WSL参考如下&#xff0c;我先是安装了WSL1&#xff0c;之后又升级到WSL2的。关键是一些Win10上电配置&#xff0c;之后在windows应用商店下载ubuntu即可。 win10上lin…