vue3中使用vueQuill富文本编辑器详细教程,图片上传-图片压缩

2023-11-15

vueQuill是支持vue3的富文本编辑器组件,使用简单方便;

官方网址:https://vueup.github.io/vue-quill/ 

效果图:

1. 安装:(在官网有详细的安装教程);

npm或者yran下载:

npm install @vueup/vue-quill@latest --save
或者
yarn add @vueup/vue-quill@latest

2. 创建封装vue-quill文件:

在公共组件components中创建QuillEditor文件夹index.vue

3. 引入vue-quill组件,可以全局注册和局部注册,此处介绍局部注册:

import { QuillEditor, Quill } from '@vueup/vue-quill'
import '@vueup/vue-quill/dist/vue-quill.snow.css'

4. 图片压缩(图片太大会导致上传失败)

进行图片压缩需要使用到第三方插件 compressorjs,官网:GitHub - fengyuanchen/compressorjs: JavaScript image compressor.

①安装compressorjs

npm install compressorjs

②引入compressorjs

import Compressor from 'compressorjs';

③使用 compressorjs

// 图片压缩事件回调
const compressImage = (file: any) => {
    return new Promise((resolve, reject) => {
        new Compressor(file, {
            quality: 0.6, // 设置压缩质量
            maxWidth: 400, // 设置图片最大宽度
            maxHeight: 400, // 设置图片最大高度
            success(result) {
                resolve(result);
            },
            error(error) {
                reject(error);
            },
        });
    });
}

// 上传图片
const compressedFile: any = await compressImage(file); // 压缩图片
return new Promise((resolve, reject) => {
   const formData = new FormData();
   formData.append("file", compressedFile);
   uploadFile(formData).then((res: any) => {
       resolve(res.data.url);
   }).catch(err => {
       reject("Upload failed");
       console.error("Error:", err)
   })
})

5. 封装组件(完整代码):

html部分:

<template>
    <QuillEditor ref="quillRef" v-model:content="content" :options="myOptions" contentType="html" @update:content="setValue()"/>
</template>

js部分:

<script setup lang="ts">
import { uploadFile } from '@/api/common/index' //引入上传图片的api
import { QuillEditor, Quill } from '@vueup/vue-quill'
import '@vueup/vue-quill/dist/vue-quill.snow.css'
import '@/styles/quill.font.css'
import 'quill-image-uploader/dist/quill.imageUploader.min.css';

import ImageUploader from 'quill-image-uploader';
import BlotFormatter from 'quill-blot-formatter'

const props = withDefaults(defineProps<{
    modelValue: any, // 双向绑定值
}>(), {
    modelValue: '', // 双向绑定值
})
const emit = defineEmits<{
    (e: 'update:modelValue', val: any): void
}>()
const content = ref<string>('')
const quillRef = ref<any>(null)

Quill.register(fontSizeStyle, true)
Quill.register("modules/imageUploader", ImageUploader);
Quill.register('modules/blotFormatter', BlotFormatter);

//富文本配置项,将模块功能一起写入到配置项内,也可以单独配置Modules
const myOptions = reactive({
    modules: {
        toolbar: [ //自定义toolbar,或者可以通过essential ,minimal ,full ,以及"" 使用默认选项
            [{ 'align': [] }],
            [{ 'list': 'ordered' }, { 'list': 'bullet' }],
            ['image'],
            [{ 'direction': 'rtl' }],
            [{ 'color': [] }, { 'background': [] }],
            [{ 'size': fontSizeStyle.whitelist }],  // 字体大小
            ['clean']
        ],
        // 上传图片
        imageUploader: {
            upload: async (file: any) => {
                try {
                    const compressedFile: any = await compressImage(file); // 压缩图片
                    return new Promise((resolve, reject) => {
                        const formData = new FormData();
                        formData.append("file", compressedFile);
                        uploadFile(formData).then((res: any) => {
                            resolve(res.data.url);
                        }).catch(err => {
                            reject("Upload failed");
                            console.error("Error:", err)
                        })
                    })
                } catch (error) {
                    console.error('压缩和上传图像时出错:', error);
                }
            }
        },
        // 图片缩放
        blotFormatter: {
        },
    },
    placeholder: '请输入内容...'
})

