当前位置: 首页 > news >正文

vue项目中富文本编辑器的实现

文章目录

    • vue前端实现富文本编辑器的功能需要用到第三方库
      • 1. 安装包
      • 2.全局引入注册
      • 3.组件内使用
      • 4.图片缩放功能实现
        • ①安装包
        • ②注册并添加配置项
        • ③报错解决

vue前端实现富文本编辑器的功能需要用到第三方库

vue2使用vue-quill-editor,vue3使用@vueup/vue-quill,由于我测试使用的是vue3,所以该文章讲解的是@vueup/vue-quill的使用

步骤:

1. 安装包

npm i @vueup/vue-quill

2.全局引入注册

在main.js中

import { QuillEditor } from '@vueup/vue-quill'
import '@vueup/vue-quill/dist/vue-quill.snow.css'
const app=createApp(App)
app.component('QuillEditor', QuillEditor)

3.组件内使用

<template><div>富文本编辑器<el-upload :action="uploadUrl" :before-upload="handleBeforeUpload" :on-success="handleUploadSuccess"class="editor-img-uploader" accept=".jpeg,.jpg,.png,.svg" :on-error="handleUploadError":show-file-list="false"><el-button ref="uploadRef" icon="plus" class="editor-img-uploader">上传</el-button></el-upload><div class="editor"><QuillEditor id="editorId" ref="myQuillEditor" v-model:content="editorContent"@update:content="onContentChange" :options="options" :placeholder="placeholder"/></div></div>
</template>
<script>
const titleConfig=[{Choice:'.ql-insertMetric',title:'跳转配置'},{Choice:'.ql-bold',title:'加粗'},{Choice:'.ql-italic',title:'斜体'},{Choice:'.ql-underline',title:'下划线'},{Choice:'.ql-header',title:'段落格式'},{Choice:'.ql-strike',title:'删除线'},{Choice:'.ql-blockquote',title:'块引用'},{Choice:'.ql-code',title:'插入代码'},{Choice:'.ql-code-block',title:'插入代码段'},{Choice:'.ql-font',title:'字体'},{Choice:'.ql-size',title:'字体大小'},{Choice:'.ql-list[value="ordered"]',title:'编号列表'},{Choice:'.ql-list[value="bullet"]',title:'项目列表'},{Choice:'.ql-direction',title:'文本方向'},{Choice:'.ql-header[value="1"]',title:'h1'},{Choice:'.ql-header[value="2"]',title:'h2'},{Choice:'.ql-align',title:'对齐方式'},{Choice:'.ql-color',title:'字体颜色'},{Choice:'.ql-background',title:'背景颜色'},{Choice:'.ql-image',title:'图像'},{Choice:'.ql-video',title:'视频'},{Choice:'.ql-link',title:'添加链接'},{Choice:'.ql-formula',title:'插入公式'},{Choice:'.ql-clean',title:'清除字体格式'},{Choice:'.ql-script[value="sub"]',title:'下标'},{Choice:'.ql-script[value="super"]',title:'上标'},{Choice:'.ql-indent[value="-1"]',title:'向左缩进'},{Choice:'.ql-indent[value="+1"]',title:'向右缩进'},{Choice:'.ql-header .ql-picker-label',title:'标题大小'},{Choice:'.ql-header .ql-picker-item[data-value="1"]',title:'标题一'},{Choice:'.ql-header .ql-picker-item[data-value="2"]',title:'标题二'},{Choice:'.ql-header .ql-picker-item[data-value="3"]',title:'标题三'},{Choice:'.ql-header .ql-picker-item[data-value="4"]',title:'标题四'},{Choice:'.ql-header .ql-picker-item[data-value="5"]',title:'标题五'},{Choice:'.ql-header .ql-picker-item[data-value="6"]',title:'标题六'},{Choice:'.ql-header .ql-picker-item:last-child',title:'标准'},{Choice:'.ql-size .ql-picker-item[data-value="small"]',title:'小号'},{Choice:'.ql-size .ql-picker-item[data-value="large"]',title:'大号'},{Choice:'.ql-size .ql-picker-item[data-value="huge"]',title:'超大号'},{Choice:'.ql-size .ql-picker-item:nth-child(2)',title:'标准'},{Choice:'.ql-align .ql-picker-item:first-child',title:'居左对齐'},{Choice:'.ql-align .ql-picker-item[data-value="center"]',title:'居中对齐'},{Choice:'.ql-align .ql-picker-item[data-value="right"]',title:'居右对齐'},{Choice:'.ql-align .ql-picker-item[data-value="justify"]',title:'两端对齐'},
]
export default {props:{content:{type:String,default:''},readOnly:{type:Boolean,default:false,},fileSize:{type:Number,default:10}},emits:['update:content','getFileId','handleRichTextContentChange'],data() {return {uploadUrl:'https://jsonplaceholder.typicode.com/posts/',imageUrl:'',options: {theme: 'snow',modules: {toolbar: {container: [['bold', 'italic','underline','strike'],//加粗 斜体 下划线 删除线[{color: []}, {background: []}],// 字体颜色、字体背景颜色[{align: []}],// 对齐方式[{ size:['small',false,'large','huge']}],// 字体大小[{font: []}],// 字体种类[{ header:[1,2,3,4,5,6,false]}],// 标题// [{ direction:'ltr'}],// 文本方向[{ direction:'rtl'}],// 文本方向[{indent: '-1'}, {indent: '+1'}],// 缩进[{list:'ordered'},{list:'bullet'}],// 有序、无序列表[{script:'sub'},{script:'super'}],// 上标/下标['blockquote', 'code-block'],//引用 代码块['clean'],// 清除文本格式['link','image','video'],// 链接、图片、视频],handlers:{// 重写图片上传事件image: (value)=>{if(value){this.$refs.uploadRef.$el.click()}else{Quill.format('image',true)}}},}}},placeholder:'请输入公告内容...',clipboard:{matchers:[['img',(node,delta)=>{const src=node.getAttribute('src')const id=node.getAttribute('id')delta.insert({image:{src,id}})}]]},}},computed:{editorContent:{get(){return this.content},set(val){this.$emit('update:content',val)}}},methods:{// 监听富文本内容变化,删除被服务器中被用户回车删除的图片onContentChange(content){// console.log(content.ops[0].insert)this.$emit('handleRichTextContentChange',content)},// 上传前校验格式和大小handleBeforeUpload(file){const type=['image/jpeg','image/jpg','image/png','image/svg']const isJPG=type.includes(file.type)if(!isJPG){this.$message.error('图片格式错误!只能上传jpeg/jpg/png/svg格式')return false}//  校验文件大小if(this.fileSize){const isLt=file.size/1024/1024<this.fileSizeif(!isLt){this.$message.error(`上传文件大小不能超过${this.fileSize}MB`)return false}}return true},// 上传成功处理handleUploadSuccess(res,file){// 如果上传成功if(file.status==='success'){let rawMyQuillEditor=this.$refs.myQuillEditor// 获取富文本实例let quill= rawMyQuillEditor.getQuill()// 获取光标所在位置let length=quill.selection.savedRange.index// // 插入图片,生成图片链接地址this.imageUrl=  URL.createObjectURL(file.raw)const imageId=res.idquill.insertEmbed(length,'image','https://img0.baidu.com/it/u=2119690721,2710382574&fm=253&fmt=auto&app=120&f=JPEG?w=800&h=1422')quill.setSelection(length+1)this.$emit('getFileId',imageId)}else{this.$message.error('图片插入失败')}},// 上传失败处理handleUploadError(){this.$message.error('图片插入失败')},// 增加hover工具栏有中文提示initTitle(){document.getElementsByClassName('ql-editor')[0].dataset.placeholder=''for (let item of titleConfig) {let tip=document.querySelector('.ql-toolbar '+item.Choice)if(!tip) continuetip.setAttribute('title',item.title)}}},mounted(){this.initTitle()}
}
</script>
<style lang="scss" scoped>
//通过css样式实现汉化
.editor{width: 100%;:deep(.ql-editor){height: 500px;overflow: auto;}:deep(.ql-toolbar){white-space: pre-wrap;line-height: normal;}
}
.editor-img-uploader{display: none;
}
.ql-snow .ql-tooltip[data-mode='link']::before{content:'请输入链接地址:';
}
.ql-snow .ql-tooltip.ql-editing a.ql-action::after{border-right: 0px;content:'保存';padding-right: 0px;
}
.ql-snow .ql-tooltip[data-mode='video']::before{content:'请输入视频地址:';
}
.ql-snow .ql-picker.ql-size .ql-picker-label::before,
.ql-snow .ql-picker.ql-size .ql-picker-item::before{content: '14px';
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='small']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='small']::before{content: '10px';
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='large']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='large']::before{content: '18px';
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='huge']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='huge']::before{content: '32px';
}
.ql-snow .ql-picker.ql-header .ql-picker-label::before,
.ql-snow .ql-picker.ql-header .ql-picker-item::before{content: '文本';
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='1']::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='1']::before{content: '标题1';
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='2']::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='2']::before{content: '标题2';
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='3']::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='3']::before{content: '标题3';
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='4']::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='4']::before{content: '标题4';
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='5']::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='5']::before{content: '标题5';
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='6']::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='6']::before{content: '标题6';
}
.ql-snow .ql-picker.ql-font .ql-picker-label::before,
.ql-snow .ql-picker.ql-font .ql-picker-item::before{content: '标准字体';
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value='serif']::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value='serif']::before{content: '衬线字体';
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value='monospace']::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value='monospace']::before{content: '等宽字体';
}
</style>

