vue3项目引入VueQuill富文本编辑器(成功)及 quill-image-uploader 图像模块(未成功)

news/2024/5/20 20:24:37

tip:重点解释都写在代码注释里了,方便理解,所以看起来比较密集

富文本基本使用

项目文件夹路径安装依赖
npm install @vueup/vue-quill@latest --save

全局注册:main.js

// main.js// 自己项目的一些配置(只放了主要的)
import { createApp } from "vue";
import App from "./App.vue";
import router from "./routers/index.js";
// 别的一些配置(省略...)// 引入 quill 富文本编辑器
import { QuillEditor } from "@vueup/vue-quill";
import "@vueup/vue-quill/dist/vue-quill.snow.css"; // 对应的css样式【必须】// 实例化App后挂载到根组件#app上
createApp(App).use(router).component("QuillEditor", QuillEditor) // 注入富文本编辑器组件.mount("#app");

使用:在我的某个组件中EditArticle.vue使用,我的需求是放在表单中作为表单项使用

<el-formref="ruleFormRef":model="updateForm"class="updateForm"label-position="top"size="default"status-iconstyle="font-weight: bold; width: 60%; margin: 0 auto"
><!-- 省略别的表单项...和富文本使用没关系 --><el-form-item label="资讯内容" prop="content"><!-- 这是我一开始用输入框的写法,不用在意 --><!-- <el-input v-model="updateForm.content" /> --><!-- 【敲黑板!!!这里有重点!!!】1. 设置一个 div 控制工具栏的宽度2. theme是主题样式,有两种好像,这是全局注册时引入的那个css样式,直接使用3. toolbar是工具栏的配置,可以用官方提供的选项essential、minimal、full和""使用默认选项(使用就是 toolbar="essential",不用v-model动态绑定);我这里按自己的需求配置了一下(放在我的公共工具文件里了,然后直接在本文件下导入使用即可)4. contentType是官方提供的一个Api props,三种类型 "delta"(默认) | "html" | "text",我理解的该项的作用就是让你富文本编辑器的内容以什么方式渲染,我这里用的是html,也就是直接带格式显示(我不设置这一选项,内容就无法显示)5. style 设置了最小高度,否则没内容时就会很难看6. :content 是官方提供的动态绑定数据的写法,是固定的哈【重要】,我一开始没看到官方文档的这个选项,导致我内容渲染不出来,值就是你自己要显示的那个值,绑上去就行--><div style="width: 100%"><!-- 根据官方文档,全局注册后直接引用 --><QuillEditortheme="snow":toolbar="toolbarOptions"contentType="html"style="min-height: 200px":content="updateForm.content"/></div></el-form-item>
</el-card>

还是上面这个EditArticle.vue中,我的js代码(使用setup语法糖)

<script setup>
// 引入我配置的工具栏配置(下面附有具体配置)
import { toolbarOptions } from "@/utils/util";
</script>

这是我的公共工具文件util.js文件

/*** quill 富文本工具栏配置*/
export const toolbarOptions = [  // export导出 才能在别的组件文件里导入 然后引用
// 每一个 [] 是一个分组的意思,没啥影响,就是页面组与组直接会有一点间隔[{ header: [1, 2, 3, 4, 5, 6, false] }],["bold", "italic", "underline", "strike"],["link", "image"],[{ script: "sub" }, { script: "super" }],
];

好,到这里应该就是可以显示一个基本的富文本编辑器了,存到数据库里也是按照 html 标签 + 纯文本内容 存的

笔者这里引入组件后,浏览器会有一个警告:应该是兼容性问题?不太清楚,配置反正是跟着官方来的
[Deprecation] Listener added for a ‘DOMNodeInserted’ mutation event. This event type is deprecated, and will be removed from this browser very soon. Usage of this event listener will cause performance issues today, and represents a large risk of future site breakage. Consider using MutationObserver instead. See https://chromestatus.com/feature/5083947249172480 for more information.

升级需求,插入图片

按照上述配置直接插入图片,我发现存的是很长一串字符串,术语就是base64编码格式,官网也说了这个问题:

在这里插入图片描述

接着就是跟着官方给的文档,按照自己的需求配一下,即图片在富文本中引用时,传到服务器,将返回的链接地址存到数据库

我看很多文章都是借助了elementupload上传组件,我个人不太想使用这种方式。若是项目没有使用该组件库呢,所以决定还是用官方文档提供的方法

依旧是项目文件夹路径下安装依赖
npm install quill-image-uploader --save

我这里依旧使用全局注册
有坑,如果你要用这种方式,请看完这部分内容再决定用不用!目前笔者没有成功,本文只是记录一下使用该工具的配置过程,若是后面解决了,会同步到本文里)

全局注册:main.js 在上面配置的基础上加入以下代码