// 图片压缩
const compressImage = (file: any) => {
    return new Promise((resolve, reject) => {
        new Compressor(file, {
            quality: 0.6, // 设置压缩质量
            maxWidth: 400, // 设置图片最大宽度
            maxHeight: 400, // 设置图片最大高度
            success(result) {
                resolve(result);
            },
            error(error) {
                reject(error);
            },
        });
    });
}

const setValue = () => { //用于设置双向绑定值
    const text = toRaw(quillRef.value).getHTML()
    emit('update:modelValue', text)
}

watch(() => props.modelValue, (val: any) => { 
    if (val) {
        content.value = val //用于监听绑定值进行数据回填
    } else {
        toRaw(quillRef.value).setContents('') //可用于弹窗使用富文本框关闭弹窗清除值
    }
})

</script>

css部分:

<style>
.ql-container { //通过calc函数动态设置富文本高度,前提父容器有具体高度
    height: calc(100% - 42px);
}
</style>

6. 子组件使用:

引入封装好的QuillEditor组件

const QuillEditor = defineAsyncComponent(() => import('@/components/QuillEditor/index.vue'))

使用

 <QuillEditor v-model="xxx" />

7. 模块

此处用到的模块功能有上传图片,和调整图片缩放,具体可以参考官网,安装后,进行通过Quill.register()注册模块,然后在配置项进行使用

注意:目前版本暂不支持表格,如果需要使用表格模块,需要安装quill@2.0.0-dev.4。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue3中使用vueQuill富文本编辑器详细教程,图片上传-图片压缩 的相关文章

