业务型 编辑器组件的封装(复制即可使用)

使用需要安装  wangeditor  npm i --save wangeditor

import React from 'react';
import E from 'wangeditor';
import './index.less'class EditorElem extends React.Component {constructor(props) {super(props);this.isChange = false;this.state = {}}componentDidMount() {const elemBody = this.refs.editorElemBody;this.editor = new E(elemBody)this.initEditor()}componentWillReceiveProps(nextProps) {if (nextProps.value != this.props.value) {if (!this.isChange) {this.editor.txt.html(nextProps.value)}this.isChange = false;}}initEditor() {// 使用 onchange 函数监听内容的变化,并实时更新到 state 中this.editor.config.onchange = html => {this.isChange = true;// console.log(editor.txt.html())let editorContent = this.editor.txt.html();this.props.onChange(editorContent)// 不给延时,会导致详情调整过的内容修改后组件数据更新不了setTimeout(() => {this.isChange = false}, 50);}this.editor.config.menus = ['head', // 标题'bold', // 粗体'fontSize', // 字号'fontName', // 字体'italic', // 斜体'underline', // 下划线'strikeThrough', // 删除线'indent','lineHeight','foreColor', // 文字颜色'backColor', // 背景颜色'link', // 插入链接'list', // 列表'todo','justify', // 对齐方式'quote', // 引用'emoticon', // 表情'image', // 插入图片'table', // 表格'video', // 插入视频'code', // 插入代码'splitLine','undo', // 撤销'redo' // 重复]this.editor.config.colors = ['#999', '#666', '#000000','#eeece0','#1c487f','#4d80bf','#c24f4a','#8baa4a','#7b5ba1','#46acc8','#f9963b','#ffffff'];// editor.config.uploadImgShowBase64 = true;this.editor.config.pasteIgnoreImg = true;this.editor.config.uploadImgServer = `${configs.host.test}/api/FileUpload/Upload`;  // 上传图片到服务器 this.editor.config.uploadFileName = 'fileName'this.editor.config.uploadImgParams = {merchantId: localStorage.getItem('MerchantId'),Directory: 'Image'}// 限制一次最多上传 1 张图片this.editor.config.uploadImgMaxLength = 1;// 将 timeout 时间改为 3s// this.editor.config.uploadImgTimeout = 3000;this.props.zIndex && (this.editor.config.zIndex = this.props.zIndex);this.editor.config.uploadImgHeaders = {Accept: 'multipart/form-data',// Authorization: `Bearer ${localStorage.getItem('access_token')}`,// MerchantId: localStorage.getItem('MerchantId')}this.editor.config.uploadImgHooks = {before: function (xhr, editor, files) {// 图片上传之前触发},success: function (xhr, editor, result) {// 图片上传并返回结果,图片插入成功之后触发},fail: function (xhr, editor, result) {// 图片上传并返回结果,但图片插入错误时触发},error: function (xhr, editor) {// 图片上传出错时触发},// 如果服务器端返回的不是 {errno:0, data: [...]} 这种格式,可使用该配置// (但是,服务器端返回的必须是一个 JSON 格式字符串!!!否则会报错)customInsert: function (insertImg, result, editor) {// 图片上传并返回结果,自定义插入图片的事件(而不是编辑器自动插入图片!!!)// insertImg 是插入图片的函数,editor 是编辑器对象,result 是服务器端返回的结果// 举例:假如上传图片成功后,服务器端返回的是 {url:'....'} 这种格式,即可这样插入图片:var url = result.data;insertImg(url);// result 必须是一个 JSON 格式字符串!!!否则报错}}this.editor.create()this.props.value && this.editor.txt.html(this.props.value);// 开启编辑功能if (this.props.disabled) {this.editor.disable()}// this.editor.$textElem.attr('contenteditable', this.props.disabled ? false : true)}render() {return (<div className="text-area" ><divstyle={{// height: 335,}}ref="editorElemBody" className="editorElem-body"></div></div>)}
}export default EditorElem;
.editorElem-body{/* table 样式 */
table {border-top: 1px solid #ccc;border-left: 1px solid #ccc;}table td,table th {border-bottom: 1px solid #ccc;border-right: 1px solid #ccc;padding: 3px 5px;}table th {border-bottom: 2px solid #ccc;text-align: center;}/* blockquote 样式 */blockquote {display: block;border-left: 8px solid #d0e5f2;padding: 5px 10px;margin: 10px 0;line-height: 1.4;font-size: 100%;background-color: #f1f1f1;}/* code 样式 */code {display: inline-block;*display: inline;*zoom: 1;background-color: #f1f1f1;border-radius: 3px;padding: 3px 5px;margin: 0 3px;}pre code {display: block;}/* ul ol 样式 */ul, ol {margin: 10px 0 10px 20px;}
}
 {/* 编辑器组件 ---开始 */}<FormItem {...formItemLayout2} label="编辑器组件">{getFieldDecorator("editorValue", {rules: [{ required: true, message: "请填写内容" }],initialValue: detailData.editorValue,})(<EditorElemItem />)}</FormItem>{/* 编辑器组件 ---结束 */}

使用便捷,无需关注内部实现和定义一堆函数,只需要传入value值 即可回显数据

可以触发form的表单验证,无需额外在提交的时候验证是否有值进行message提示

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

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

相关文章

【leetcode热题】二叉树的层次遍历 II

难度&#xff1a; 简单通过率&#xff1a; 44.9%题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目描述 给定一个二叉树&#xff0c;返回其节点值自底向上的层次遍历。 &#xff08;即按从叶子节点所在层到根节点所在的层&…

MySQL学习Day18——逻辑架构

一、逻辑架构剖析: 1.服务器处理客户端请求: 首先 MySQL 是典型的C/S架构&#xff0c;即client/Server架构&#xff0c;服务器端程序使用的mysqld。不论客户端进程和服务器进程是采用哪种方式进行通信&#xff0c;最后实现的效果都是:客户端进程向服务器进程发送段文本(SQL语…

在script标签写export为什么会抛错|type module import ES5 ES6 预处理 指令序言 JavaScript JS

今天我们进入到语法部分的学习。在讲解具体的语法结构之前&#xff0c;这一堂课我首先要给你介绍一下 JavaScript 语法的一些基本规则。 脚本和模块 首先&#xff0c;JavaScript 有两种源文件&#xff0c;一种叫做脚本&#xff0c;一种叫做模块。这个区分是在 ES6 引入了模块…

如何防止被恶意刷接口?

在面试时&#xff0c;经常会被问一个问题&#xff1a;如何防止别人恶意刷接口&#xff1f; 这是一个非常有意思的问题&#xff0c;防范措施挺多的。今天这篇文章专门跟大家一起聊聊&#xff0c;希望对你会有所帮助。 1 防火墙 防火墙是网络安全中最基本的安全设备之一&#x…

一个网络请求是怎么进行的?

一个网络请求是怎么进行的&#xff0c;涉及到浏览器的运行机制、页面加载流程。 当我们打开一个页面的时候&#xff0c;可以在NetWork面板上看到浏览器发起的网络请求&#xff0c;包括了页面、图片、CSS样式文件以及请求的状态&#xff0c;请求耗时和响应内容等等信息。 实际…

2023年全球软件开发大会(QCon北京站2023)2月:核心内容与学习收获(附大会核心PPT下载)

本次峰会是一个汇集了最新技术趋势、最佳实践和创新思维的盛会。对于从事软件开发和相关领域的专业人士来说&#xff0c;参加这样的大会将有助于他们了解行业动态、提升技能水平、拓展职业视野&#xff0c;并与同行建立联系和合作。 本次峰会包含&#xff1a;AI基础架构、DevO…

C++ move semantics

Move casts the argument to rvalue reference, and forward casts the argument to the value type it is bound to. The cast doesn’t move, doesn’t change the obj itself and does nothing but let the compiler know this is an rvalue.Move semantics happens for mov…

CSS常用技巧

【1】制作三角形 <style>.box {width: 0;height: 0;margin: 0 auto;/* 等腰直角三角&#xff1a; 各边框宽度一致&#xff0c;将上边框保留&#xff0c;其他边框设置为透明色 */border: 100px solid transparent;border-top: 100px solid red;} </style> <d…

用户空间与内核通信(一)

在Linux中&#xff0c;内核空间与用户空间是操作系统中的两个主要部分&#xff0c;它们有着明显的区别和不同的功能。 内核空间&#xff1a; 内核空间是操作系统内核运行的区域&#xff0c;它包括了操作系统内核代码、数据结构和设备驱动程序等。内核空间位于虚拟地址空间的最…

tcpdump 命令简记录

命令 tcpdump -i eth0 -nvv -vv -c 1000 -s 0 host 127.0.0.1 and port 80 -w oms_result.cap分析 -i : 选择要捕获的接口&#xff0c;通常是以太网卡或无线网卡&#xff0c;也可以是 vlan 或其他特殊接口。 -n : 不把网络地址转换成名字 -vv : 输出详细的报文信息 -c : 在收到…

Linux程序性能分析60秒+

Linux性能分析大师Brendan Gregg有一篇非常著名的博客&#xff0c;介绍在性能分析开始的60秒内&#xff0c;利用标准的Linux命令行工具&#xff0c;执行一次充分的性能检查&#xff0c;获得系统资源利用率和进程运行情况的整体概念&#xff0c;查看是否存在异常、评估饱和度。本…

安全架构设计理论与实践

一、考点分布 安全架构概述&#xff08;※※&#xff09;安全模型&#xff08;※※※&#xff09;信息安全整体架构设计网络安全体系架构设计区块链技术&#xff08;※※&#xff09; 二、安全架构概述 被动攻击&#xff1a;收集信息为主&#xff0c;破坏保密性 主动攻击&#…

Electron实战之菜单与托盘

菜单、托盘是桌面端应用必备的功能之一&#xff0c;我们通常会在菜单上配置应用常用的&#xff1a;偏好设置、显示隐藏、打开文件等功能&#xff0c;在托盘内设置&#xff1a;退出、重启、帮助等辅助性功能&#xff0c;帮助用户方便快捷地控制应用的一些系统功能。系统托盘实际…

计算任意两个日期之间天数 Matlab

tdatetime(today);%get今天日期t12002-04-01;mdatenum(t1-t1) %做差后是hour,转化为天数参考 matlab日期函数

SQL Developer 小贴士:显示RAC配置

前提&#xff1a; 已建立2节点RAC已在SQL Developer中建立了2个连接&#xff0c;分别到RAC的两个节点 然后单击菜单View>DBA&#xff0c;分别连接RAC节点1和节点2&#xff0c;并组织成目录&#xff08;不必须&#xff0c;但建议&#xff09;。 在两处可以体现为RAC配置。第…

代码随想录算法训练营|二叉树总结

二叉树的定义&#xff1a; struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode():val(0),left(nullptr),right(nullptr){}TreeNode(int val):val(val),left(nullptr),right(nullptr){}TreeNode(int val,TreeNode* left,TreeNode* right):val(val),left(left),…

智能家居中可自行收集能量的无电池的无线设备

此图片来源于网络 1、背景 ZigBee是一种基于IEEE 802.15.4标准的低速短距离无线通信技术&#xff0c;用于创建个人区域网络。其名称来源于蜜蜂的八字舞&#xff0c;因为蜜蜂通过这种舞蹈来与同伴传递花粉的所在方位信息&#xff0c;从而构成了群体中的通信网络。ZigBee技术具…

白话微机:6.解释RTOS以及一些考研面试问题

一. 前言&#xff08;总结世界观&#xff09; 很久很久以前&#xff0c;有这样一个世界&#xff0c;这个世界有着现实世界一样的元素&#xff1a;那里的人又有一个别的名字叫做“数据”&#xff0c;人有0有1&#xff1b;人们也有住房&#xff0c;这些住房在这个世界叫做“存储器…

6-酮-前列环素F1α(6-keto-PGF1α) ELISA检测试剂盒

高灵敏ELISA试剂盒&#xff0c;3小时内可检测低至1.40 pg/ml 6-酮前列腺素F1α 6-酮-前列环素F1α&#xff08;6-keto-PGF1α&#xff09;是前列环素&#xff08;PGI2&#xff09;的稳定水解产物。由于前列环素在缓冲液中的半衰期很短&#xff08;2-3分钟&#xff09;&#xff…

第四篇【传奇开心果系列】Python文本和语音相互转换库技术点案例示例:pyttsx3自动化脚本经典案例

传奇开心果短博文系列 系列短博文目录Python文本和语音相互转换库技术点案例示例系列 短博文目录前言一、雏形示例代码二、扩展思路介绍三、批量处理文本示例代码四、自定义语音设置示例代码五、结合其他库和API示例代码六、语音交互系统示例代码七、多语言支持示例代码八、添加…