vue3 wangeditor 富文本使用自定义上传图片

wangeditor

wangeditor

下载

pnpm add @wangeditor/editorpnpm add @wangeditor/editor-for-vue@next

mode: ‘default’ 默认模式 - 集成了 wangEditor 所有功能
mode: ‘simple’ 简洁模式 - 仅有部分常见功能,但更加简洁易用

基础结构

<script lang="ts" setup>
import "@wangeditor/editor/dist/css/style.css"; // 引入 cssimport { onBeforeUnmount, ref, shallowRef } from "vue";import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
import { IToolbarConfig, IEditorConfig, IDomEditor } from "@wangeditor/editor";// 编辑器实例,必须用 shallowRef
const editorRef = shallowRef();// 模式
const mode = ref("default");/* 工具栏配置 */
const toolbarConfig: Partial<IToolbarConfig> = {};// 编辑器配置
const editorConfig: Partial<IEditorConfig> = { placeholder: "请输入内容..." };// 内容 HTML
const valueHtml = ref("");function handleCreated(editor: IDomEditor) {// 记录 editor 实例,重要!editorRef.value = editor;
}// 组件销毁时,也及时销毁编辑器
onBeforeUnmount(() => {const editor = editorRef.value;if (editor == null) return;editor.destroy();
});
</script><template><div style="border: 1px solid #ccc"><Toolbarstyle="border-bottom: 1px solid #ccc":editor="editorRef":defaultConfig="toolbarConfig":mode="mode"/><Editorstyle="height: 500px; overflow-y: hidden"v-model="valueHtml":defaultConfig="editorConfig":mode="mode"@onCreated="handleCreated"/></div>
</template>

工具栏配置

/* 工具栏配置 */
const toolbarConfig: Partial<IToolbarConfig> = {// 排除的菜单选项excludeKeys: ["insertTable","insertImage", // 排除菜单组 写菜单组 key 的值即可,如排除图片中的 网络图片选项 key("insertImage")],
};

获取菜单选项列表 toolbar
setTimeout 以便获取值 toolbar

import { IToolbarConfig, IEditorConfig, IDomEditor, DomEditor } from "@wangeditor/editor";function handleCreated(editor: IDomEditor) {setTimeout(() => {const toolbar = DomEditor.getToolbar(editor);const toolbarKeys = toolbar?.getConfig().toolbarKeys;console.log("toolbarKeys", toolbarKeys);}, 0);
}

编辑器配置

编辑器配置中 onXxx 格式的生命周期函数,必须通过 Vue 事件来传递,不可以放在 editorConfig 中

编辑器内容、选区变化时的回调函数。

<template><Editor@onChange="handleChange"/>
</template>
<script lang="ts" setup>function handleChange(editor: IDomEditor) {console.log("content", editor.children);}
</script>

菜单配置

菜单配置是工具栏的菜单项的详细配置,该配置也在编辑器配置下

获取菜单所有 key

function handleCreated(editor: IDomEditor) {editor.getAllMenuKeys();
}

获取某菜单默认配置 --> 获取图片默认配置

function handleCreated(editor: IDomEditor) {const uploadImage = editor.getMenuConfig("uploadImage");console.log("uploadImage", uploadImage);
}

修改配置 --> 修改颜色

// 编辑器配置
const editorConfig: Partial<IEditorConfig> = {placeholder: "请输入内容...",autoFocus: false,// 修改配置MENU_CONF: {// 颜色color: {colors: ["#000", "#333", "#666"],},},
};// 单独拿出来配置,结果与上面一样
editorConfig.MENU_CONF["color"] = {colors: ["#000", "#333", "#666"],
};

上传图片

基本上传

