vue-cli引入wangEditor、Element,封装可上传附件的富文本编辑器组件(附源代码直接应用,菜单可调整)

news2025/7/21 1:47:41

关于Element安装引入,请参考我的另一篇文章:vue-cli引入Element Plus(element-ui),修改主题变量,定义全局样式_shawxlee的博客-CSDN博客_chalk variables


1、安装wangeditor

npm i wangeditor --save

wangEditor官方文档:Introduction · wangEditor 用户文档

2、在页面中引入wangeditor创建编辑器

附上自己封装的富文本编辑器组件源代码,可上传图片和附件:

<template>
    <!-- 富文本编辑器 -->
    <div class="rich_editor">
        <div :id="id" style="margin-bottom: 10px">
            <slot></slot>
        </div>
        <!-- 上传附件 -->
        <el-upload ref="upload" action="#" multiple :on-remove="onRemove" :on-change="onChange" :auto-upload="false" :file-list="fileList">
            <template #trigger>
                <el-button type="text" icon="el-icon-circle-plus" style="line-height: normal;">添加附件</el-button>
            </template>
            <!-- 操作按钮 -->
            <span style="float:right;">
                <el-button type="primary" size="small" @click="submit" :disabled="(!editorInput.content && fileList.length == 0) || loading"><i class="el-icon-loading" v-show="loading"></i> 提交</el-button>
                <el-button size="small" @click="cancel">取消</el-button>
            </span>
            <!-- 提示文本 -->
            <template #tip>
                <div class="el-upload__tip info" v-if="tip">* {{ tip }}</div>
            </template>
        </el-upload>
    </div>
</template>
<script>
import E from 'wangeditor' //引入wangeditor
export default {
    props: {
        id: String, //组件唯一ID
        files: Array, //已上传的文件列表(非必填)
        loading: Boolean, //缓冲条件(非必填)
        tip: String, //提示文本(非必填)
        size: Number, //文件大小限制(字节)(非必填)
    },
    data() {
        return {
            editorInput: { //编辑器内容
                content: '',
                files: []
            },
            fileList: this.files ? this.files : [] //文件列表
        }
    },
    mounted() {
        //初始化编辑器
        var editor = new E('#' + this.id)
        //配置属性
        editor.config.height = 100
        editor.config.menus = [
            'bold',
            'underline',
            'link',
            'image',
        ]
        editor.config.showFullScreen = false
        editor.config.placeholder = '请输入内容或上传附件……'
        editor.config.pasteIgnoreImg = true
        editor.config.uploadImgShowBase64 = true
        //实时监听输入内容
        editor.config.onchange = (newHtml) => {
            this.editorInput.content = newHtml
        }
        //创建编辑器
        editor.create()
    },
    methods: {
        //文件列表移除文件时的钩子
        onRemove(file, fileList) {
            this.fileList = fileList
        },
        //文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用
        onChange(file, fileList) {
            if (this.size && (file.size > this.size)) { //处理文件大小限制
                this.$message.error(this.tip)
                this.fileList = fileList.slice(0, -1)
            } else {
                this.fileList = fileList
            }
        },
        //提交编辑内容
        submit() {
            var formData = new FormData() //根据后端接口参数的格式要求进行处理
            if (this.fileList.length > 0) { //处理上传的文件
                for (let i = 0, len = this.fileList.length; i < len; i++) {
                    if (this.fileList[i].raw) {
                        formData.append('file', this.fileList[i].raw)
                    }
                    if (this.files && this.files.length > 0) {
                        for (let j = 0, lenj = this.files.length; j < lenj; j++) {
                            if (this.fileList[i].uid == this.files[j].uid) {
                                this.editorInput.files.push(this.fileList[i].uid)
                            }
                        }
                    }
                }
            }
            this.$emit('submit', this.editorInput, formData) //@submit调用父组件函数完成提交,参数:(editorInput, formData)
        },
        //取消编辑
        cancel() {
            this.$emit('cancel') //@cancel调用父组件函数取消编辑
        },
    }
}
</script>
<style lang="scss">
.w-e-toolbar {
    z-index: 100 !important;
}

.w-e-text-container {
    z-index: 99 !important;
}

.w-e-text {
    padding: 6px 10px;
}

.w-e-text-container .placeholder {
    font-size: 12px;
    line-height: normal;
}

.w-e-toolbar p,
.w-e-text-container p,
.w-e-menu-panel p {
    font-size: 12px !important;
    line-height: normal !important;
}