import { createApp } from "vue";
import App from "./App.vue";
import router from "./routers/index.js";
// 别的一些配置(省略...)// 引入 quill 富文本编辑器
import { QuillEditor } from "@vueup/vue-quill";
import "@vueup/vue-quill/dist/vue-quill.snow.css"; // 对应的css样式【必须】// 【看这里!!!新引入的模块!!!】 引入 Quill 富文本编辑器 图片模块
import ImageUploader from "quill-image-uploader";
import "quill-image-uploader/dist/quill.imageUploader.min.css"; // 官网没说这里,这是我看该模块的github上的issue上有人提到的(有兴趣的可以去看看:https://github.com/NoelOConnell/quill-image-uploader/issues)
import { postUploadFile } from "@/api/common"; // 这是我自己的上传文件的接口,在api文件中已经定义好了,这里直接导入使用即可(有需要的话可以找我看一下配置,用的axios二次封装,后端是springboot)
// 官网示例是直接发axios请求,若你有不同的请求需求,可以搜一下相关文章,我这里不做赘述// 此处不需要使用Quill.register再注册了,会提示重复注册// 全局配置 modules 这里可以抽取成单独的文件 笔者不做抽取
const modules = {name: "imageUploader",module: ImageUploader,options: {upload: (file) => {return new Promise(async (resolve, reject) => {const formData = new FormData();formData.append("file", file);// console.log(formData.get("file")); // 通过get方法可以查看到文件对象的信息;注意这里直接打印formData是看不到内容的try {const res = await postUploadFile(formData);	// debugger 时发现执行到这句出现报错,但是图片上传阿里云是没问题的,返回的链接也正常// resolve(res.data)return res.data;} catch (error) {reject("上传失败");console.error("Error:", error);}});},},
};// 将App create()实例化后挂载到根组件#app上
createApp(App).use(router).component("QuillEditor", QuillEditor) // 注入富文本编辑器组件.provide("$modules", modules) // 使用provide导出模块配置【看这里!!!新增的!!!】.mount("#app");

回到EditArticle.vue
在js中先注入该配置

import { inject } from "vue";const modules = inject("$modules");

然后在使用富文本编辑器处加入::modules 配置

<div style="width: 100%"><QuillEditortheme="snow":toolbar="toolbarOptions"contentType="html"style="min-height: 200px":content="updateForm.content":modules="modules"/>
</div>

按道理来说,应该可以成功了,但是并没有…先记录一下,笔者找找别的办法

问题

图片上传服务器是成功的,服务器能够返回图片链接,但是 imageUploader 模块无法正常显示图片并报错(2个)

报错1: Unable to create imageBlot blot

报错2:TypeError: Cannot read properties of null (reading ‘ops’)
解决报错2,使用 return 不使用 resolve(res.data) 能解决报错

弄了一晚上,也没解决,这两个问题可能是兼容性导致的,源码的issue上也有人提到了,但是还没解决


http://www.mrgr.cn/p/84301707

相关文章

vue+ant-design+formBuiler表单构建器——技能提升——form design——亲测有效

最近看到后端同事在弄一个后台管理系统&#xff0c;额&#xff0c;前端真的是夹缝中生存啊&#xff0c;AI抢饭碗&#xff0c;后端也想干前端的活儿。。。 他用到了表单构建器&#xff0c;具体效果如下: 网上有很多适用于ElementUi和ant-design的form design插件&#xff0c;下…

wePWNise:一款功能强大的红队Office宏VBA代码生成工具

关于wePWNise wePWNise是一款功能强大的Office宏VBA代码生成工具&#xff0c;该工具基于纯Python开发&#xff0c;可以帮助广大研究人员生成用于Office宏或模版的VBA代码&#xff0c;并以此来测试目标Office环境、应用程序控制和防护机制的安全性。 wePWNise的设计理念将自动化…

20211317李卓桐 Exp6 MSF攻防实践 实验报告

Exp6 MSF攻防实践 实践内容本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路。具体需要完成: 1.1一个主动攻击实践,尽量使用最新的类似漏洞; 1.2 一个针对浏览器的攻击,尽量使用最新的类似漏洞; 1.3 一个针对客户端的攻击,如Adobe或office,尽量使…

深入理解Django:中间件与信号处理的艺术

title: 深入理解Django:中间件与信号处理的艺术 date: 2024/5/9 18:41:21 updated: 2024/5/9 18:41:21 categories:后端开发tags:Django 中间件 信号 异步 性能 缓存 多语言引言 在当今的Web开发领域,Django以其强大的功能、简洁的代码结构和高度的可扩展性,已成为众多开发者…

JAVA链表相关习题2

1.反转一个单链表。 . - 力扣&#xff08;LeetCode&#xff09; //2在1前面 //1在3前面 //ListNode curhead.next //head.nextnull(翻转后头节点变为最后一个节点) // while(cur ! null) { //记录 当前需要翻转节点的下一个节点 ListNode curNext cu…

零知识证明: Tornado Cash 项目学习

前言 最近在了解零知识证明方面的内容,这方面的内容确实不好入门也不好掌握,在了解了一些基础的概念以后,决定选择一个应用了零知识证明的项目来进行进一步的学习。最终选择了 Tornado Cash 这个项目,因为它著名且精致,适合入门的同学进行学习。 学习 Tornado Cash 项目,…

高并发秒杀项目随手笔记

1 数据库基字符集为什么选择utf8mb4? 2 在 MyBatis 中,JavaBean 属性名和数据库字段名的映射非常关键,正确设置这一映射是保证数据正确封装到 JavaBean 中的前提。以下是 MyBatis 映射机制的详细解释: 1. 默认映射行为 如果在 MyBatis 的 <resultMap> 中没有明确指定…

创建数据库

#数据库的操作 #删除数据库指令 DROP DATABASE hsp_db01;#hsp_db01这个对应的是数据 #用指令创建数据库 CREATE DATABASE hsp_db01; #创建一个使用utf8字符集的hsp_db02数据库 CREATE DATABASE hsp_db02 CHARACTER SET utf8 #创建一个使用utf8字符集,并带校队规则的hsp_db03数…

前后端数据交互形式随手笔记

注解@RequestParam Map<String, String> params 的使用1 在Spring MVC中,使用@RequestParam Map<String, String> params可以接收前端发出的请求参数并将它们作为一个Map收集起来。这种方式非常灵活,可以处理来自前端的各种数据提交形式。以下是一些常见的前端数…

【华为】AC直连二层组网隧道转发实验配置

【华为】AC直连二层组网隧道转发实验配置 实验需求拓扑配置AC数据规划表 AC的配置顺序AC1基本配置(二层通信)AP上线VAP组关联--WLAN业务流量 LSW1AR1STA获取AP的业务流量 配置文档 实验需求 AC组网方式&#xff1a;直连二层组网。 业务数据转发方式&#xff1a;隧道转发。 DHC…

SpringBoot随手笔记

SpringBoot随手笔记 0 关于火狐浏览器什么时候会发出http请求的说明 在抓包的情况下(按下F12后的模式),不管是刷新页面还是在浏览器地址栏回车,该页面中的图片都会发出http请求; 但如果不是抓包的模式下,如果访问的页面和上一次访问的页面相同(地址栏的地址没有更改),不管是…

Maven随手笔记

1 当同时存在多个maven软件时,在windows上要如何区分?查看当前使用的是哪个maven的指令,mvn -v C:\Users\yangd>mvn -vApache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)Maven home: D:\Java_developer_tools\Must_learn_must_know_technology\MavenProgra…

解决$‘\r‘: command not found 或syntax error near unexpected token `$‘\r‘的四个方法

问题原因&#xff1a; 两个报错原因都是Linux和windows下的回车换行符不兼容 解决方法&#xff1a; 方法一&#xff1a;在windows系统可以用文本编辑器查看所有字符&#xff0c;例如notepad&#xff0c;编辑->档案格式转换->转换为UNIX格式 方法二&#xff1a;在Linux系…

XN297 2.4GHz 单片高速无线收发芯片

概述 XN297是一款工作在2.400~2.483GHz世界通用ISM频段的单片无线收发芯片。该芯片集成 射频收发器、频率发生器、晶体振荡器、调制解调器等功能模块&#xff0c;并且支持一对多组网和带 ACK的通信模式。发射输出功率、工作频道以及通信数据率均可配置。 主要特性 1、低功…

爬虫:爬取豆瓣电影

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 上篇我们将到如何利用xpath的规则&#xff0c;那么这一次&#xff0c;我们将通过案例来告诉读者如何使用Xpath来定位到我们需要的数据&#xff0c;就算你不懂H5代码是怎么个嵌套或者十分复…

springboot seata 全局捕获异常失效

问题:Spring boot使用@ControllerAdvice或@RestControllerAdvice全局捕获异常时,捕获不到自己抛出的相应异常 首先看一下全局异常组件有么有被扫描到如何查看,很简单只需要写一段类加载打印代码,如下 如果启动时,打印了你写的字符串就说明时烧苗到了 这就说明是其他的问题…

第二证券|炒股是波段好还是长期好?

炒股长时间比波段好一些&#xff0c;其原因如下&#xff1a; 1、长时间持有费用低 投资者在生意过程中&#xff0c;需求交纳必定的佣金费用、过户费用、印花税&#xff0c;而长时间持有股票&#xff0c;减少生意次数&#xff0c;能够节省一笔生意成本。 2、短期持有容易卖飞…

一种新的基于机器学习的示波法血压估计方法,开源、低功耗、低成本的人工智能软硬件提供者

具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能 血压的测量和预测是心脏病患者和有心脏问题的人的一个重要条件,应该保持持续的控制。在这项研究中,基于从使用袖带的个体获得的振荡波形,振荡波形分为三个周期。第一个周期是从起点到收缩压(SBP),第…

该做的都做了,但LCD还是啥都不显示

cubemx中不用配置lcd引脚&#xff0c;在lcd_init函数中就初始化好引脚了&#xff01;