QuillEditor富文本结合vue3使用,可单独抽离成组件,富文本的内容可自定义

实现效果:

上方的粗体、斜体、字号、字体等各种信息支持自定义配置。

实现方式:

下面的介绍为分步骤的详细介绍,完整版纯享代码可参考这篇博客富文本QuillEditor+vue3组件代码纯享版-CSDN博客

1.新建一个新文件--子组件,如命名为QuillEditor.vue

2.安装插件QuillEditor

npm install QuillEditor

3.引入QuillEditor,template中

下面中没有的插件,自行安装即可。

<template><div style="display: block; width: 100%; height: 100%"><QuillEditorref="quillRef"v-model:content="content":options="myOptions"contentType="html"@update:content="setValue()"/></div>
</template><script setup>
import Compressor from 'compressorjs';
import { QuillEditor, Quill } from '@vueup/vue-quill';
import '@vueup/vue-quill/dist/vue-quill.snow.css';
import ImageUploader from 'quill-image-uploader';
import ImageResize from 'quill-image-resize-custom-module';
import { uploadFilesSysFile } from '@/api/api';
import '@/styles/QuillFont.css'; // 字体和字体大小的自定义文件</script>

4.配置QuillEditor

下面的内容都是配置在script中。

(1)富文本的总体配置项

