当前位置: 首页 > news >正文

wangEditor富文本插件在vue项目中使用和媒体上传的实现

wangEditor是前端一个比较流行的简洁易用,功能强大的前端富文本编辑器,支持 JS Vue React,提供了很多丰富的功能,下面手把手教你实现wangWditor富文本插件在vue项目中配置,保存、图片上传等功能。无脑ctrl+c即可
基本功能入如下:在这里插入图片描述

template

<div class="editor-wrap"><p class="title">发布文章</p><Toolbarstyle="border-bottom: 1px solid #ccc":editor="editorRef":defaultConfig="toolbarConfig":mode="mode"/><Editorstyle="height: 500px; overflow-y: hidden; border-bottom: 1px solid #ccc"v-model="valueHtml":defaultConfig="editorConfig":mode="mode"@onCreated="handleCreated"/>
</div>

script

<script setup lang="ts">
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
import { ref, onBeforeUnmount, onMounted, shallowRef, watchEffect, onUnmounted } from 'vue'
// import '@wangeditor/editor/dist/css/style.css'   // 试了几次无效,直接把样式复制到本地后引入
import '@/styles/editorStyle.css'
import { getToken } from '@/utils/cookie'// 编辑器实例,必须用 shallowRef
const editorRef = shallowRef()
// 定义组件的本地状态
const mode = ref('simple') // 或 'default, simple'
// 内容 HTML
const valueHtml = ref('<p>hello</p>')// 模拟 ajax 异步获取内容
onMounted(() => {setTimeout(() => {valueHtml.value = '<p>模拟 Ajax 异步设置内容</p>'}, 1500)
})// 菜单栏配置项,下面卧虎列出所有菜单配置,直观展示所有菜单,使用editorRef.value.getAllMenuKeys()也可以获取全部菜单的key
const toolbarConfig = {}  
toolbarConfig.toolbarKeys = ["bold","underline","italic","through",// "code",// "sub",// "sup","clearStyle","color","bgColor","fontSize","fontFamily","indent","delIndent","justifyLeft","justifyRight","justifyCenter","justifyJustify","lineHeight",// "insertImage",// "deleteImage",// "editImage",// "viewImageLink",// "imageWidth30",// "imageWidth50",// "imageWidth100",// "divider",// "emotion",// "insertLink",// "editLink",// "unLink",// "viewLink","codeBlock","blockquote","headerSelect","header1","header2","header3","header4","header5","todo","redo","undo",// "fullScreen",// "enter",// "bulletedList",// "numberedList",// "insertTable",// "deleteTable",// "insertTableRow",// "deleteTableRow",// "insertTableCol",// "deleteTableCol",// "tableHeader",// "tableFullWidth",// "insertVideo",// "uploadVideo",// "editVideoSize","uploadImage",// "codeSelectLang"
]//编辑器配置
const editorConfig = { placeholder: '请输入内容...',MENU_CONF: {// 图片上传uploadImage: {server: '/dev-api/upload-image',   //上传的api地址// fieldName: 'img',   //这个是form-data流上传的文件名,自己根据需求修改fieldName: 'file',// 单个文件的最大体积限制,默认为 2MmaximgSize: 10 * 1024 * 1024, // 10M// 最多可上传几个文件,默认为 100maxNumberOfimgs: 10,// 选择文件时的类型限制,默认为 ['image/*'] 。如不想限制,则设置为 []allowedimgTypes: ['image/*'],// 自定义上传参数,例如传递验证的 token 等。参数会被添加到 formData 中,一起上传到服务端。meta: {// token: 'xxx',// otherKey: 'yyy'// img:''},// 将 meta 拼接到 url 参数中,默认 falsemetaWithUrl: false,// 自定义增加 http  headerheaders: {// 这里可以新增一些header自定义参数authorization: getToken(),// Accept: 'text/x-json',// otherKey: 'xxx'},// 跨域是否传递 cookie ,默认为 falsewithCredentials: true,// 超时时间,默认为 10 秒timeout: 10 * 1000, //10 秒// 上传前onBeforeUpload(imgs) {ElMessage({message: '图片正在上传中,请耐心等待',grouping: true,duration: 0,customClass: 'uploadTip',iconClass: 'el-icon-loading',showClose: true});return imgs;},// 自定义插入图片customInsert(res, insertFn) {// 因为自定义插入导致onSuccess与onFailed回调函数不起作用,自己手动处理// 先关闭等待的ElMessageElMessage.closeAll();if (res.code === 200) {ElMessage.success({message: "图片上传成功",grouping: true,});// 获取到服务端响应的图片链接插入编辑器insertFn(res.data.url);} else {ElMessage.error({message: "图片上传失败,请重新尝试",grouping: true,});}},// 单个文件上传成功之后onSuccess(img, res) {// console.log(`${img.name} 上传成功`, res);console.log('img', img)console.log('res', res)},// 单个文件上传失败onFailed(img, res) {console.log(`${img.name} 上传失败`, res);},// 上传进度的回调函数onProgress(progress) {console.log('progress', progress);// progress 是 0-100 的数字},// 上传错误,或者触发 timeout 超时onError(img, err, res) {console.log(`${img.name} 上传出错`, err, res);}}},
}// 组件销毁时,也及时销毁编辑器
onBeforeUnmount(() => {const editor = editorRef.valueif (editor == null) returneditor.destroy()
})// 定义一个 handleCreated 函数,用于记录 editor 实例
const handleCreated = (editor) => {editorRef.value = editor // 记录 editor 实例,重要!
}
</script>

这样一个非常简单又强大的富文本编辑器就实现了,效果如下:
在这里插入图片描述
视频等其他文件上传同理。
富文本内容保存直接使用valueHtml或者editorRef.value.getHtml()即可。

相关文章:

wangEditor富文本插件在vue项目中使用和媒体上传的实现

wangEditor是前端一个比较流行的简洁易用&#xff0c;功能强大的前端富文本编辑器&#xff0c;支持 JS Vue React&#xff0c;提供了很多丰富的功能&#xff0c;下面手把手教你实现wangWditor富文本插件在vue项目中配置&#xff0c;保存、图片上传等功能。无脑ctrlc即可 基本功…...

ESP-IDF学习记录(2)ESP-IDF 扩展的简单使用

傻瓜式记录一个示例的打开&#xff0c;编译&#xff0c;运行。后面我再一个个运行简单分析每个demo的内容。 1.打开示例代码 2.选择项目&#xff0c;文件夹 3.选择串口 4.选择调试方式 5.根据硬件GPIO口配置menuconfig 6.构建项目 7.烧录设备&#xff0c;选择串口UART方式 运行…...

python中函数的用法总结(二阶段)

话接上回&#xff0c;继续讲下函数的用法 10. 函数的注解&#xff08;Function Annotations&#xff09; Python 3 引入了函数注解&#xff0c;允许你在函数定义时给参数和返回值添加注解。注解并不影响函数的实际行为&#xff0c;它们更多地用于代码的可读性、文档生成以及静…...

一份关于 Ubuntu 系统下代理配置的故障排查笔记

Ubuntu下代理配置故障排查指南 问题描述 在 Ubuntu 系统中开启了代理模式但访问依然很慢或无法访问。 排查步骤 1. 检查代理服务状态 # 检查端口监听状态 sudo apt install net-tools # 如果未安装 netstat sudo netstat -tulpn | grep 7897 # network statistics# 正…...

使用 Colyseus 构建多人实时白板应用

使用 Colyseus 构建多人实时白板应用 使用 Colyseus 构建多人实时白板应用涉及以下几个关键步骤:设置服务器、设计房间逻辑、同步客户端状态以及实现前端交互。以下是详细的实现流程: 0. 示例白板功能 基础功能 实时绘制同步: 用户在白板上绘制时,其绘制的点会立即显示在…...

【探花交友】SpringCache

目录 通用缓存SpringCache 重要概念 导入依赖 开启缓存支持 编写UserInfoService 缓存Cacheable 发布视频清空缓存 通用缓存SpringCache 实现缓存逻辑有2种方式&#xff1a; 每个接口单独控制缓存逻辑 统一控制缓存逻辑Spring从3.1开始定义了org.springframework.cac…...

Spring API 接口加密/解密

API 接口加密/解密 为了安全性需要对接口的数据进行加密处理&#xff0c;不能明文暴露数据。为此应该对接口进行加密/解密处理&#xff0c;对于接口的行为&#xff0c;分别有&#xff1a; 入参&#xff0c;对传过来的加密参数解密。接口处理客户端提交的参数时候&#xff0c;…...

漏洞扫描:网络安全的 “体检” 与 “防护指南”

在当今数字化时代&#xff0c;网络安全如同守护城堡的坚固城墙&#xff0c;而漏洞扫描则是检查城墙是否存在缝隙与薄弱环节的重要手段。那么&#xff0c;究竟什么是漏洞扫描&#xff1f;又该如何进行呢&#xff1f; 什么是漏洞扫描&#xff1f; 漏洞扫描是一种安全检测过程&a…...

【可靠有效】springboot使用netty搭建TCP服务器

Netty Netty是一个高性能、异步事件驱动的网络应用程序框架,它提供了对并发和异步编程的抽象,使得开发网络应用程序变得更加简单和高效。 在Netty中,EventLoopGroup是处理I/O操作的多线程事件循环器。在上面的示例中,我们创建了两个EventLoopGroup实例:bossGroup和worker…...

机器视觉中的单线程、多线程与跨线程:原理与应用解析

在机器视觉应用中&#xff0c;程序的运行效率直接影响到系统的实时性和稳定性。随着任务复杂度的提高&#xff0c;单线程处理往往无法满足高性能需求&#xff0c;多线程技术因此被广泛应用。此外&#xff0c;跨线程操作&#xff08;如在多线程中更新界面或共享资源&#xff09;…...

0040__Linux内核4.14版本——drm框架分析(1)——drm简介

https://download.csdn.net/blog/column/11175480/133602965 通过DRM绘制图像_drmmodegetresources-CSDN博客 https://zhuanlan.zhihu.com/p/336395524 19. 屏幕显示(DRM)介绍 — [野火]Linux基础与应用开发实战指南——基于LubanCat-RK系列板卡 文档 DRM设备信息_drmmoder…...

珞珈一号夜光遥感数据地理配准,栅格数据地理配准

目录 一、夜光数据下载&#xff1a; 二、夜光遥感数据地理配准 三、计算夜光数据值 四、辐射定标 五、以表格显示分区统计 五、结果验证 夜光数据位置和路网位置不匹配&#xff0c;虽然都是WGS84坐标系&#xff0c;不匹配&#xff01;&#xff01;&#xff01;不要看到就直接…...

【GlobalMapper精品教程】091:根据指定字段融合图斑(字段值相同融合到一起)

文章目录 一、加载数据二、符号化三、融合图斑1. 根据图斑位置进行融合2. 根据指定字段四、注意事项一、加载数据 订阅专栏后,从私信中查收配套实验数据包,找到data091.rar,解压并加载,如下图所示: 属性表如下: 二、符号化 为了便于比对不同的融合结果,查看属性表根据…...

Quartz任务调度框架实现任务动态执行

说明&#xff1a;之前使用Quartz&#xff0c;都是写好Job&#xff0c;指定一个时间点&#xff0c;到点执行。最近有个需求&#xff0c;需要根据前端用户设置的时间点去执行&#xff0c;也就是说任务执行的时间点是动态变化的。本文介绍如何用Quartz任务调度框架实现任务动态执行…...

ESP-IDF学习记录(1)ESPIDF环境安装,框架了解,资料整理

以后只要有空就会进行学习记录&#xff0c;主要是自用&#xff0c;学到哪记录到哪&#xff0c;有时候东西记录下来能得到不通的理解。 最终的目的是为了用esp32驱动屏幕&#xff0c;学习设计LVGL界面&#xff0c;做一些小产品&#xff0c;有益于公司及个人。之前接触多的UI还是…...

Windows系统提示synsoacc.dll文件报错要怎么解决?

一、文件丢失问题&#xff1a;深度剖析与应对策略 文件丢失是电脑运行时常见的问题之一。它可能由多种原因引起&#xff0c;如硬盘故障、病毒攻击、不当的文件操作等。当Windows系统提示synsoacc.dll丢失时&#xff0c;通常意味着该文件对于当前正在运行的程序或系统服务至关重…...

React(一)—— router/useRef/useState

文章目录 项目地址一、构建项目1.1 使用vite构建项目1.2 所需插件二、Router2.1 安装router2.2 创建路由规则2.3 创建导航栏2.3.1 添加样式文件2.3.2 添加导航栏组件2.3.3 给每个页面添加Menu导航栏2.4 通过路由给页面传值三、Hooks3.1 useRef3.2 useRef操作DOM元素3.3 useRef进…...

ipad如何直连主机(Moonlight Sunshine)

Windows 被连接主机&#xff08;Windows&#xff09; 要使用的话需要固定ip&#xff0c;不然ip会换来换去&#xff0c;固定ip方法本人博客有记载Github下载Sunshine Sunshine下载地址除了安装路径需要改一下&#xff0c;其他一路点安装完成后会打开Sunshine的Web UI&#xff…...

音视频入门知识(二)、图像篇

⭐二、图像篇 视频基本要素&#xff1a;宽、高、帧率、编码方式、码率、分辨率 ​ 其中码率的计算&#xff1a;码率(kbps)&#xff1d;文件大小(KB)&#xff0a;8&#xff0f;时间(秒)&#xff0c;即码率和视频文件大小成正比 YUV和RGB可相互转换 ★YUV&#xff08;原始数据&am…...

v-if 和 v-show 的区别

一、原理区别 1. v-if 这是一个指令&#xff0c;用于条件性地渲染一个元素块。当v-if表达式的值为true时&#xff0c;元素及其包含的子元素才会被渲染到 DOM 中&#xff1b;当表达式的值为false时&#xff0c;元素及其子元素会被完全移除。这意味着在切换v-if的条件时&#x…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...