随机推荐

  • XMPP客户端库Smack 4.1.4版官方开发文档之五

    本文转载自 博客主页 http blog csdn net chszs 五 名单Roster和在线状态Presence 名单可以让你跟踪其他用户是否在线 而且名单可以让你把用户组织到群组 比如朋友群或工作群 而其它的即时通信IM系统则把名单
  • 7个高频出现的面试题

    收集了2022年所有学生的面试题后 我整理出了7个高频出现的面试题 一起来看看 高频问题1 请自我介绍下 高频问题2 请介绍下最近做过的项目 高频问题3 请介绍下你印象深刻的bug 高频问题4 Fiddler工具怎么使用的 高频问题5 说一
  • 判断是否为数字的两种办法

    今天在写angular的ts中碰到一个问题 就是需要判断用户id是否是number类型还是uuid 在这里我采用了两种办法 1 使用typeof 判断是什么类型 if typeof res userInfo id number alert
  • sar 命令

    NAME sar Collect report or save system activity information SYNOPSIS sar A b B C d h i interval m p q r R S t u ALL v V
  • 2.2 SSD之地址映射

    LBA Logical Block Address 表示用户操作 读写 数据的位置 PBA Physics Block Address 表示数据在硬盘的真实位置 在HDD时代 数据可以覆盖写 LBA和PBA直接对应不会更改 但是SSD时代
  • leetcode-453. 最小操作次数使数组元素相等-js

    题目 代码 关键 每次操作使 n 1 个元素增加 1 相当于使1个元素减小 1 所以算出每个元素减小到最小元素的次数即可 var minMoves function nums const minNum Math min nums retur
  • BootStrap-table 复选框默认选中(checkbox)

    BootStrap table 复选框默认选中 checkbox bootstrap table colums 写法 var columns field checked checkbox true formatter stateFormat
  • 基于深度学习的人脸识别综述

    本文转载自 https xraft github io 2018 03 21 FaceRecognition 作者 Caleb Ge 葛政 如有侵权请告知删除 下文中的 我 均为原文作者 另附有查找的其他参考链接 论文介绍方面链接 1 ht
  • 第三章-Python中的数据类型

    欢迎来到python的世界 博客主页 卿云阁 欢迎关注 点赞 收藏 留言 本文由卿云阁原创 本阶段属于练气阶段 希望各位仙友顺利完成突破 首发时间 2021年3月14日 希望可以和大家一起完成进阶之路 作者水平很有限 如果发现错误 请留言轰
  • ubuntu下编译问题集锦

    1 DSO missing from command line 一般是库链接顺序不对 将依赖于其他库的lib放在前面 库放在后面就行 2 fatal error ceres ceres h No such file or directory
  • CTF中那些脑洞大开的编码和加密

    0x00 前言 正文开始之前先闲扯几句吧 玩CTF的小伙伴也许会遇到类似这样的问题 表哥 你知道这是什么加密吗 其实CTF中脑洞密码题 非现代加密方式 一般都是各种古典密码的变形 一般出题者会对密文进行一些处理 但是会给留一些线索 所以写此
  • vant使用时覆盖默认样式

    在我们使用vant的时候 有时候一些组件的默认样式并不能满足我们项目的需求 这个时候我们可以使用下面的办法 覆盖掉默认样式 亲测有效 vant覆盖默认样式的写法 v deep van cell not last child after le
  • transform的scale属性实现对大屏的适配

    最近公司做的大屏用到了transform的scale属性来对大屏网页 进行缩放 缺点 需要给项目大屏 设定固定的宽高 当使用的屏幕分辨率和项目不一致时 会出现左右或者上下的留白 如果设计稿是1920 1080的尺寸 项目中用px来写宽高的话
  • QT 自学内容 day06 文件的打开,读取,写入,输出内容的时候编码方式的修改,文件的创建日期,和最后的修改时间

    1 打开文件 头文件 include
  • 在图像间进行特征匹配

    特征匹配 目标 我们将要学习在图像间进行特征匹配 使用 OpenCV 中的蛮力 Brute Force 匹配和 FLANN 匹配 Brute Force 匹配的基础 蛮力匹配器是很简单的 首先在第一幅图像中选取一个关键点然后依次与第二幅图像
  • python自(2)切片 字典 遍历删除添加修改查询定义函数函数返回值作用域序列化异常报错urllib使用一个类型六个方法下载 视频音频图片

    切片 切片 s hello word 下标索引为0的 print s 0 h 左闭右开 左是下标开始的 右是几个索引值 例如从0开始算 4个索引值 print s 0 4 hell 更改起始值的开始位置 print s 1 ello wor
  • 产品经理的思考-概括

    思考 断断续续从技术转产品已经两年时间 从2021年的按部就班 到2022年的兵荒马乱 从技术到产品会有优势 但也有自身的枷锁 如何发挥优势 跳出枷锁 是一个不断思考和突破的过程 比较转岗会有蜜月期 但是漫长的痛苦才是现实 从技术到产品是需
  • 再谈Qt实现Rasdial拨号问题(说说项目中遇到的问题和解决方案)

    上一篇 Qt实现Rasdial宽带拨号 讲解了下最简单的宽带拨号方式 但是在实际项目开发中 发现 这种做法是不好的 效率低 有时拨号失败 而且上一回 我们是采用异步拨号来实现 这个做法是不行的 我们需要实现同步拨号 那么我们应该借助api函
  • unity3d读取Excel小白教程

    1 课前准备准备三个文件 Excel dll ICSharpCode SharpZipLib dll System Data dll 如图 下载地址 链接 https pan baidu com s 1B2Sue9iw4qWzwjb1uJ6
  • vue3中使用vueQuill富文本编辑器详细教程,图片上传-图片压缩

    vueQuill是支持vue3的富文本编辑器组件 使用简单方便 官方网址 https vueup github io vue quill 效果图 1 安装 在官网有详细的安装教程 npm或者yran下载 npm install vueup