const props = defineProps({// 左侧菜单数据modelValue: String,
});
const emit = defineEmits(['update:modelValue']);
const content = ref('');
const quillRef = ref(null);
// 富文本配置项,将模块功能一起写入到配置项内,也可以单独配置Modules
const myOptions = reactive({modules: {toolbar: {container: [['bold', 'italic', 'underline', 'strike'], // 加粗、斜体、下划线、删除线[{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题,不同级别的标题[{ align: [] }], // 对齐方式['blockquote', 'code-block'], // 引用,代码块[{ script: 'sub' }, { script: 'super' }], // 上标/下标[{ list: 'ordered' }, { list: 'bullet' }], // 有序、无序列表[{ indent: '-1' }, { indent: '+1' }], // 缩进['link', 'image', 'video'], // 超链接 图片 视频[{ direction: 'rtl' }], // 文本方向[{ color: [] }, { background: [] }], // 字体颜色和背景色[{ size: fontSizeStyle.whitelist }], // 字体大小[{ font: fontStyle.whitelist }], // 字体[{ lineheight: lineHeight }], // 设置行高['clean'], // 清除格式],handlers: {lineheight: (value) => {const editor = quillRef.value.getQuill();if (value) {editor.format('lineHeight', value);}},},},// 上传图片--进行压缩并修改为服务器地址imageUploader: {upload: async (file) => {try {const compressedFile = await compressImage(file); // 压缩图片// 将Blob格式转化为File格式const fileVal = new File([compressedFile], compressedFile.name, {type: compressedFile.type,lastModified: Date.now(),});return new Promise((resolve, reject) => {const formData = new FormData();formData.append('files', fileVal);uploadFilesSysFile(formData).then((res) => {resolve(window.Global.commonPreviewImage_URL + res.data); // 图片的服务器地址展示}).catch((err) => {// eslint-disable-next-line prefer-promise-reject-errorsreject('Upload failed');console.error('Error:', err);});});} catch (error) {console.error('压缩和上传图像时出错:', error);return false;}},},// 设置图片的大小--可拖拽设置大小imageResize: {parchment: Quill.import('parchment'),},},placeholder: '请输入内容...',
});Quill.register(fontSizeStyle, true);
Quill.register(fontStyle, true);
Quill.register('modules/imageUploader', ImageUploader);
Quill.register('modules/imageResize', ImageResize);const setValue = () => {// 用于设置双向绑定值const text = toRaw(quillRef.value).getHTML();emit('update:modelValue', text);
};watch(() => props.modelValue,(val) => {if (val) {content.value = val; // 用于监听绑定值进行数据回填} else {// eslint-disable-next-line no-unused-expressionstoRaw(quillRef.value) && toRaw(quillRef.value).setContents(''); // 可用于弹窗使用富文本框关闭弹窗清除值}},{immediate: true, // 组件创建时立即执行一次回调},
);

Tips:下面是几项特殊的配置,除上面的配置外,还应多加上下面的这些代码。

(2)配置行高

在子组件中配置行高,同时要新建一个行高的css样式文件,子组件中配置的行高数值,css文件中都应该进行了定义才能被有效引用。

// 设置行高的配置======start
const lineHeight = ['1', '1.25', '1.5', '1.75', '2.5', '3', '5'];
const parchment = Quill.import('parchment');
const lineHeightConfig = {scope: parchment.Scope.INLINE,whitelist: lineHeight,
};
const lineHeightStyle = new parchment.Attributor.Style('lineHeight','line-height',lineHeightConfig,
);
Quill.register({ 'formats/lineHeight': lineHeightStyle }, true);
// 设置行高的配置======end

行高的css文件QuillLineHeight.css

.ql-snow .ql-picker.ql-lineheight .ql-picker-label::before {content: '行高';
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value='1']::before {content: '1';
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value='1.5']::before {content: '1.5';
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value='1.75']::before {content: '1.75';
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value='2']::before {content: '2';
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value='3']::before {content: '3';
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value='4']::before {content: '4';
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value='5']::before {content: '5';
}
.ql-snow .ql-picker.ql-lineheight {width: 70px;
}

(3)配置字号

下面的字号会显示在富文本的字号中,但需配置一个总体的字号文件,此处将字号和字体的样式文件放在同一个css中了,命名为QuillFont.css。

// 设置字体大小
const fontSizeStyle = Quill.import('attributors/style/size'); // 引入这个后会把样式写在style上
fontSizeStyle.whitelist = ['12px','14px','16px','18px','20px','22px','24px','28px','30px',
];

QuillFont.css文件的样式

.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 {font-family: SimHei;content: '黑体';
}
.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 {font-family: 'Microsoft YaHei';content: '微软雅黑';
}
.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 {font-family: KaiTi;content: '楷体';
}
.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 {font-family: FangSong;content: '仿宋';
}
.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 {font-family: SimSun;content: '宋体';
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value='STFANGSO']::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value='STFANGSO']::before {font-family: STFANGSO;content: '华文仿宋';
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value='STKAITI']::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value='STKAITI']::before {font-family: STKAITI;content: '华文楷体';
}
.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 {font-family: Arial;content: '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 {font-family: 'Times New Roman';content: '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 {font-family: sans-serif;content: '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;
}/* 字号设置 *//* 默认字号 */
.ql-snow .ql-picker.ql-size .ql-picker-label::before,
.ql-snow .ql-picker.ql-size .ql-picker-item::before {content: '字号';
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='12px']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='12px']::before {font-size: 12px;content: '12px';
}
.ql-size-12px {font-size: 12px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='14px']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='14px']::before {font-size: 14px;content: '14px';
}
.ql-size-14px {font-size: 14px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='16px']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='16px']::before {font-size: 16px;content: '16px';
}
.ql-size-16px {font-size: 16px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='18px']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='18px']::before {font-size: 18px;content: '18px';
}
.ql-size-18px {font-size: 18px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='20px']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='20px']::before {font-size: 20px;content: '20px';
}
.ql-size-20px {font-size: 20px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='22px']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='22px']::before {font-size: 22px;content: '22px';
}
.ql-size-24px {font-size: 24px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='24px']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='24px']::before {font-size: 24px;content: '24px';
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='26px']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='26px']::before {font-size: 26px;content: '26px';
}
.ql-size-26px {font-size: 26px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='28px']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='28px']::before {font-size: 28px;content: '28px';
}
.ql-size-28px {font-size: 28px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='30px']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='30px']::before {font-size: 30px;content: '30px';
}
.ql-size-30px {font-size: 30px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='32px']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='32px']::before {font-size: 32px;content: '32px';
}
.ql-size-32px {font-size: 32px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='36px']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='36px']::before {font-size: 36px;content: '36px';
}
.ql-size-36px {font-size: 36px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='40px']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='40px']::before {font-size: 40px;content: '40px';
}
.ql-size-40px {font-size: 40px;
}

(4)配置字体

