wangEditor富文本编辑器+react+antd的使用

2023-11-12

1、github上发现富文本编辑器:

官网地址及github地址

2、结合react+antd的具体使用:

案例使用场景:MyModal为弹窗,弹窗显示 编辑名称及描述。描述使用wangeditor富文本编辑器实现。

MyModal.js

import { Form, Modal, Input, Row, Col } from 'antd';
import Editor from 'wangeditor';

const formItemLayout = {
  labelCol: {
    xs: { span: 24 },
    sm: { span: 3 }
  },
  wrapperCol: {
    xs: { span: 24 },
    sm: { span: 20 }
  }
};
const FormItem = Form.Item;
@Form.create()
class MyModal extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      editorHtml: '',
      editorText: '',
    }
  }
  submit = values => {
    this.props.form.validateFields((err, values) => {
      if (!err) {
         //提交表单处理事项
         this.props.OnSubmit(values);
      }
    });
  };
  componentDidMount() {
      //判断modal是否需要显示
    if (this.props.visible) {
      //获取真实dom,创新富文本编辑器
      var editor = new Editor(ReactDOM.findDOMNode(this._div));
      // 使用 onchange 函数监听内容的变化,并实时更新到 stateeditor.customConfig.onchange = (html) => {
        this.setState({
          editorHtml: html,
          editorText: editor.txt.text()
        })
        //将html值设为form表单的desc属性值
        this.props.form.setFieldsValue({
          'desc': html
        });
      }
      editor.create();
    }
  }
  //自定义表单验证规则
  validateEditorFrom = (rule, value, callback) => {
      //此处根据富文本框的text值进行验证,但注意富文本框中输入空格,使用‘&nbsp‘表示,此方法不能处理只输入空格的验证。
    if (this.state.editorText.trim() === '') {
      callback('不能为空');
    }
    // Note: 必须总是返回一个 callback,否则 validateFieldsAndScroll 无法响应
    callback();
  }

  render() {
    const { id, visible, confirmLoading } = this.props;
    const { getFieldDecorator } = this.props.form;
    getFieldDecorator('id', { initialValue: id });
    return (
      <Modal
        title="编辑信息"
        width={'60%'}
        confirmLoading={confirmLoading}
        visible={visible}
        onOk={this.submit}
        onCancel={this.props.onCancel}
      >
        <Form>
          <Row>
            <Col>
              <FormItem {...formItemLayout} label="名称">
                {getFieldDecorator('name', {
                  rules: [{ required: true, message: '请填写名称' }],
                  initialValue: ''
                })(<Input />)}
              </FormItem>
              <FormItem {...formItemLayout} label="描述">
                {getFieldDecorator('desc', {
                  rules: [{
                    required: true,
                    message: '请填写描述',
                  }, {// 使用自定义的校验规则
                    validator: this.validateEditorFrom
                  }],
                  initialValue: ''
                })(<div ref={(ref) => this._div = ref}></div>)}
              </FormItem>
            </Col>
          </Row>
        </Form>
      </Modal>
    );
  }
}
export default MyModal;

index.js 点击链接调用弹窗:

mySubmit = (values)=>{
    //value为form表单的对象
    //处理提交逻辑
}
hideMyModal =()=>{
    this.setState({
      myModalVisible: false
    })
}
render(){
    return (
        <MyModal
          visible={myModalVisible}
          confirmLoading={confirmLoading}
          key={myModalVisible + 'edit'}
          taskId={taskId}
          onSubmit={this.mySubmit}
          onCancel={this.hideMyModal}
        />
    );
}

需要设置富文本编辑的内容时,可以在react的componentDidMount生命周期函数中 使用editor.txt.html('<p>哈哈</p>')进行设置。

const value = this.props.data && this.props.data.desc || '';
editor.txt.html(value);

3、知识点总结