4.图片缩放功能实现

①安装包

上传后的图片可能尺寸不符合我们要求,想要对其进行缩放操作,要实现该功能需要借助另一个第三方库 quill-image-resize-module

npm i quill-image-resize-module

②注册并添加配置项
//在使用富文本编辑器组件的页面
import {Quill} from '@vueup/vue-quill'
import ImageResize from 'quill-image-resize-module'
Quill.register('modules/ImageResize', ImageResize)
//在编辑器组件配置项中设置
options: {modules: {toolbar: {......},ImageResize:{//支持图片大小尺寸修改displayStyles:{border:'none',backgroundColor: 'black',color:'white'},modules:['Resize','DisplaySize','Toolbar']}}},
③报错解决

注册并配置好后发现不仅没实现效果,还报错了
在这里插入图片描述
解决这一问题,需要在vite.config.js中进行配置

步骤:
Ⅰ.安装包

npm i @rollup/plugin-inject

Ⅱ.配置vite.config.js文件

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import inject from '@rollup/plugin-inject'
export default defineConfig({plugins: [vue(),inject({'window.Quill':['@vueup/vue-quill','Quill'],})],
})

该文章主要是为了分享和记录
参考文章 https://www.jb51.net/javascript/323881bta.htm
参考文章 https://juejin.cn/post/7402204217517867059?searchId=20241120154217039503B146AA0361F0B8

相关文章:

vue项目中富文本编辑器的实现

文章目录 vue前端实现富文本编辑器的功能需要用到第三方库1. 安装包2.全局引入注册3.组件内使用4.图片缩放功能实现①安装包②注册并添加配置项③报错解决 vue前端实现富文本编辑器的功能需要用到第三方库 vue2使用vue-quill-editor&#xff0c;vue3使用vueup/vue-quill&#…...

nginx 配置lua执行shell脚本

1.需要nginx安装lua_nginx_module模块,这一步安装时&#xff0c;遇到一个坑&#xff0c;nginx执行configure时&#xff0c;一直提示./configure: error: unsupported LuaJIT version&#xff1b; ngx_http_lua_module requires LuaJIT 2.x。 网上一堆方法都试了&#xff0c;都…...

Keil+VSCode优化开发体验

目录 一、引言 二、详细步骤 1、编译器准备 2、安装相应插件 2.1 安装C/C插件 2.2 安装Keil相关插件 3、添加keil环境变量 4、加载keil工程文件 5、VSCode中成功添加工程文件后可能出现的问题 5.1 编码不一致问题 6、在VSCode中进行编译工程以及烧录程序 7、效果展示…...

vue2中引入cesium全步骤

1.npm 下载cesium建议指定版本下载&#xff0c;最新版本有兼容性问题 npm install cesium1.95.0 2.在node_models中找到cesium将此文件下的Cesium文件复制出来放在项目的静态资源public中或者static中&#xff0c;获取去github上去下载zip包放在本地也可以 3.在index.html中引…...

工程师 - 智能家居方案介绍

1. 智能家居硬件方案概述 智能家居硬件方案是实现家庭自动化的重要组件&#xff0c;通过集成各种设备来提升生活的便利性、安全性和效率。这些方案通常结合了物联网技术&#xff0c;为用户提供智能化、自动化的生活体验。硬件方案的选择直接影响到智能家居系统的性能、兼容性、…...

中小企业人事管理:SpringBoot框架高级应用

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;中小企业人事管理系统当然也不能排除在外。中小企业人事管理系统是以实际运用为开发背景&#xff0c;运用软件工程原理和…...

嵌入式Linux驱动开发日记

目录 让我们从环境配置开始 目标平台 从Ubuntu开始 从交叉编译器继续 arm-linux-gnueabihf-gcc vscode 没学过ARM汇编 正文开始——速度体验一把 写一个链接脚本 写一个简单的Makefile脚本 使用正点原子的imxdownload下载到自己的SD卡上 更进一步的笔记和说明 从IM…...

迪杰特斯拉算法(Dijkstra‘s)

迪杰斯特拉算法&#xff08;Dijkstras algorithm&#xff09;是由荷兰计算机科学家艾兹格迪科斯彻&#xff08;Edsger W. Dijkstra&#xff09;在1956年提出的&#xff0c;用于在加权图中找到单个源点到所有其他顶点的最短路径的算法。这个算法广泛应用于网络路由、地图导航等领…...

reids基础

数据结构类型 String setnx //设置key不存在&#xff0c;则添加成功 setex name 10 jack // key 10s失效&#xff0c;自动删除 hash hset hget list 按添加数据排序 lpush //左侧插入 rpush //右侧插入 set 不重复 sadd //添加…...

私有化部署视频平台EasyCVR宇视设备视频平台如何构建视频联网平台及升级视频转码业务?

在当今数字化、网络化的时代背景下&#xff0c;视频监控技术已广泛应用于各行各业&#xff0c;成为保障安全、提升效率的重要工具。然而&#xff0c;面对复杂多变的监控需求和跨区域、网络化的管理挑战&#xff0c;传统的视频监控解决方案往往显得力不从心。 EasyCVR视频融合云…...

SparkContext讲解

SparkContext讲解 什么是 SparkContext&#xff1f; SparkContext 是 Spark 应用程序的入口点&#xff0c;是 Spark 的核心组件之一。每个 Spark 应用程序启动时&#xff0c;都会创建一个 SparkContext 对象&#xff0c;它负责与集群管理器&#xff08;如 YARN、Mesos 或 Spa…...

MODBUS TCP转CANOpen网关

Modbus TCP转CANopen网关 型号&#xff1a;SG-TCP-COE-210 产品用途 本网关可以实现将CANOpen接口设备连接到MODBUS TCP网络中&#xff1b;并且用户不需要了解具体的CANOpen和Modbus TCP 协议即可实现将CANOpen设备挂载到MODBUS TCP接口的 PLC上&#xff0c;并和CANOpen设备…...

渗透测试---shell(4)脚本与用户交互以及if条件判断

声明&#xff1a;学习素材来自b站up【泷羽Sec】&#xff0c;侵删&#xff0c;若阅读过程中有相关方面的不足&#xff0c;还请指正&#xff0c;本文只做相关技术分享,切莫从事违法等相关行为&#xff0c;本人一律不承担一切后果 目录 一、shell脚本与用户进行交互 使用 read 指…...

02_Spring_IoC实现

接下来先简单说一下关于IoC的一些要点,后面我们再详细一步一步讨论。 一、IoC控制反转 IoC控制反转它是一种思想,不是具体的实现控制反转的目的是为了降低程序的耦合度,提高程序的可扩展性,从而满足OCP原则和DIP原则控制反转,那到底反转是什么东西? 我们不再使用某个对象…...

使用Python3实现Gitee码云自动化发布

仓库信息 https://gitee.com/liumou_site/ip 实现代码 import osimport requests from loguru import loggerdef gitee(ver, message, prerelease: bool False):"""在 Gitee 上创建发布版本:param ver: 版本号:param message: 发布信息:param prerelease: 是…...

Ubuntu24.04下的docker问题

按官网提示是可以安装成功的&#xff0c;但是curl无法使用https下载&#xff0c;会造成下述语句执行失败 # Add Dockers official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https…...

PAT (Basic Level) Practice (中文)1002 写出这个数

读入一个正整数 n&#xff0c;计算其各位数字之和&#xff0c;用汉语拼音写出和的每一位数字。 #include<bits/stdc.h> using namespace std; string a; int sum0; int f0; int n[10005]; int main(){ cin>>a; int c0; int laa.size(); for(int i…...

C07.L07.STL之映射.应用2.统计数字

题目描述 某次科研调查时得到了 n 个自然数&#xff0c;每个数均不超过 1500000000 (1.5*10^9 )。已知不相同的数不超过 10000 个&#xff0c;现在需要统计这些自然数各自出现的次数&#xff0c;并按照自然数从小到大的顺序输出统计结果。 输入格式 包含 2 行&#xff1a; 第…...

微信小程序组件详解:text 和 rich-text 组件的基本用法

微信小程序组件详解:text 和 rich-text 组件的基本用法 引言 在微信小程序的开发中,文本展示是用户界面设计中不可或缺的一部分。无论是简单的文本信息,还是复杂的富文本内容,text 和 rich-text 组件都能够帮助我们实现这些需求。本文将详细介绍这两个组件的基本用法,包…...

算法.图论-习题全集(Updating)

文章目录 本节设置的意义并查集篇并查集简介以及常见技巧并查集板子(洛谷)情侣牵手问题相似的字符串组岛屿数量(并查集做法)省份数量移除最多的同行或同列石头最大的人工岛找出知晓秘密的所有专家 建图及其拓扑排序篇链式前向星建图板子课程表 本节设置的意义 主要就是为了复习…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...