vue2实现wangEditor富文本便捷器的封装使用--真实项目

基于wangEditor 5实现一个简单的富文本编辑器组件,实现自定义上传图片。

官网地址:https://www.wangeditor.com/v5/for-frame.html#%E9%85%8D%E7%BD%AE

1. 安装依赖包:

npm i @wangeditor/editor --save
npm i @wangeditor/editor-for-vue --save

2. 封装组件代码:

<template><div class="editor-wrapper"><toolbar:editor="editor":default-config="toolbarConfig":mode="mode"/><editorv-model="html":style="{height: height + 'px'}":default-config="editorConfig":mode="mode"@onCreated="onCreated"@onChange="onChange"/><div v-if="maxlength" class="useful-num">{{ useLen }}/{{ maxlength }}</div></div>
</template><script>
import fileApi from '@/api/file';
import '@wangeditor/editor/dist/css/style.css';
import {Editor, Toolbar} from '@wangeditor/editor-for-vue';export default {name: 'customEditor',components: {Editor,Toolbar},model: {prop: 'value',event: 'change'},props: {value: {type: String,default: ''},maxlength: {type: Number,default: 0},height: {type: [String, Number],default: 300}},watch: {value(val) {this.html = val;}},data() {return {editor: null,html: '',toolbarConfig: { },editorConfig: {placeholder: '请输入内容',MENU_CONF: {uploadImage: {// 自定义图片上传功能customUpload: (resultFile, insertImgFn) => {const formData = new FormData();formData.append('file', resultFile);// 将文件上传至服务器,res.data返回服务器存放文件的urlfileApi.postFileUpload(formData).then(res => {// 插入图片,三个参数分别对应,url alt hrefinsertImgFn(res.data, '', res.data);});}},uploadVideo: {// 自定义视频上传功能customUpload: (resultFile, insertImgFn) => {const formData = new FormData();formData.append('file', resultFile);// 将文件上传至服务器,res.data返回服务器存放文件的urlfileApi.postFileUpload(formData).then(res => {// 插入视频,三个参数分别对应,url alt hrefinsertImgFn(res.data, '', res.data);});}}}},mode: 'default', // or 'simple'useLen: 0};},methods: {onCreated(editor) {this.editor = Object.seal(editor); // 一定要用 Object.seal() ,否则会报错},onChange() {const text = this.editor.getText();// 计算当前输入了多少文字this.useLen = (text || '').length;// 每次富文本内容改变,触发change事件this.$emit('change', this.html);}},beforeDestroy() {// editor销毁const editor = this.editor;if (editor == null) {return;}editor.destroy();}
};
</script><style lang="scss" scoped>.editor-wrapper{z-index: 3;position: relative;     /deep/.w-e-toolbar{z-index: 2!important;border: solid 1px #E6E9EC!important;border-top-left-radius: 6px;border-top-right-radius: 6px;.w-e-bar-item{padding: 1px;}}/deep/.w-e-text-container{z-index: 1!important;border: solid 1px #E6E9EC!important;border-top: none!important;border-bottom-left-radius: 6px;border-bottom-right-radius: 6px;}}.useful-num{position: absolute;right: 6px;bottom: 10px;z-index: 99999;font-size: 12px;color: $text-3;background: #fff;padding: 0 6px;height: 28px;line-height: 28px;}
</style>

3. 父组件使用:

<template><editorv-model="html":maxlength="8192"@change="change"/>
</template><script>
import Editor from '@/components/Editor';
export default {name: 'EditorExample',components: {Editor},data() {return {html: ''};},methods: {change(val) {console.log(val);}}
};
</script>

4. 真实项目使用:

封装了wangEditor富文本组件,并且设置了数据回显;

TextRich/index.vue

<template><div style="border: 1px solid #ccc; width: 100%"><Toolbar style="border-bottom: 1px solid #ccc" :editor="editor" :defaultConfig="toolbarConfig" :mode="mode" /><Editorstyle="height: 500px; overflow-y: hidden"v-model="html":defaultConfig="editorConfig":mode="mode"@onCreated="handleCreated"@onChange="handleChange"/></div>
</template>
<script>
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
import { DomEditor } from '@wangeditor/editor'
import { set } from 'vue'
export default {components: {Editor,Toolbar},props: {value: {type: String,default: ''}},watch: {value(val) {setTimeout(()=>{this.html = val}, 1000)}},data() {return {editor: null,html: '',mode: 'default',editorConfig: {// placeholder: '请输入内容...',backColor: 'red', // 背景颜色MENU_CONF: {// 配置上传图片uploadImage: {customUpload: this.uploaadImg},uploadVideo: {customUpload: this.uploaadVideo}}},toolbarConfig: {}}},mounted() {// // 模拟 ajax 请求,异步渲染编辑器// setTimeout(() => {//   this.html =//     '<p>tupian </p><p>tupian</p><p><br></p><p><img src="https://img1.baidu.com/it/u=608404415,1639465523&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800" alt="tupian" data-href="https://img1.baidu.com/it/u=608404415,1639465523&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800" style=""/></p>'// }, 1500)},methods: {handleCreated(editor) {this.editor = Object.seal(editor) // 一定要用 Object.seal() ,否则会报错//   设置工具栏详情this.toolbarConfig = {excludeKeys: ['insertVideo', 'uploadVideo', 'group-video', 'fullScreen']}},handleChange(content) {const toolbar = DomEditor.getToolbar(content)//   查看工具栏列表toolbar.getConfig().toolbarKeysthis.$emit('change', this.html)},uploaadImg(file, insertFn) {this.$emit('uploadImg', file, insertFn)},uploaadVideo(file, insertFn) {this.$emit('uploadVideo', file, insertFn)}},beforeDestroy() {const editor = this.editorif (editor == null) returneditor.destroy() // 销毁编辑器}
}
</script>
<style src="@wangeditor/editor/dist/css/style.css"></style>

父组件使用:

父组件是在el-form表中使用的

<template><div class="project-container"><el-form ref="form" :model="ruleForm" label-position="left" class="form"><el-form-item label="复现步骤" prop="reproduceStep" label-width="100px"><RichText v-model="ruleForm.reproduceStep" :readOnlys="readOnlys" @change="richTextChangeData" @uploadImg="richTextUploadImg"></RichText></el-form-item></el-form></div>
</template><script lang="ts">
import Vue from 'vue'
import RichText from '@/components/RichText/index.vue'export default Vue.extend({name: 'Index',components: {RichText},data() {return {ruleForm: {reproduceStep: ''}}},mounted() {this.setFormData()},methods: {richTextChangeData(val: string) {// 获取最新的html数据// this.ruleForm.reproduceStep = val},richTextUploadImg(file: any, insertFn: any) {// 插入图片,调接口返回图片url,通过插入contenglet imgUrl = 'https://img1.baidu.com/it/u=608404415,1639465523&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800'insertFn(imgUrl)// 设置只读this.readOnlys = true},setFormData() {this.ruleForm.reproduceStep ='<p>tupian </p><p>tupian</p><p><br></p><p><img src="https://img1.baidu.com/it/u=608404415,1639465523&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800" alt="tupian" data-href="https://img1.baidu.com/it/u=608404415,1639465523&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800" style=""/></p>'}}
})
</script>

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

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

相关文章

【Entity Framework】聊聊EF中键

【Entity Framework】聊聊EF中键 文章目录 【Entity Framework】聊聊EF中键一、概述二、配置主键2.1 约定配置主键2.2 单个属性配置为实体主键2.3 组合主键 三、主键名称四、键类型和值五、备用键 一、概述 键用作每个实体实例的唯一标识符。EF中的大多数实体都有一个键&#…

图片管理系统:原理、设计与实践

title: 图片管理系统&#xff1a;原理、设计与实践 date: 2024/4/9 20:04:25 updated: 2024/4/9 20:04:25 tags: 图片管理存储组织上传采集处理编辑搜索检索展示分享AI应用 第一章&#xff1a;图片管理系统概述 1.1 图片管理系统简介 图片管理系统是一种用于存储、组织、处理…

Linux--进程的概念(一)

目录 一、冯诺依曼体系结构二、操作系统2.1 什么是操作系统2.2 操作系统的意义 三、进程3.1 进程的基本概念3.2 描述进程——PCB3.3 进程和程序的区别3.4 task_struct-PCB的一种3.5 task_struct的内容分类 四、如何查看进程4.1 通过系统文件查看进程4.2 通过ps指令查看进程 五、…

目标检测——车牌图像数据集

一、重要性及意义 车牌图像识别的重要性及意义主要体现在以下几个方面&#xff1a; 智能交通管理&#xff1a;车牌图像识别技术是智能交通系统&#xff08;ITS&#xff09;的核心组成部分。通过自动识别车辆车牌&#xff0c;可以实现对交通违章行为的自动记录和处理&#xff…

langchain 使用本地通义千问

langchian 使用已经下载到本地的模型&#xff0c;我们使用通义千问 显存&#xff1a;24G 模型&#xff1a;qwen1.5-7B-Chat&#xff0c;qwen-7B-Chat 先使用 qwen-7B-Chat&#xff0c;会报错用不了&#xff1a; 看了下是不支持这中模型&#xff0c;但看列表中有一个 Qwen 字样…

VPP 负载均衡测试代码

1. 均衡的测试思想和流程说明。 先说一下理论&#xff0c; 然后后边才知道 代码逻辑。 调试了两天&#xff0c;这个代码终于通了。 由于时间关系&#xff0c; 画了一个粗略的图。另外这个代码只是流程通了&#xff0c;不过要帮助理解负载均衡我认为已经足够了。 下面是windo…

7B超越百亿级,北大开源aiXcoder-7B最强代码大模型,企业部署最佳选择

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 ​ 对代码大模型而言&#xff0c;比能做编程题更重要的&#xff0c;是看是能不能适用于企业…

SQL注入的其他攻击思路方法与Python脚本设计思路

SQL注入的其他攻击思路方法与Python脚本设计思路 也是很早就写了&#xff0c;也备个份吧 注意&#xff1a;在接下来的攻击方式中&#xff0c;由于实现的条件较为苛刻&#xff0c;并且需要较高权限&#xff0c;有的师傅又称之为高权限攻击 利用文件读取进行SQL注入 上一篇文章提…

Go第三方框架--ants协程池框架

1. 背景介绍 1.1 goroutine ants是站在巨人的肩膀上开发出来的&#xff0c;这个巨人是goroutine&#xff0c;这是连小学生都知道的事儿&#xff0c;那么为什么不继续使用goroutine(以下简称go协程)呢。这是个思考题&#xff0c;希望讲完本文大家可以有个答案。 go协程只涉及用…

【C语言】编译和链接

1. 翻译环境和运行环境 在ANSI C的任何⼀种实现中&#xff0c;存在两个不同的环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执⾏的机器指令&#xff08;⼆进制指令&#xff09;。 第2种是执⾏环境&#xff0c;它⽤于实际执⾏代码。 2. 编译环境 那翻译环境…

2024年腾讯云优惠券领取步骤使用教程详解

随着云计算技术的快速发展&#xff0c;越来越多的企业和个人开始选择使用云服务来提升自己的业务能力和工作效率。腾讯云作为国内领先的云服务提供商&#xff0c;其优质的服务和丰富的资源吸引了大量的用户。为了回馈广大用户&#xff0c;腾讯云经常会推出各种优惠活动&#xf…

Apache Log4j2 Jndi RCE CVE-2021-44228漏洞原理讲解

Apache Log4j2 Jndi RCE CVE-2021-44228漏洞原理讲解 一、什么是Log4j2二、环境搭建三、简单使用Log4j2四、JDNI和RMI4.1、启动一个RMI服务端4.2、启动一个RMI客户端4.3、ldap 五、漏洞复现六、Python批量检测 参考视频&#xff1a;https://www.bilibili.com/video/BV1mZ4y1D7K…

SQL注入---字符绕过

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.注释符绕过 当网页源代码中出现如下代码后&#xff0c;常见的注释符号将无效&#xff0c;因此需要通过特殊手段进行绕过 $reg "/#/"; $reg1 "/--/"; $replace &quo…

数据安全产品之认识数据脱敏系统

文章目录 一、什么是数据脱敏二、为什么要做数据脱敏三、数据脱敏系统的工作原理四、常见的数据脱敏方法五、数据脱敏系统的主要功能六、数据脱敏系统的部署方式七、数据脱敏与去标识化的关系与区别 随着业务的快速发展&#xff0c;特别是在银行、电信、医疗等行业中&#xff0…

第一个Swift程序

要创建第一个Swift项目,请按照以下步骤操作: 打开Xcode。如果您没有安装Xcode,可以在App Store中下载并安装它。在Xcode的欢迎界面上,选择“Create a new Xcode project”(创建新Xcode项目)。在模板选择界面上,选择“App”(应用程序)。在应用模板选择界面上,选择“Si…

PostgreSQL入门到实战-第九弹

PostgreSQL入门到实战 PostgreSQL数据过滤(二)官网地址PostgreSQL概述PostgreSQL中and操作理论PostgreSQL中and操作实操更新计划 PostgreSQL数据过滤(二) 了解PostgreSQL AND逻辑运算符以及如何使用它来组合多个布尔表达式。 官网地址 声明: 由于操作系统, 版本更新等原因, …

接口自动化测试(python+pytest+requests)

一、选取自动化测试用例 优先级高:先实现业务流程用例、后实现单接口用例功能较稳定的接口优先开展测试用例脚本的实现二、搭建自动化测试环境 核心技术:编程语言:python;测试框架:pytest;接口请求:requests安装/验证requests:命令行终端分别输入 pip install requests / p…

【LAMMPS学习】八、基础知识(1.6) LAMMPS 与其他代码耦合

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

理解 Golang 变量在内存分配中的规则

为什么有些变量在堆中分配、有些却在栈中分配&#xff1f; 我们先看来栈和堆的特点&#xff1a; 简单总结就是&#xff1a; 栈&#xff1a;函数局部变量&#xff0c;小数据 堆&#xff1a;大的局部变量&#xff0c;函数内部产生逃逸的变量&#xff0c;动态分配的数据&#x…

第十四届蓝桥杯大赛软件赛省赛C/C++大学 B 组

第十四届蓝桥杯大赛软件赛省赛C/C大学 B 组 文章目录 第十四届蓝桥杯大赛软件赛省赛C/C大学 B 组1、日期统计2、01串的熵3、冶炼金属4、飞机降落5、接龙数列6、岛屿个数7、子串简写8、整数删除9、景区导游10、砍树 1、日期统计 分析&#xff1a; 本题的意思就是2023年一整年&a…