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

基于React的富文本编辑器——Braft Editor使用

antd 是基于 Ant Design 设计规范实现的 高质量 React 组件库,倾向于只提供符合该规范且带有视觉展现的 UI 组件,也尽量不重复造轮子。

如果要在React项目中使用富文本编辑器,官方推荐使用 react-quillbraft-editor
详细点击这里

这篇文章主要介绍 Braft EditorAntd 的结合使用。

安装

使用npm或者yarn来将本编辑器加入到你的项目中:

# 使用npm安装
npm install braft-editor --save

# 使用yarn安装
yarn add braft-editor

在Ant Design表单中使用

功能要点

  • 使用BraftEditor.createEditorState创建editorState
  • 使用editorState.toHTML()实时获取html
  • 使用editorState.isEmpty()进行空值校验

注意事项

  • 编辑器组件的数据格式为ediorState,为此在调用setFieldsValue时和在提交之前,需要进行相应的转换(toHTML())
  • 进行空值校验的话,需要自定义validator,并通过value.isEmpty()来校验,value就是一个editorState
  • 编辑器组件的验证时机需要改成onBlur,以避免不期望的验证提示和不必要的性能开销
  • 编辑器的value属性必须是一个editorState对象
  • 实际使用时请避免在onChange中直接toHTML,配合节流函数或者在合适的时机使用更恰当

编辑器演示

demo

空值校验

使用isEmpty()校验,rules中的代码如下:

rules={[
    {
        required: true,
        validator: (rule, value) => {
            if (value.isEmpty()) {
                return Promise.reject('请输入正文内容')
            } else {
                return Promise.resolve()
            }
        }
    }
]}

示例源码

编辑器支持 valueonChange 属性,这类似于React中原生的input组件。
通常情况下,可以用典型的受控组件的形式来使用本编辑器

部分代码如下:

import BaseCmp from '@components/BaseCmp.js'
import { connect } from 'react-redux'
import {
    RLInput, RLButton, RLForm, RLFormItem
} from '@components/index.js'
import { DatePicker } from 'antd'
import { createRef } from 'react'
import BraftEditor from 'braft-editor'
import actionInfoManage from '@actions/infoManage/actionInfoManage.js'
import { dealTime, dealDateTime } from '@/libs/utils.js'
import moment from 'moment'
import locale from 'antd/es/date-picker/locale/zh_CN'


class CmpInfoEdit extends BaseCmp {
    constructor(props) {
        super(props)
        this.state = {
            infoListInfo: {
                title: '',
                start_time: '',
                // 创建一个空的editorState作为初始值
                content: BraftEditor.createEditorState(null)
            }
        }
        this.form = createRef()
    }
    componentDidMount() {
        
    }

    render() {
        return (
            <div className='page-info-edit'>
                <RLForm
                    ref={form => this.form = form}
                    labelCol={{ style: { width: 150, marginRight: 20, textAlign: 'right' } }}
                    labelAlign='left'
                    wrapperCol={{ style: { span: 24, marginRight: 30 } }}
                    onFinish={this.editConfirm}
                    onFinishFailed={this.editFailed}
                    initialValues={this.state.infoListInfo}
                    validateTrigger='onBlur'
                >
                    <RLFormItem
                        name='content'
                        label='正文内容'
                        colon={false}
                        rules={[
                            {
                                required: true,
                                validator: (rule, value) => {
                                    if (value.isEmpty()) {
                                        return Promise.reject('请输入正文内容')
                                    } else {
                                        return Promise.resolve()
                                    }
                                }
                            }
                        ]}
                    >
                        <BraftEditor
                            value={this.state.infoListInfo.content}
                            onChange={editorState => {
                                this.setState({
                                    infoListInfo: {
                                        ...this.state.infoListInfo,
                                        content: editorState
                                    }
                                })
                            }}
                            media={{
                                accepts: {
                                    image: 'image/jpeg,image/png',
                                    video: 'video/mp4',
                                    audio: 'audio/mpeg,audio/mp3',
                                },
                                uploadFn: (upload) => {},

                                // onChange(...rest) {
                                //     console.log('onChange---rest', rest)
                                // }
                            }}
                            style={{ border: '1px solid #d1d1d1', borderRadius: 3, background: '#fff' }}
                        />
                    </RLFormItem>
                </RLForm>
            </div>
        )
    }

}
export default connect((store, props) => {
    return {
        ...props
    }
})(CmpInfoEdit)

相关文章:

  • vue项目docker打包通过k8s
  • 论文教程之阅读科学论文11步法,详细介绍了每个部分的关注点
  • [云原生] [kubernetes] 基于K8S安装kubesphere
  • docker部署服务初体验
  • 每日学一个设计模式23——解释器模式
  • C. Minimum Notation #823 div2
  • Python 教程之 Numpy(2)—— 数组
  • 【踩坑】在linux服务器上配置mysql并开放3306端口
  • JAVA基础(四十九)——自定义泛型
  • MySQL中的不等于
  • 【Redis】Redis高级:主从
  • 二进制方式安装k8s高可用集群(一)
  • Exception in thread main org.apache.ibatis.exceptions.PersistenceException:报错解决
  • mysql 数据库使用分享
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • 【技术性】Search知识
  • 10个最佳ES6特性 ES7与ES8的特性
  • bearychat的java client
  • create-react-app项目添加less配置
  • opencv python Meanshift 和 Camshift
  • socket.io+express实现聊天室的思考(三)
  • Sublime text 3 3103 注册码
  • 大型网站性能监测、分析与优化常见问题QA
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前端设计模式
  • 深入浅出webpack学习(1)--核心概念
  • 为视图添加丝滑的水波纹
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • Prometheus VS InfluxDB
  • 函数计算新功能-----支持C#函数
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​一些不规范的GTID使用场景
  • (2022 CVPR) Unbiased Teacher v2
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .Net Winform开发笔记(一)
  • .NET 表达式计算:Expression Evaluator
  • .NET 材料检测系统崩溃分析
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • :not(:first-child)和:not(:last-child)的用法
  • @SuppressWarnings注解
  • [51nod1610]路径计数
  • [Android View] 可绘制形状 (Shape Xml)
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法
  • [Assignment] C++1
  • [BUUCTF 2018]Online Tool(特详解)
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn