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'}}}
})
// 处理富文本图片上传
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博客

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【星海随笔】ZooKeeper-Mesos

开源的由 Twitter 与 伯克利分校的 Mesos 项目组共同研发设计。 两极调度架构 支持高可用集群&#xff0c;通过ZooKeeper进行选举。 Mesos master 管理着所有的 Mesos slave 守护进程 每个slave运行具体的任务或者服务。 Franework 包括的调度器和执行机两部分 执行器运行在Me…

Spring Cloud Eureka 服务注册与发现

Spring Cloud Eureka 服务注册与发现 一、Eureka基础知识概述1.Eureka两个核心组件2.Eureka 服务注册与发现 二、Eureka单机搭建三、Eureka集群搭建四、心跳续约五、Eureka自我保护机制 一、Eureka基础知识概述 1.Eureka两个核心组件 Eureka Server &#xff1a;服务注册中心…

前后端分离练习(云客项目)

这几天学习了一点前端的开发&#xff0c;后面通过这个小项目来整理开发的过程&#xff0c;参考的是动力节点的动力云客这个项目&#xff0c;大家有兴趣可以去看一下视频&#xff0c;我更多的是学习了它的前端开发&#xff0c;后端我是用自己的方式来的&#xff0c;那么开始今天…

Spring boot + Vue2小项目基本模板

Spring boot Vue2小项目基本模板 基本介绍基本环境安装项目搭建最终效果展示 基本介绍 项目来源哔哩哔哩的青戈&#xff0c;跟着学习搭建自己的简单vue小项目&#xff1b;看别人的项目总觉得看不懂&#xff0c;需要慢慢打磨 这里目前只简单的搭建了菜单导航和表格页面&#x…

金融领域先锋!海云安成功入选2024年人工智能先锋案例集

近日&#xff0c;中国人工智能产业发展联盟《2024年人工智能先锋案例集》&#xff08;以下简称“AIIA先锋案例集”&#xff09;在中国人工智能产业发展联盟第十三次全体会议上正式发布。该案例集由人工智能产业发展联盟&#xff08;AIIA&#xff09;、工业和信息化部新闻宣传中…

基于OpenCV的图片人脸检测研究

目录 摘要 第一章 引言 第二章 基于 OpenCV 的图片人脸检测 2.1 实现原理 2.2 代码实现与分析 2.3 代码详细分析 第三章 实验结果与分析 第四章 OpenCV 人脸检测的优势与局限性 4.1 优势 4.2 局限性 第五章 结论 第六章 未来展望 参考文献 摘要 人脸检测是计算机视…

【计算机毕设】无查重 基于python豆瓣电影评论舆情数据可视化系统(完整系统源码+数据库+开发笔记+详细部署教程)✅

目录 【计算机毕设】无查重 基于python豆瓣电影数据可视化系统&#xff08;完整系统源码数据库开发笔记详细部署教程&#xff09;✅ 一、项目背景 二、项目目标 三、项目功能 四、开发技术介绍 五、数据库设计 六、项目展示 七、开发笔记 八、启动步骤文档 九、权威教…

Python学习从0到1 day29 Python 高阶技巧 ⑦ 正则表达式

目录 一、正则表达式 二、正则表达式的三个基础方法 1.match 从头匹配 2.search&#xff08;匹配规则&#xff0c;被匹配字符串&#xff09; 3.findall&#xff08;匹配规则&#xff0c;被匹配字符串&#xff09; 三、元字符匹配 单字符匹配&#xff1a; 注&#xff1a; 示例&a…

[Python学习日记-67] 封装

[Python学习日记-67] 封装 简介 如何隐藏类中的属性 封装并不是单纯意义的隐藏 封装与扩展性 特性&#xff08;property&#xff09; 简介 从封装本身的意思去理解&#xff0c;封装就好像是拿来一个麻袋&#xff0c;把小猫、小狗、小王八和小猪一起装进麻袋&#xff0c;然…