.el-upload__tip {
    margin-top: 0;
    font-size: 10px;
    margin-bottom: 10px;
    line-height: normal;
}

.el-upload-list__item {
    font-size: 12px;
    line-height: normal;
    color: $label;
    width: calc(100% - 100px);
}
</style>

组件应用示例:

<OrderEditor id="unique_id" :files="files" :loading="loading" tip="文件大小不超过 200 MB" :size="209715200" @submit="handleSubmit" @cancel="handleCancel">
    <!-- slot文本框初始填充的内容 -->
</OrderEditor>

// id - String, 唯一ID
// files - Array, 已上传的文件列表(非必填)
// loading - Boolean, 缓冲条件(非必填)
// tip - String, 提示文本(非必填)
// size - Number, 文件大小限制(字节)(非必填)
// submit - Function, 提交内容调用函数,参数:(editorInput, formData)
// cancel - Function, 取消编辑调用函数

组件效果展示:
在这里插入图片描述

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

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

相关文章

日常编程中和日期相关的代码和bug

本文主要是Java中和日期时间相隔的几个常用代码函数代码&#xff0c;做了总结&#xff0c;希望在日常编码中&#xff0c;可以帮到大家。 1.计算闰年 记住一个短语&#xff0c;“四年一润&#xff0c;百年不闰&#xff0c;四百再润”&#xff0c;不管换啥语言&#xff0c;相信…

HyperGBM用Adversarial Validation解决数据漂移问题

本文作者&#xff1a;杨健&#xff0c;九章云极 DataCanvas 主任架构师 数据漂移问题近年在机器学习领域来越来越得到关注&#xff0c;成为机器学习模型在实际投产中面对的一个主要挑战。当数据的分布随着时间推移逐渐发生变化&#xff0c;需要预测的数据和用于训练的数据分布…

剑指 Offer 30. 包含min函数的栈

