vue2/vue3中使用的富文本编辑器vue-quill
前言:
整理下常用的富文本编辑器工具。
vue3:
实现效果:
实现步骤:
1、安装插件, 编辑器核心插件 @vueup/vue-quill
yarn add
pnpm i
npm i
cnpm i
@vueup/vue-quill
@vueup/vue-quill
2、安装选择性插件 ,缩放图片插件
quill-blot-formatter
3、新建组件
1)引入基础编辑器插件
// 引入富文本编辑器与样式
import { Quill, QuillEditor } from '@vueup/vue-quill'
import '@vueup/vue-quill/dist/vue-quill.snow.css'
2)引入图片缩放插件
// 引入缩放图片的插件
import BlotFormatter from 'quill-blot-formatter'
Quill.register('modules/blotFormatter', BlotFormatter)
3)编辑器的配置
4)增加一个划过头部的提示效果
5)增加一个复制粘贴的效果
customEditor.vue 源码
<template><div class="editor">
<!-- 这两个都是获取值的必要条件: v-model:content contentType="html" --><quill-editorref="editorRef"v-model:content="content":options="options"contentType="html"></quill-editor></div>
</template><script setup lang="ts">
// 引入富文本编辑器与样式
import { Quill, QuillEditor } from '@vueup/vue-quill'
import '@vueup/vue-quill/dist/vue-quill.snow.css'// 引入缩放图片的插件
import BlotFormatter from 'quill-blot-formatter'
Quill.register('modules/blotFormatter', BlotFormatter)const content = ref('')
const editorRef = ref(null)
// 富文本配置
const options = ref({theme: 'snow', // 使用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: 'ltl' }], // 文本方向[{ direction: 'rtl' }], // 文本方向[{ indent: '-1' }, { indent: '+1' }], // 缩进[{ list: 'ordered' }, { list: 'bullet' }], // 有序、无序列表[{ script: 'sub' }, { script: 'super' }], // 上标/下标['blockquote', 'code-block'], // 引用 代码块['clean'], // 清除文本格式['link', 'image', 'video'], // 链接、图片、视频],handlers: {image: imageHandler, // 点击图片触发事件},},// 图片缩放blotFormatter: {// 可以在这里设置缩放样式// overlay: {// style: {// border: '2px solid red',// }// },toolbar: {mainClassName: 'blot-formatter__toolbar'}}}
})
// !!!如果方法报错,把imageHandler 方法放到options的上面
// 处理富文本图片上传
const imageHandler = () => {// 创建一个文件输入元素const input = document.createElement('input');input.setAttribute('type', 'file');input.setAttribute('accept', 'image/*');// 模拟点击,打开文件选择对话框input.click();// 当用户选择文件后触发的事件input.onchange = async () => {// 获取用户选择的文件const file = input.files ? input.files[0] : null;if (file) {// 创建一个 FormData 对象,用于文件上传const formData = new FormData();formData.append('file', file);try {/*** @todo 可以选中图片,然后把file文件给后端,后端给存到文件服务器,然后返回一个线上地址* 这里的abc替换成你的请求接口方法,也可以使用 axios 发送 POST 请求* */// todo// 使用 axios 发送 POST 请求,将文件上传到服务器,这里的abc替换成你的请求接口方法// 可以选中图片,然后把file文件给后端,后端给存到文件服务器,然后返回一个线上地址const res = await abc(formData);// 确保获取到 Quill 编辑器实例const quill = toRaw(editorRef.value).getQuill()if (quill) {// 获取当前光标位置const range = quill.getSelection(true);// 在当前光标位置插入上传的图片quill.insertEmbed(range.index, 'image', res.data);}} catch (error) {alert('图片上传失败')}}};
}// toolbar标题,划过富文本头部提示信息
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: '两端对齐' }
]
// 给富文本框工具栏加上鼠标悬浮中文提示
const initTitle = () => {for (let item of titleConfig) {// .editor 是富文本编辑器的类名let tip = document.querySelector('.editor ' + item.Choice);if (tip) {tip.setAttribute('title', item.title);}}
}// 自定义粘贴事件
const customPaste=(e)=>{// 获取当前最新时间 改名啥的可以用let newTime = new Date().getTime()const clipboardData = e.clipboardData // 粘贴信息const types = clipboardData.types // 当前文件类型if (types.includes('Files')) {e.preventDefault();e.clipboardData.files.forEach(file=>{// 在这里可以拿到粘贴后的图片与文件信息// 在这里做操作})}
}onMounted(()=>{nextTick(()=>{// 给富文本框工具栏加上鼠标悬浮中文提示initTitle()})// 给富文本增加粘贴事件editorRef.value.getQuill().root.addEventListener('customPaste', customPaste, false)
})</script><style scoped lang="scss">
.editor{width: 100%;:deep(.ql-editor) {min-height: 200px;}
}</style>
vue2
实现步骤:
1、安装插件
基础编辑器插件
npm install vue-quill-editor --save
进阶图片版本插件:拖拽缩放图片
npm install quill-image-drop-module -S //允许粘贴图像并将其拖放到编辑器中。
npm install quill-image-resize-module -S //允许调整图像大小
2、界面中使用
1)全局引入插件,main.js中
import VueQuillEditor from 'vue-quill-editor'
// 引入相关css
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'Vue.use(VueQuillEditor)
2)局部引入插件,直接在你自己封装的vue组件内部加
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'import { quillEditor, Quill } from 'vue-quill-editor' //引入插件export default {components: {quillEditor}}
3)如果装了图片拖拽以后的引入
vue.config.js 中
chainWebpack: (config) => {config.plugin('provide').use(webpack.ProvidePlugin,[{'window.Quill': 'quill/dist/quill.js','Quill': 'quill/dist/quill.js'}])
}
组件内部引入、全局就main.js中引入
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'
import { quillEditor, Quill } from 'vue-quill-editor'// 新增部分
import imageResize from 'quill-image-resize-module'
Quill.register('modules/imageResize', imageResize )
import { ImageDrop } from 'quill-image-drop-module'
Quill.register('modules/imageDrop', ImageDrop)
4)具体使用
html部分,引入插件后,注册后,直接用,以子组件的形式,v-model 监听就跟正常的一样
js部分
注意,如果不需要图片拖拽,就不用看第三步,把配置的直接删除就行了
customEditor.vue 源码
<template><div class="editor"><quill-editorclass="ql-editor"v-model="content"ref="myQuillEditor":options="editorOption"@blur="onEditorBlur($event)"@focus="onEditorFocus($event)"@change="onEditorChange($event)"></quill-editor></div>
</template><script>
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'
import { quillEditor, Quill } from 'vue-quill-editor'// 如果要图片拖拽功能,增加这两个插件
import imageResize from 'quill-image-resize-module'
Quill.register('modules/imageResize', imageResize )
import { ImageDrop } from 'quill-image-drop-module'
Quill.register('modules/imageDrop', ImageDrop)export default {name: "customEditor",components: {quillEditor},data(){return{content:'',// 富文本功能配置editorOption:{modules:{// 如果想增加事件控制,比如图片的事件,参考我上面vue3的配置,是一样的用法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': ['small', false, 'large', 'huge'] }], // 字体大小[{ 'header': [1, 2, 3, 4, 5, 6, false] }], //几级标题[{ 'color': [] }, { 'background': [] }], // 字体颜色,字体背景颜色[{ 'font': [] }], //字体[{ 'align': [] }], //对齐方式['clean'], //清除字体样式['image','video'] //上传图片、上传视频]},// 如果要图片拖拽功能,增加下面内容配置imageDrop: true, // 拖动加载图片组件。imageResize: { //调整大小组件。displayStyles: {backgroundColor: 'black',border: 'none',color: 'white'},modules: [ 'Resize', 'DisplaySize', 'Toolbar' ]}},}},methods:{// 失去焦点事件onEditorBlur(e){console.log(e, '失去焦点事件');},// 获得焦点事件onEditorFocus(e){console.log(e, '获得焦点事件');},// 内容改变事件// html是带标签,text是纯文本onEditorChange({ quill, html, text }){this.content = html},},mounted() {this.content = '<h1>我是个默认测试数据</h1>'}
}
</script><style scoped lang="scss">
.editor{width: 100%;:deep(.ql-editor) {min-height: 200px;}
}</style>
目前好用的其他工具:
monaco-editor 能实现跟vscode编辑器一样的在线编辑代码效果,还能代码比较
官网api地址:点我
其他资料地址:
Monaco-Editor在Vue中使用(实现代码编辑与diff代码比较)--类似vscode代码编辑器_monaco editor vue-CSDN博客文章浏览阅读1.3k次,点赞5次,收藏13次。Monaco-Editor 是一个由 Microsoft 开发的 Web 代码编辑器,它是 Visual Studio Code 的浏览器版本。在 Vue 项目中集成 Monaco-Editor 可以提供代码编辑、语法高亮、智能提示等功能。src/codeEditorMonaco.vue或者把以下代码放到app.vue文件中;1、安装使用,最好安装指定版本,我是 vue2 ,安装的版本。2、配置vue.config.js。_monaco editor vuehttps://blog.csdn.net/weixin_44834981/article/details/139239575
参考文献:
在Vue项目中vue-quill-editor的安装与使用【详细图解+过程+包含图片的缩放拖拽】-CSDN博客
相关文章:
vue2/vue3中使用的富文本编辑器vue-quill
前言: 整理下常用的富文本编辑器工具。 vue3: 实现效果: 实现步骤: 1、安装插件, 编辑器核心插件 vueup/vue-quill yarn add pnpm i npm i cnpm i vueup/vue-quill vueup/vue-quill 2、安装选择性插件 &a…...
论文阅读《BEVFormer v2》
BEVFormer v2: Adapting Modern Image Backbones to Bird’s-Eye-View Recognition via Perspective Supervision 目录 摘要1 介绍2 相关工作2.1 BEV三维目标检测器 摘要 我们提出了一种具有透视监督的新型鸟瞰图(BEV)检测器,其收敛速度更快…...

自动化运维(k8s):一键获取指定命名空间镜像包脚本
前言:脚本写成并非一蹴而就,需要不断的调式和修改,这里也是改到了7版本才在 生产环境 中验证成功。 该命令 和 脚本适用于以下场景:在某些项目中,由于特定的安全或政策要求,不允许连接到你的镜像仓库。然而…...

HarmonyOS ArkUI(基于ArkTS) 开发布局 (上)
一 ArkUI(基于ArkTS)概述 基于ArkTS的声明式开发范式的方舟开发框架是一套开发极简、高性能、支持跨设备的UI开发框架,提供了构建应用UI所必需的能力 点击详情 特点 开发效率高,开发体验好 代码简洁:通过接近自然语义的方式描述UI&#x…...

第九部分 :1.STM32之通信接口《精讲》(USART,I2C,SPI,CAN,USB)
本芯片使用的是STM32F103C8T6型号 STM32F103C8T6是STM32F1系列中的一种较常用的低成本ARM Cortex-M3内核MCU,具有丰富的通信接口,包括USART、SPI、I2C等。下面是该芯片上通信接口的管脚分布、每个接口的工作模式、常用应用场景和注意事项。 1. USART (通…...

5. langgraph中的react agent使用 (从零构建一个react agent)
1. 定义 Agent 状态 首先,我们需要定义 Agent 的状态,这包括 Agent 所持有的消息。 from typing import (Annotated,Sequence,TypedDict, ) from langchain_core.messages import BaseMessage from langgraph.graph.message import add_messagesclass …...
uniapp vue3的下拉刷新和上拉加载
开启页面的下拉刷新,注意这个不是可滚动视图的下拉刷新. 一般页面建议使用页面外的,不要使用scroll-view里面的下拉刷新. pages: "pages": [ {"path": "pages/index/index","style": {"navigationBarTitleText": "首…...

STM32设计井下瓦斯检测联网WIFI加Zigbee多路节点协调器传输
目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 本系统基于STM32微控制器和Zigbee无线通信技术,设计了…...
Vue 3 中的原生事件监听与组件事件处理详解
Vue 3 中的原生事件监听与组件事件处理完全指南 在 Vue 3 中,事件监听和事件处理是组件交互中的关键部分。Vue 提供了一套简单而强大的事件处理机制,可以方便地监听 DOM 原生事件和组件自定义事件。本篇文章将详细介绍 Vue 3 中事件的使用,包…...

Flink Source 详解
Flink Source 详解 原文 flip-27 FLIP-27 介绍了新版本Source 接口定义及架构 相比于SourceFunction,新版本的Source更具灵活性,原因是将“splits数据获取”与真“正数据获取”逻辑进行了分离 重要部件 Source 作为工厂类,会创建以下两…...
2024年了,TCP分析工具有哪些?
TCP分析工具广泛应用于网络调试、性能分析和协议学习。以下是一些常用的TCP分析工具,它们各有特点,适用于不同的场景: Wireshark - 这是一个非常强大的网络协议分析器,支持图形界面,可以捕获和分析TCP流量,…...

SRP 实现 Cook-Torrance BRDF
写的很乱! BRDF(Bidirectional Reflectance Distribution Function)全称双向反射分布函数。辐射量单位非常多,这里为方便直观理解,会用非常不严谨的光照强度来解释说明。 BRDF光照模型,上反射率公式&#…...
MySQL慢日志
慢查询日志顾名思义就是查询慢的sql语句可以记录到一个日志文件里,至于有多慢才会被记录,默认是10秒,但也可以通过系统配置来更改,慢日志在做系统优化时是一个非常好用的工具 #是否开启慢日志 show variables like slow_query_log…...
Flutter网络通信-封装Dio
前言 dio 是一个强大的 Dart HTTP 请求库,支持全局配置、Restful API、FormData、拦截器、 请求取消、Cookie 管理、文件上传/下载、超时以及自定义适配器等。 Dio的pub地址为:dio | Dart package 封装要求 能够使用get、post、put、patch、delete、…...
matlab 读取csv
需要跳过第一行表头等信息 1、读取整个文件 csvread(FILENAME)%文件路径 文件名2、指定起始位置 csvread(FILENAME, R, C)%从文件的第R行和第C列开始读取数据 逗号分开3、指定数据范围 csvread(FILENAME, R, C, [R1 C1 R2 C2])%读取从(R1, C1)到(R2, C2)范围内的数据注意&am…...

网络层9——虚拟专用网VPN和网络地址转换NAT
目录 一、为什么有虚拟专用网? 二、如何理解“虚拟专用网”? 三、IP隧道技术实现虚拟专用网 四、网络地址变换 一、为什么有虚拟专用网? 第一,IPv4只有32位,最多有40亿个全球唯一的IP地址数量不够,无法…...

开源科学工程技术软件介绍 – EDA工具KLayout
link 今天向各位知友介绍的 KLayout是一款由德国团队开发的开源EDA工具。 KLayout是使用C开发的,用户界面基于Qt。它支持Windows、MacOS和Linux操作系统。安装程序可以从下面的网址下载: https://www.klayout.de/build.html KLayout图形用户界面&…...
【网络安全】Cookie SameSite属性
未经许可,不得转载。 文章目录 背景CSRF 攻击SameSite 属性StrictLaxNone背景 为了有效防止 CSRF 攻击并保护用户隐私,Chrome 从 51 版本开始引入了 SameSite 属性,专门用于限制第三方 Cookie 的使用,进而减少安全风险。 CSRF 攻击 跨站请求伪造(CSRF)攻击是指恶意网站…...

Linux 命令 | 每日一学,文本处理三剑客之awk命令实践
[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 0x00 前言简述 描述:前面作者已经介绍了文本处理三剑客中的 grep 与 sed 文本处理工具,今天将介绍其最后一个且非常强大的 awk 文本处理输出工具,它可以非常方便…...

RabbitMQ的工作队列在Spring Boot中实现(详解常⽤的⼯作模式)
上文着重介绍RabbitMQ 七种工作模式介绍RabbitMQ 七种工作模式介绍_rabbitmq 工作模式-CSDN博客 本篇讲解如何在Spring环境下进⾏RabbitMQ的开发.(只演⽰部分常⽤的⼯作模式) 目录 引⼊依赖 一.工作队列模式 二.Publish/Subscribe(发布订阅模式) …...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...