@Autowired 和 @Resource思考(注入redisTemplate时发现一些奇怪的现象)

1. 前置知识 Configuration public class RedisConfig {Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template new RedisTemplate<>();template.setConnectionFactory(facto…

MongoDB分布式集群搭建----副本集----PSS/PSA

MongoDB分布式集群 Replication 复制、Replica Set 复制集/副本集 概念 一、 副本集的相关概念 1.概念 “ A replica set is a group of mongod instances that maintain the same data set. ” 一组MongoDB服务器&#xff08;多个mongod实例&#xff09;&#xff08;有不…

五、函数封装及调用、参数及返回值、作用域、匿名函数、立即执行函数

1. 函数基本使用 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style&…

数据分析-48-时间序列变点检测之在线实时数据的CPD

文章目录 1 时间序列结构1.1 变化点的定义1.2 结构变化的类型1.2.1 水平变化1.2.2 方差变化1.3 变点检测1.3.1 离线数据检测方法1.3.2 实时数据检测方法2 模拟数据2.1 模拟恒定方差数据2.2 模拟变化方差数据3 实时数据CPD3.1 SDAR学习算法3.2 Changefinder模块3.3 恒定方差CPD3…

第八节 如何结合AAA实现用户远程登录-路由基础

关于调试设备的登录方式&#xff0c;一共有三种&#xff1a; 第一个&#xff1a;console&#xff1a;需要工程师在现场&#xff0c;进行登录&#xff0c;设备开局的时候使用 第二个&#xff1a;telnet ssh&#xff1a;基于网络互通的前提下进行登录的&#xff0c;远程登录 第三…

【Conda】Windows下conda的安装并在终端运行

下载 在官网下载 https://www.anaconda.com/download/success 安装 双击 一直下一步安装 配置环境变量 为了在终端运行&#xff0c;需配置环境变量 进入到安装conda的目录并复制路径 设置高级环境变量 在终端运行 输入&#xff1a; conda list表明可以正常运行 参考…

LogViewer NLog, Log4Net, Log4j 文本日志可视化

LogViewer 下载 示例&#xff1a;NLog文本日志可视化软件&#xff0c;并且能够实时监听输出最新的日志 nlog.config 通过udp方式传输给LogViewer (udp://ip:port) <?xml version"1.0" encoding"utf-8" ?> <nlog xmlns"http://www.nlog-…

MuMu模拟器安卓12安装Xposed 框架

MuMu模拟器安卓12安装Xposed 框架 当开启代理后,客户端会对代理服务器证书与自身内置证书展开检测,只要检测出两者存在不一致的情况,客户端就会拒绝连接。正是这个原因,才致使我们既没有网络,又抓不到数据包。 解决方式: 通过xposed框架和trustmealready禁掉app里面校验…

Python Web 应用开发基础知识

Python Web 应用开发基础知识 引言 随着互联网的快速发展&#xff0c;Web 应用程序的需求日益增加。Python 作为一种简单易学且功能强大的编程语言&#xff0c;已经成为 Web 开发中广受欢迎的选择之一。本文将深入探讨 Python Web 开发的基础知识&#xff0c;包括常用框架、基…

CSS Module:告别类名冲突,拥抱模块化样式(5)

CSS Module 是一种解决 CSS 类名冲突的全新思路。它通过构建工具&#xff08;如 webpack&#xff09;将 CSS 样式切分为更加精细的模块&#xff0c;并在编译时将类名转换为唯一的标识符&#xff0c;从而避免类名冲突。本文将详细介绍 CSS Module 的实现原理和使用方法。 1. 思…

动力商城-03 Idea集成apifox Mybatis-Plus字段策略

1.Idea下载apifox插件 2.新建令牌放入Idea 3.右键上传到对应接口 4.设置前置url 插件能够自动识别swagger注解 Mybatis-Plus字段策略 1、FieldStrategy作用 Mybatis-Plus字段策略FieldStrategy的作用主要是在进行新增、更新时&#xff0c;根据配置的策略判断是否对实体对…