摘要 剑指 Offer 30. 包含min函数的栈 一、栈解析 package Stock;import java.util.Stack;/*** Classname JZ30min函数栈* Description TODO* Date 2023/2/24 18:59* Created by xjl*/ public class JZ30min函数栈 {/*** description 最小栈的含义是每次从栈中获取的数据都是…

AWS攻略——使用中转网关(Transit Gateway)连接不同区域(Region)VPC

文章目录Peering方案Transit Gateway方案环境准备创建Transit Gateway Peering Connection接受邀请修改中转网关路由修改被邀请方中转网关路由修改邀请方中转网关路由测试修改Public子网路由知识点参考资料区别于 《AWS攻略——使用中转网关(Transit Gateway)连接同区域(Region…

深入理解Spring Boot的自动配置

通过spring boot可以很方便的独立运行spring应用程序&#xff0c;因为spring boot内嵌了Tomcat、Jetty等servlet容器&#xff0c;切提供自动配置功能&#xff0c;无需进行XML配置即可自动运行应用程序。那么Spring boot启动过程中具体进行了哪些操作呢&#xff1f;下面是Spring…

Julia 数学函数

Julia 提供了一套高效、可移植的标准数学函数。 数值比较 下表列出了用于数值比较的函数&#xff1a; 函数测试是否满足如下性质isequal(x, y)x 与 y 值与类型是否完全相同isfinite(x)x 是否是有限大的数字isinf(x)x 是否是&#xff08;正/负&#xff09;无穷大isnan(x)x 是否…

项目重构,从零开始搭建一套新的后台管理系统

背景 应公司发展需求&#xff0c;我决定重构公司的后台管理系统&#xff0c;从提出需求建议到现在的实施&#xff0c;期间花了将近半个月的时间&#xff0c;决定把这些都记录下来。 之前的后台管理系统实在是为了实现功能而实现的&#xff0c;没有考虑到后期的扩展性&#xf…

SpringMVC常见面试题(2023最新)

目录前言1.简单介绍下你对springMVC的理解?2.说一说SpringMVC的重要组件及其作用3.SpringMVC的工作原理或流程4.SpringMVC的优点5.SpringMVC常用注解6.SpringMVC和struts2的区别7.怎么实现SpringMVC拦截器8.SpringMvc的控制器是不是单例模式&#xff1f;如果是&#xff0c;有什…

关基系统三月重保安全监测怎么做?ScanV提供纯干货!

三月重保当前&#xff0c;以政府、大型国企央企、能源、金融等重要行业和领域为代表的关键信息基础设施运营单位都将迎来“网络安全大考”。 对重要关基系统进行安全风险监测并收敛暴露面&#xff0c;响应监管要求进行安全加固&#xff0c;重保期间实时安全监测与数据汇报等具体…

js函数声明方式*2,对象声明方式*7,不同的调用

目录 一、两种函数声明方式 二、七种对象声明方式 一、两种函数声明方式 【1】命名函数 形如&#xff1a; function fu1(){ let firstName 111111111 let lastName 2222222 console.log(firstName ,lastName ) } function fu2(firstName&#xff0c;lastName ){ …

Linux 线程优先级

目录标题概述Linux进程调度的三种策略Linux 线程优先级对于实时任务对于普通任务top中的PR和NI其他说明代码示例设置为实时进程优先级测试代码概述 概述内容 常见的运用场景&#xff1a; 1&#xff1a;2;3; Linux进程调度的三种策略 SCHED_OTHER&#xff0c;分时调度策略&#…

【读论文】AttentionFGAN

【读论文】AttentionFGAN介绍网络架构提取红外图像目标信息的网络辨别器损失函数生成器损失函数辨别器损失函数总结参考论文&#xff1a; https://ieeexplore.ieee.org/document/9103116/如有侵权请联系博主介绍 好久没有读过使用GAN来实现图像融合的论文了&#xff0c;正好看…

【Java面试八股文宝典之基础篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day14

大家好&#xff0c;我是陶然同学&#xff0c;软件工程大三今年实习。认识我的朋友们知道&#xff0c;我是科班出身&#xff0c;学的还行&#xff0c;但是对面试掌握不够&#xff0c;所以我将用这100多天更新Java面试题&#x1f643;&#x1f643;。 不敢苟同&#xff0c;相信大…

计算机专业要考什么证书?

大家好&#xff0c;我是良许。 从去年 12 月开始&#xff0c;我已经在视频号、抖音等主流视频平台上连续更新视频到现在&#xff0c;并得到了不错的评价。 视频 100% 原创录制&#xff0c;绝非垃圾搬运号&#xff0c;每个视频都花了很多时间精力用心制作&#xff0c;欢迎大家…

Android高仿陌陌应用点点滑动效果

效果图&#xff1a;分析:从效果上看图片的展示具有层次感&#xff0c;在数据结构上更像是stack,所以通过继承FrameLayout来实现&#xff08;不清楚FrameLayout布局特点的可以先百度下哈&#xff09;&#xff0c;外面是通过继承FrameLayout自定义的TinderStackLayout&#xff0c…

SpringBoot-基础篇

SpringBoot基础篇 ​ 在基础篇中&#xff0c;我给学习者的定位是先上手&#xff0c;能够使用SpringBoot搭建基于SpringBoot的web项目开发&#xff0c;所以内容设置较少&#xff0c;主要包含如下内容&#xff1a; SpringBoot快速入门SpringBoot基础配置基于SpringBoot整合SSMP…

为你的Vue2.x老项目安装Vite发动机吧

天下苦webpack久矣&#xff0c;相信作为前端开发者一定经历过在项目迭代时间较长的时候经历漫长等待的这一过程&#xff0c;每一次保存都会浪费掉大量时间&#xff0c;这是webpack这种机制所带来的问题。 于是&#xff0c;尤大为我们带来了新一代前端构建工具&#xff1a;vite…

搜索旋转排序数组、路径总和 II、拆分数字

文章目录搜索旋转排序数组&#xff08;数组、二分查找&#xff09;路径总和 II&#xff08;树、深度优先搜索&#xff09;拆分数字&#xff08;算法&#xff09;搜索旋转排序数组&#xff08;数组、二分查找&#xff09; 整数数组 nums 按升序排列&#xff0c;数组中的值 互不…

Transformer学习笔记

Transformer学习笔记1. 参考2. 模型图3.encoder部分3.1 Positional Encoding3.2 Muti-Head Attention3.3 ADD--残差连接3.4 Norm标准化3.5 单个Transformer Encoder流程图4.decoder部分4.1 mask Muti-Head Attention4.2 Muti-Head Attention5 多个Transformer Encoder和多个Tra…

详解数据库基本概念

数据库&#xff08;DataBase 简称 DB&#xff09;&#xff1a;是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合数据库管理系统&#xff08;DataBase Management System 简称 DBMS&#xff09;&#xff1a;是一种操纵和管理数据库的大型软件&#xf…