(1) FormItem必填验证,是怎么关联的?
 <FormItem {...formItemLayout} label="名称">
     {getFieldDecorator('name', {
                  rules: [{ required: true, message: '请填写名称' }],
                  initialValue: ''
               })(<Input />)}
 </FormItem>

答案可以使用官网的话:

  • 经过 getFieldDecorator 包装的控件,表单控件会自动添加 value(或 valuePropName 指定的其他属性) onChange(或 trigger 指定的其他属性),数据同步将被 Form 接管,这会导致以下结果:

    • 你不再需要也不应该用 onChange 来做同步,但还是可以继续监听 onChange 等事件。

    • 你不能用控件的 value defaultValue 等属性来设置表单域的值,默认值可以用 getFieldDecorator 里的 initialValue。

    • 你不应该用 setState,可以使用 this.props.form.setFieldsValue 来动态改变表单值。

        //将editor的html值设为form表单的desc属性值
        this.props.form.setFieldsValue({
          'desc': html
        });
  • initialValue也会影响必填项的验证,对于Input组件最好设置为initialValue:''.
(2) Form自定义校验规则:
            <FormItem {...formItemLayout} label="描述">
                {getFieldDecorator('desc', {
                  rules: [{
                    required: true,
                    message: '请填写描述',
                  }, {// 使用自定义的校验规则
                    validator: this.validateEditorFrom
                  }],
                  initialValue: ''
                })(<div ref={(ref) => this._div = ref}></div>)}
              </FormItem>
validateEditorFrom = (rule, value, callback) => {
    if (this.state.editorText.trim() === '') {
      callback('不能为空');
    }
    // Note: 必须总是返回一个 callback,否则 validateFieldsAndScroll 无法响应
    callback();
  }

(3) 通过ref获取元素

<div ref={(ref) => this._div = ref}></div>)
//获取真实dom
const elem = ReactDOM.findDOMNode(this._div);

React提供的这个ref属性,表示为对组件真正实例的引用,其实就是ReactDOM.render()返回的组件实例;需要区分一下,ReactDOM.render()渲染组件(这里指有状态组件)时返回的是组件实例;而渲染dom元素时,返回是具体的dom节点。 可参考链接:https://blog.csdn.net/z69183787/article/details/69568467
ref可以设置回调函数(官方推荐)、字符串、详情可参考下一篇链接。
值得注意的是,

  • 对于html元素使用ref的情况,ref本身引用的就是该元素的实际dom节点,无需使用ReactDOM.findDOMNode(ref)来获取,该方法常用于React组件上的ref。
<div ref="divElem">

this.refs.divElem 即是获取的dom元素。

  • 无法通过ref来获取无状态组件实例。

无状态组件是不会被实例化的,在父组件中通过ref来获取无状态子组件时,其值为null。但是可以结合复合组件来包装无状态组件来在其上使用ref引用。

<div ref={(node) => refDom = node}>
            ...
</div>

这样,可以通过变量refDom来访问到无状态组件中的指定dom元素了,访问其中的其他组件实例类似。

问: 有状态组件和无状态组件?

(4)React的key属性

本案例中Modal中包含key值,react根据key值的变化,判断是否需要重新加载组件。之前一直遇到Modal显示时,不触发componentDidMount(),从而导致wangeditor不能正确创建的问题,根源就在于modal在index.js页面加载时就加载了,再显示时,modal的key值没有变化,没有重新加载组件。

react利用key来识别组件,每个key对应一个组件,相同的key react认为是同一个组件,这样后续相同的key对应组件都不会被创建。

react根据key来决定是销毁重新创建组件还是更新组件。
- key相同,若组件属性有所变化,则react只更新组件对应的属性;没有变化则不更新。
- key值不同,则react先销毁该组件(有状态组件的componentWillUnmount会执行),然后重新创建该组件(有状态组件的constructor和componentWillUnmount都会执行)

详情参照博客:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