const editorConfig: Partial<IEditorConfig> = {MENU_CONF: {// 上传图片的配置uploadImage: {// 必填 请求地址server: "/api/file",// file 文件的字段名fieldName: "file",// 其他传递的参数, 加在 formData 中meta: {scene: "avatar",},// 请求头:存放 tokenheaders: {Authorization: " ",},// 单个文件的最大体积限制,默认为 2MmaxFileSize: 1 * 1024 * 1024, // 1M// 选择文件时的类型限制,默认为 ['image/*'] 。如不想限制,则设置为 []allowedFileTypes: ["image/*"],// 上传前的回调onBeforeUpload(file: File) {console.log("上传前的回调", file);// return file;},// 上传成功onSuccess(file: File, res: any) {console.log(` 上传成功`, res);},// 单个文件上传失败onFailed(file: File, res: any) {console.log(` 上传失败`, res);},// 上传错误,或者触发 timeout 超时onError(file: File, err: any, res: any) {console.log(`传出错`, err);console.log(`上传出错`, res);},},},
};

服务端 response body 无法按照上述格式,可以使用下文的 customInsert

/***  从 res 中找到 url alt href ,然后插入图片* "url": "xxx", // 图片 src ,必须* "alt": "yyy", // 图片描述文字,非必须* "href": "zzz" // 图片的链接,非必须*/type InsertFnType = (url: string, alt: string, href: string) => void;
const editorConfig: Partial<IEditorConfig> = {MENU_CONF: {// 自定义插入图片customInsert(res: any, insertFn: InsertFnType) {// res 即服务端的返回结果console.log("自定义插入图片", res);insertFn(res.data.url, "", "");},},
};

自定义上传图片逻辑

type InsertFnType = (url: string, alt: string, href: string) => void;
const editorConfig: Partial<IEditorConfig> = {MENU_CONF: {// 自定义上传async customUpload(file: File, insertFn: InsertFnType) {// file 即选中的文件console.log("自定义上传", file);// 自己实现上传,并得到图片 url alt hrefconst formData = new FormData();formData.append("file", file, file?.name);formData.append("scene", "avatar");// 上传接口const res = await upload(formData);// 最后插入图片insertFn(res.data.url, "", "");},},
};function checkImageSize(fileTypeList: string[] = ["image/jpeg", "image/jpg", "image/png"]) {const flag = fileTypeList.some((item) => file.type === item);if (!flag) return false;return true;
}
function checkImageType(size: number = 1024 * 1024 * 1) {if (file.size > size) return false;return true;
}

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

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

相关文章

定制开发办公软件在企业发展中的优势|app小程序网站搭建

定制开发办公软件在企业发展中的优势|app小程序网站搭建 如今&#xff0c;办公软件已经成为企业日常工作的必需品。很多企业为了提高工作效率和满足自身业务需要&#xff0c;选择定制开发办公软件。下面将介绍定制开发办公软件在企业发展中的优势。 首先&#xff0c;定制开发办…

Moonbeam生态项目分析 — — 聚合流动性管理协议GAMMA

流动性激励计划Moonbeam Ignite是帮助用户轻松愉快体验Moonbeam生态的趣味活动。在Moonbeam跨链连接的推动下&#xff0c;DeFi的各种可能性在这里爆发。DeFi或许不热门&#xff0c;但总有机会捡漏&#xff0c;了解Monbeam生态项目&#xff0c;我们邀请Moonbeam大使分享他们的研…

驾驭未来,智能化管理——汽车ERP系统

在汽车行业竞争日益激烈的今天&#xff0c;如何提高生产效率、优化供应链管理&#xff0c;确保产品质量和客户满意度成为汽车制造企业亟需解决的难题。为解决这一问题&#xff0c;汽车企业资源计划&#xff08;ERP&#xff09;系统应运而生。本文将为您介绍汽车ERP系统&#xf…

智能AIGC写作系统ChatGPT系统源码+Midjourney绘画+支持GPT-4-Turbo模型+支持GPT-4图片对话

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

便利高效双赢:无人机油气管道巡检全面升级

我国庞大的油气管道网络&#xff0c;包括原油、成品和天然气管道&#xff0c;因为地理区域广泛、建设年代久远、安全事故频发等现实因素&#xff0c;对管道的安全巡护与管理提出了更高的需求。在这一背景下&#xff0c;传统的人工巡护方式显然已经难以满足对高、精、准的要求。…

shell编程系列- bash和sh的区别

文章目录 引言bash和sh的区别CentOS下的区别Ubuntu下的区别 最佳实践 引言 我们在编写shell脚本时&#xff0c;通常第一行都要声明当前脚本的执行程序&#xff0c;也就是常见的 #!/bin/sh 或者是 #!/bin/bash &#xff0c;我们无论用哪一个脚本似乎都可以正常的执行&#xff0…

【数据结构/C++】栈和队列_循环队列

牺牲一个存储单元来判断队满。 #include<iostream> using namespace std; // 循环队列 #define MaxSize 10 typedef int ElemType; typedef struct {ElemType data[MaxSize];int front, rear; } SqQueue; // 初始化队列 void InitQueue(SqQueue &Q) {// 判断队空 Q.…

C++ Day10 STL02-适配器与算法 (本篇笔记16000字,整理不易,拿去赶快干)

函数对象 概念 重载函数调用运算符的类实例化的对象 , 就叫函数对象 . 又名仿函数 函数对象和 () 触发重载函数调用运算符的执行。 作用 : 为算法提供策略。 示例 class MyPrint { public:void operator()(char *s){cout<<s<<endl;} }; void test01() {MyPrint…

MySQL数据库入门到大牛_基础_16_变量、流程控制与游标

文章目录 1. 变量1.1 系统变量1.1.1 系统变量分类1.1.2 查看系统变量 1.2 用户变量1.2.1 用户变量分类1.2.2 会话用户变量1.2.3 局部变量1.2.4 对比会话用户变量与局部变量 2. 定义条件与处理程序2.1 案例分析2.2 定义条件2.3 定义处理程序2.4 案例解决 3. 流程控制3.1 分支结构…

四川劳动保障杂志社四川劳动保障编辑部四川劳动保障杂志2023年第10期目录

主题报道 四川抢抓“金九银十”招聘季多措并举稳就业促就业 举措频“上新” 金秋送岗忙 张玉芳; 2-5 法眼《四川劳动保障》投稿&#xff1a;cnqikantg126.com 筑牢长期护理保险基金安全防线 李科仲;赖晓薇; 6-7 调研 提升职业技能培训工作的举措 寇爵; 8-9 城乡…

实战中使用的策略模式,使用@ConditionalOnProperty实现根据环境注册不同的bean

场景复现 举个例子&#xff0c;针对不同的设备的内存的不同加载一些资源的时候需要采取不同的策略&#xff0c;比如&#xff0c;在内存比较大的设备&#xff0c;可以一次性加载&#xff0c;繁殖需要使用懒加载&#xff0c;这个时候我们就可以采用配置文件配置中心去控制了 Cond…

四川开启智能巡河形式,无人机水利行业应用再创新

在四川省某区域&#xff0c;复亚智能无人机系统以其独特的机场网格化部署得到成功应用&#xff0c;覆盖了该区域内多条市级、省级河流&#xff0c;成为水利行业的新亮点。这一先进系统以无人机水利行业应用为核心&#xff0c;通过网格化和信息化手段&#xff0c;实现了对水域环…

城市内涝积水监测系统,全方位监测城市内涝

在城市规划与防灾减灾的领域中&#xff0c;城市内涝积水监测系统的构建至关重要。随着城市化进程的加快&#xff0c;城市内涝问题日益凸显&#xff0c;对市民的生活质量和生命财产安全构成威胁。为了应对这一问题&#xff0c;建设一套高效、精准的城市内涝积水监测系统势在必行…

LeetCode Hot100 155.最小栈

题目&#xff1a; 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获…

PTA:猜帽子游戏 ,C语言

题目 宝宝们在一起玩一个猜帽子游戏。每人头上被扣了一顶帽子&#xff0c;有的是黑色的&#xff0c;有的是黄色的。每个人可以看到别人头上的帽子&#xff0c;但是看不到自己的。游戏开始后&#xff0c;每个人可以猜自己头上的帽子是什么颜色&#xff0c;或者可以弃权不猜。如…

鸿蒙开发ArkUI -常用布局

线性布局(Row/Column) 间距/主轴排列方式/交叉轴对齐方式 Column({}) {Column() {}.width(80%).height(50).backgroundColor(0xF5DEB3)Column() {}.width(80%).height(50).backgroundColor(0xD2B48C)Column() {}.width(80%).height(50).backgroundColor(0xF5DEB3) } .width(1…

组装自己的稳定扩散模型

在本文中&#xff0c;我们将利用 Hugging Face Diffusers 库的组件实现自己的稳定扩散模型&#xff0c;可以像 diffuser.diffuse() 一样简单地生成图像。 在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编…

三、【合成中的构图】

文章目录 在海报合成中&#xff0c;也会采用构图的思想来进行布局&#xff0c;像我们拍照摄影的时候&#xff0c;也会采用左右构图&#xff0c;居中构图&#xff0c;三点构图&#xff0c;对称构图&#xff0c;通过这些构图方式&#xff0c;合理的让各种素材结合在一起&#xff…

做外贸想赚客户的钱,先想想自己比别人强在哪

Nicky说她用搜到的客户邮箱信息&#xff0c;给客户发开发信&#xff0c;基本上是发一通都像石沉大海一样&#xff0c;没有激起任何水花。从软件中来的客户信息&#xff0c;有电话或者WhatsApp的&#xff0c;添加上了&#xff0c;有的客户会直接忽略&#xff0c;有的会问从哪里拿…

VC++、MFC中操作excel时,Rang和Rangs的区别是什么?

Rang 参考微软说明 作用 表示一个单元格、一行、一列、一个包含单个或若干连续单元格区域的选定单元格范围&#xff0c;或者一个三维区域。 说明 Range 的默认成员将不包含参数的调用转发至 Value 属性 如&#xff0c;someRange someOtherRange 等效于 someRange.Value …