// 设置字体
const fontStyle = Quill.import('attributors/style/font'); // 引入这个后会把样式写在style上
fontStyle.whitelist = ['SimSun', // 宋体'SimHei', // 黑体'STFANGSO', // 华文仿宋'Microsoft-YaHei', // 微软雅黑'KaiTi', // 楷体'FangSong', // 仿宋'STKAITI', // 华文楷体'Arial','Times-New-Roman','sans-serif',
];

(5)图片压缩

有时上传的图片过大,会影响运行速度及性能展示。

// 图片压缩
const compressImage = (file) => {return new Promise((resolve, reject) => {// eslint-disable-next-line no-newnew Compressor(file, {quality: 0.6, // 设置压缩质量success(result) {resolve(result);},error(error) {reject(error);},});});
};

5.设置样式

<style>
.ql-container {height: calc(100% - 42px);
}
</style>

6.父组件的使用

以上5步为富文本的子组件内容及相关的样式文件,组件准备好之后在相应的页面及父组件中引入使用。

父组件的template中

<QuillEditor v-model="content"  />

父组件的script中


import QuillEditor from '@/components/QuillEditor.vue';const content = ref('');

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

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

相关文章

git应用最佳实践

插&#xff1a; AI时代&#xff0c;程序员或多或少要了解些人工智能&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家(前言 – 人工智能教程 ) 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家…

QGraphicsView实现简易地图19『迁徙图』

模仿echarts的迁徙图效果 用到了前2篇制作的散点(涟漪效果)和两年前的路径动画类&#xff1b;然尾迹效果未依附路径&#xff0c;有待优化。 动态演示效果 静态展示图片 核心代码 #pragma once #include "Item/AbstractGeoItem.h" #include "DataStruct/GeoD…

php之文件操作代码审计

1 PHP文件操作函数 1.1 PHP文件操作函数 文件包含 include/require/include_once/require_once 文件读取 file_get_contents/fread/readfile/file 文件写入 file_put_contents/fwrite/mkdir/fputs 文件删除 unlink/rmdir 文件上传 move_uploaded_file/copy/rename 1.2 文…

IO流(1)

定义&#xff1a;存取和读取数据的解决方案 作用&#xff1a;用于读写数据&#xff08;本地文件、网络&#xff09; 分类&#xff1a; 一种是&#xff1a;输出流和输入流。 一种是&#xff1a;字节流和字符流。 字节流 字节流——FileOutputStream&#xff08;字节输出流&…

(函数)判断一句话中最长的单词(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//声明函数&#xff1b; int aiphabetic(char); int longest(char[]);int main() {//初始化变量值&#xff1b;int i;char line[100] { 0 };//获取用户输入字符…

Gradle命令打包 Execution failed for task ‘:app:compileDebugJavaWithJavac错误

Gradle命令打包的时候遇到的&#xff0c;Gradle的java版本不对导致的&#xff0c;用的17&#xff0c;换成11的就能正常打包了。

大模型管理工具Ollama搭建及整合springboot

目录 一、Ollama介绍 1.1 什么是Ollama 1.2 Ollama特点与优势 二、Ollama本地部署 2.1 版本选择 2.2 下载安装包 2.3 执行安装 2.4 Ollama常用命令 三、使用Ollama部署千问大模型 3.1 千问大模型介绍 3.2 部署过程 四、springboot接入Ollama 4.1 引入Ollama依赖 4…

树莓派LCD显示屏安装驱动详细教程

使用LCD显示屏有两种方式&#xff0c;1.如果你已安装好树莓派官方系统&#xff0c;需要单独安装驱动才可点亮显示屏。 2. 也可以直接烧录我们提供的系统 里面已含驱动程序。 一&#xff1a;连接方式 按照下图方式连接好LCD显示屏与树莓派主板 二&#xff1a;安装系统镜像&…

6个适合在家做的副业兼职,做得好的月入过万,适合上班族和宝妈

嘿&#xff0c;亲爱的朋友们&#xff01;是不是常常觉得钱包瘪瘪&#xff0c;却又因为种种原因无法外出兼职&#xff1f; 别急&#xff0c;我来为大家揭秘几个在家也能轻松赚钱的靠谱副业&#xff0c;让你足不出户也能月入过万&#xff0c;从此告别财务烦恼&#xff01; 副业一…

1.5.3 基于Java配置方式使用Spring MVC

本实战教程主要介绍了如何使用Java配置方式来使用Spring MVC框架。相较于XML配置方式&#xff0c;Java配置方式提供了一种更为简洁和灵活的配置方法。 项目创建与配置 创建一个Jakarta EE项目&#xff0c;并设置项目名称和位置。选择Jakarta EE 10版本&#xff0c;不添加依赖&a…

404.左叶子之和

计算给定二叉树的所有左叶子之和。 示例&#xff1a; 思路&#xff1a; 通过父节点来判断七子节点是不是我们要收集的元素。因为如果遍历到孩子节点&#xff0c;我们无法判断它是左孩子还是右孩子。 后序遍历&#xff0c;左右中。 判断当前节点是不是左叶子是无法判断的&…

271 基于matlab的可调Q因子小波变换故障诊断

基于matlab的可调Q因子小波变换故障诊断&#xff0c;可用在轴承、齿轮、活塞等故障诊断中&#xff0c;程序中包含了原始TQWT工具箱和轴承振动信号信号的谱包络的求取。通过仿真数据、实际轴承数据说明了方法的效果。程序已调通&#xff0c;可直接运行。 271 可调Q因子小波变换 …

01PCB设计概述

PCB设计概述 EDA electronic design automatic 电子设计自动化&#xff08;利用计算机来实现电子设计&#xff09; 分为 &#xff1a; 微电子&#xff08;芯片设计&#xff09;、硬件板卡&#xff08;PCB设计&#xff09; 画原理图、画PCB布线 要会绘制原理图库、和封装图库 元…

LeetCode84:柱形图中最大的矩形

题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 代码 单调栈 class Solution { public:int largestRectangleArea(vector<int>& h…

AI 学习神器!大学生必备的 22个 AI 提示词模板

AI 学习神器&#xff01;大学生必备的 22个 AI 提示词模板 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘…

6. MySQL 查询、去重、别名

文章目录 【 1. 数据表查询 SELECT 】1.1 查询表中所有字段使用 * 查询表的所有字段列出表的所有字段 1.2 查询表中指定的字段 【 2. 去重 DISTINCT 】【 3. 设置别名 AS 】3.1 为表指定别名3.2 为字段指定别名 【 5. 限制查询结果的条数 LIMIT 】5.1 指定初始位置5.2 不指定初…

基于优化Morlet小波的一维信号瞬态特征提取方法(MATLAB R2018A)

小波分析方法近些年逐步得到发展的一门数学分析技术&#xff0c;它对许多学科都有十分重要的影响。与傅立叶变换等其他传统方法相比&#xff0c;小波分解的方法中所用的小波基有着多种多样的结构&#xff0c;总结来说又包括正交小波系与非正交小波系。正交小波在信号处理领域目…

系统思考—思考快与慢

“膝反射思考做决策&#xff0c;你的公司能走多远&#xff1f;” 在快节奏的商业环境中&#xff0c;我们的大脑往往默认采用“快速直觉反应”模式来做决策&#xff0c;这种方式节省能量&#xff0c;属于我们认知的“系统一”。然而&#xff0c;仅依靠直觉反应&#xff0c;即所…

cleanmyMac有必要吗,什么软件可以替代clean my mac

最近总有苹果用户抱怨mac电脑变得非常卡顿&#xff0c;而且总会收到“您的启动磁盘几乎已经满了”的系统提示。提示出现的原因是我们长期未对电脑进行健康扫描和深度清理导致的。遇到这种情况&#xff0c;我们可以借助专业的电脑深度清理软件——CleanMyMac X&#xff0c;清理不…

Django中使用Celery和APScheduler实现定时任务

在之前的文章我们已经学习了Celery和APScheduler的基本使用&#xff0c;下面让我们来了解一下如何在Django中使用Celery和APScheduler Celery 1.前提工作 python 3.7 pip install celery pip install eventlet #5.0版本以下 pip install importlib-metadata4.8.3&#xff08…