wangEditor富文本编辑器+react+antd的使用 的相关文章

  • react基础--组件通讯:props基础、子传父、父传子、兄弟组件通讯、context跨级组件、props进阶

    目录 一 props基础 1 1 概述 1 2 函数组件通讯 1 2 1 基本用法 1 2 1 对象数据传递 1 3 类组件通讯 1 4 props的特点 二 组件通讯三种方式 2 1 父传子 2 2 子传父 2 3 兄弟组件通讯 三 co
  • Ant Design Pro 从零到一教程

    说在最前面的话 可是能全网唯一适合小白的antd教程 因为我找了接近一个周的教程 无论是视频 博客等等都没有比较完整的教程 所以才说这可能是唯一全网适合小白教程 文章末有相关学习链接 适用人群 喜欢看文字或者代码学习的人 学习的人掌握基本的
  • 一文揭秘饿了么跨端技术的演进、实践与落地

    本文会先带领大家一起简单回顾下跨端技术背景与演进历程与在这一波儿接着一波儿的跨端浪潮中的饿了么跨端现状 以及在这个背景下 相较于业界基于 React Vue 研发习惯出发的各种跨端方案 饿了么为什么会选择走另外一条路 这个过程中我们的一些思
  • 关于Vue.js和React.js,听听国外的开发者怎么说?

    VueJS 与 ReactJS 到底怎么样如何 听听别人怎么说 使用所有新的库和框架 很难跟上所有这些库和框架 也就是说 这就需要您决定哪些是值得花时间的 让我们看看人们说什么 和Vue JS一起工作是很愉快的 我发现学习曲线很浅 然而 这
  • webpack代码混淆

    作者 桑榆 QQ 934440653 有问题 评论留言 或qq联系 安装 npm install save dev webpack obfuscator 属性 compact true 压缩 无换行 controlFlowFlattenin
  • React之state、hooks性能分析

    目录 一 state 1 为什么使用setState 2 setState异步更新 3 如何获取异步的结果 4 setState一定是异步吗 5 源码分析 6 数据的合并 7 多个state的合并 二 为什么需要Hook 三 Class组件
  • react 上传文件(多选)功能入的坑

    1 这里报错是因为onChange的this指向不对 解决方法在constructor中写 this onChange this onChange bind this 或者在绑定事件的时候写 onChange this onChange b
  • HTML、CSS、JavaScript分别实现什么功能?

    学习Web前端开发基础技术需要掌握 HTML CSS JavaScript 那么这三个都是分别实现什么功能的呢 下面和小编一起来看看吧 一 HTML是网页内容的载体 内容就是网页制作者放在页面上想要让用户浏览的信息 可以包含文字 图片 视频
  • React实现关键字高亮

    先看效果 实现很简单通过以下这个函数 highLight text keyword gt return text split keyword flatMap str gt span keyword span str slice 1 展示某段
  • 【react】回调函数形式的ref

    回调函数有3个特点 是我定义的函数 我没有调用这个函数 在我没有调用的情况下这个函数自己执行了 ref绑定一个箭头函数作为回调函数 可以输出以下这段看下 ref绑定的箭头函数是会自己执行的 class Demo extends React
  • umi 后台管理demo

    umi 后台管理demo umi react ts dva antd egg 有待优化 简单的前后端管理demo 接口提供增删查改 前端也有相应功能 github代码 https github com huiBuiling ql admin
  • React、Vue2.x、Vue3.0的diff算法

    前言 本文章不讲解 vDom 实现 mount 挂载 以及 render 函数 只讨论三种 diff 算法 VNode 类型不考虑 component functional component Fragment Teleport 只考虑 E
  • React class组件、react-hook函数组件分别实现五子棋

    react class类组件 react hook函数组件分别实现五子棋 前言 使用create react app脚手架简单搭建 不用安装其他依赖 纯 js css实现 这里就只是简单的说明目录结构和思路 具体的代码实现请转到 Githu
  • 前端使用layui结合canvas实现图片验证码

    fieldset class layui elem field layui field title style margin top 20px legend 图形验证码 legend fieldset
  • js实现鼠标悬停显示title效果

  • <a>标签的超链接前面会自动加上当前(网站)地址

    当前 网站 地址是 fyh com 在代码里写 a 标签时 会自动在链接前添加 fyh com 例如写如下代码 a href www baidu com baidu a 在浏览器中点击链接会跳转至 fyh com www baidu com
  • React中渲染html结构---dangerouslySetInnerHTML

    dangerouslySetInnerHTML 胡子 语法绑定的内容全部作为普通文本渲染 渲染html结构基于 dangerouslySetInnerHTML dangerouslySetInnerHTML 是 React 标签的一个属性
  • React Jsx转换成真实DOM过程?

    面试官 说说React Jsx转换成真实DOM过程 一 是什么 react 通过将组件编写的 JSX 映射到屏幕 以及组件中的状态发生了变化之后 React 会将这些 变化 更新到屏幕上 在前面文章了解中 JSX 通过 babel 最终转化
  • 如何提高React组件的渲染效率的?在React中如何避免不必要的render?

    面试官 说说你是如何提高组件的渲染效率的 在React中如何避免不必要的render 一 是什么 react 基于虚拟 DOM 和高效 Diff 算法的完美配合 实现了对 DOM 最小粒度的更新 大多数情况下 React 对 DOM 的渲染
  • React Jsx转换成真实DOM过程?

    面试官 说说React Jsx转换成真实DOM过程 一 是什么 react 通过将组件编写的 JSX 映射到屏幕 以及组件中的状态发生了变化之后 React 会将这些 变化 更新到屏幕上 在前面文章了解中 JSX 通过 babel 最终转化

随机推荐

  • Spring-Data-Jpa AuditingEntityListener @CreatedDate @LastModifiedDate 用法

    import com fasterxml jackson annotation JsonIgnoreProperties import org hibernate validator constraints NotBlank import
  • OpenStack学习笔记(二)计算服务NOVA

    本篇记录OpenStack的计算服务NOVA一些内容 很多看不懂 汗 只捡一小部分记录 一 逻辑图 OpenStack 计算服务NOVA 是基础设施服务IAAS的主要部分 采用Python实现 1 因为认证 与OpenStack 身份认证k
  • 如何将GB7714-2015格式的参考文献表转换为bib文件

    如何将GB7714 2015格式的参考文献表转换为bib文件 1 背景 latex使用参考文献是一个自动化的工作 但建立和维护bib文件其实一个长期的积累活动 有些参考文献的bibtex数据是存在 比如从各类学术网站上可以下载到 但有些网站
  • NIO-DO Java 线上笔试(编程)题,蔚来汽车

    NIO DO Java 线上笔试 编程 题 1 使用二分查找的方式来定位某一元素 2 请用你熟悉的开发语言 完成如下题目 输入 若干个集合 各集合中的元素不会重复 输出 求这些集合的笛卡尔积例如 输入 N个集合 这里N 3 a b x y
  • Laravel-Dcat-layer 手写的弹窗样式

    Dcat admin框架下重新写的弹窗样式 实现设置固定最大高度弹窗滚动 实现更好的页面效果 public function layer return lt lt
  • python使用KDDockWidget

    编译原理 KDDockWidget是一个C 库 通过shiboken转成python的绑定支持 针对特殊版本 需要在cmake文件中增加一些变量 注 本次编译 Qt版本统一指定为6 4 2 库支持Qt gt 5 12或6 2 0以上版本 下
  • yolov5数据集制作

    yolov5 数据集的格式 每个图像的标注信息存储在一个独立的txt文件中 每个txt文件的名称应该与其对应的图像名称相同 只是文件扩展名不同 例如 对于名为 image1 jpg 的图像 其标注信息应存储在名为 image1 txt 的t
  • FPGA微型板Verilog简单音频

    简单音调生成 该模块通过使用一个计数器生成一个1 kHz的信号 该计数器在CLK的每个刻度上都递增 当计数器达到32 000时 将切换输出BUZZER 并将计数器重置为0 音频输出 使用一个1 k 电阻器和一小段实心线将GPIO引脚P97和
  • Nginx多条件IF逻辑运算(与、或操作)不支持问题解决方法

    原文地址 Nginx多条件IF逻辑运算 与 或操作 不支持问题 BIGTREE Nginx配置不支持if条件的逻辑与 逻辑或运算 而且也不支持if嵌套 例如 if e request filename request uri apple b
  • 5 建立业务需求

    业务需求代表的是需求链的顶部 它们定义解决方案的愿景和实现该方案的项目范围 用户需求和功能需求和功能需求必须与业务需求建立的背景和目标保持一致 任何无助于项目达成业务目标的需求都不宜实现 如果项目没有清晰的定义和充分沟通方向 肯定会带来灾难
  • IDEA配置tomcat服务器

    需求背景 从Eclipse转IDEA后面对的第一个问题 就是要为IDEA配置tomcat服务 否则不可用 那么 功能需求 那么 该如何配置呢 1 点击 Edit Configurations 进入tomcat服务编辑页面 如下图所示 2 点
  • 漫谈数据库表设计及索引设计

    一 数据库表设计 在数据库表设计上有个很重要的设计准则 称为范式设计 什么是范式设计 范式来自英文Normal Form 简称NF MySQL是关系型数据库 但是要想设计 个好的关系 必须使关系满足一定的约束条件 此约束已经形成了规范 分成
  • 一阶RC低通滤波器(二)

    这篇文章补充下前面讲的一阶低通滤波器 在母线电压采样或是在电机的三相端电压采样时 往往是先分压 再经过RC低通滤波器 电路图如下 1 先求输出和输入的关系 Uao Ua 从上式可以看出系统相当于一个典型的一阶低通滤波器串联了一个R2 R1
  • python-opencv之形态学操作(腐蚀和膨胀)原理详解

    形态学操作作用 Removing noise Isolation of individual elements and joining disparate elements in an image Finding of intensity
  • frp login to server failed: i/o deadline reached

    使用kcp协议有时会出现这个问题 配置改为tcp即可
  • 【科研入门】会议、期刊、出版社、文献数据库、引文数据库、SCI分区、影响因子等基础科研必备知识

    大家好 我是洲洲 欢迎关注 一个爱听周杰伦的程序员 关注公众号 程序员洲洲 即可获得10G学习资料 面试笔记 大厂独家学习体系路线等 还可以加入技术交流群欢迎大家在CSDN后台私信我 本文目录 一 会议与期刊 二 如何辨别是否正规期刊or会
  • 进阶题解:链表相交,吊打代码随想录

    随想录解法 class Solution public ListNode getIntersectionNode ListNode headA ListNode headB ListNode curA headA ListNode curB
  • #pragma data_seg共享数据使用说明

    用 pragma data seg建立一个新的数据段并定义共享数据 其具体格式为 pragma data seg shareddata HWND sharedwnd NULL 共享数据 pragma data seg 1 pragma da
  • 样本方差为何除以n-1而不是n?

    很多人可能都会有疑问 为什么要除以n 1 而不是n 如果除以n 对样本方差的估计不是无偏估计 比总体方差要小 要想是无偏估计就要调小分母 所以除以n 1 那么问题来了 为什么不是除以n 2 n 3等 所以在这里彻底总结一下 首先交代一下无偏
  • wangEditor富文本编辑器+react+antd的使用

    1 github上发现富文本编辑器 官网地址及github地址 2 结合react antd的具体使用 案例使用场景 MyModal为弹窗 弹窗显示 编辑名称及描述 描述使用wangeditor富文本编辑器实现 MyModal js imp