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

news2024/11/18 5:30:47

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)

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

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

相关文章

Vue3.0项目——打造企业级音乐App(二)图片懒加载、v-loading指令的开发和优化

系列文章目录 内容参考链接Vue3.0 项目启动Vue3.0 项目启动&#xff08;打造企业级音乐App&#xff09;Vue3.0项目——打造企业级音乐App&#xff08;一&#xff09;Tab栏、轮播图、歌单列表、滚动组件Vue3.0项目——打造企业级音乐App&#xff08;二&#xff09;图片懒加载、…

「Vue面试题」vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?

文章目录一、是什么二、如何做接口权限路由权限控制菜单权限方案一方案二按钮权限方案一方案二小结参考文章一、是什么 权限是对特定资源的访问许可&#xff0c;所谓权限控制&#xff0c;也就是确保用户只能访问到被分配的资源 而前端权限归根结底是请求的发起权&#xff0c;…

Code For Better 谷歌开发者之声——谷歌Web工具包(GWT)

&#x1f34e;个人主页&#xff1a;亮点菌的博客 &#x1f34a;个人信条&#xff1a;点亮编程之路&#xff0c;做自己的亮点 文章目录一、GWT简介二、运行模式1、开发模式&#xff08;以前称为托管模式&#xff09;2、生产模式&#xff08;以前称为Web模式&#xff09;三、组件…

前端开发:JS的事件冒泡和事件捕获详解

前言 在前端开发过程中&#xff0c;关于JS原生的核心内容使用是日常工作中的常态&#xff0c;关于底层和原理的掌握使用&#xff0c;尤其是在性能优化方面甚为重要。作为前端开发的进阶内容&#xff0c;在实际开发过程中事件发生的顺序称为事件流&#xff0c;当触发某个事件的时…

微信小程序使用 npm 包,举例图文详解

使用 npm 包前提条件&#xff1a; 下载安装&#xff0c;配置npm环境变量&#xff0c;不懂得可以上网查教程&#xff0c;本文不再描述 小程序使用 npm 包简述 1、初始化 package.json 2、勾选允许使用 npm&#xff08;新版微信小程序开发工具忽略这一步&#xff09; 3、下载…

Auto.js的介绍

Auto.js 是一款无需root权限的javascript自动化软件 auto.js是一款安卓手机应用&#xff0c;和微信一样&#xff0c;安装在手机上使用 Auto.is是一款自动化软件&#xff0c;更根据脚本内容便可自动执行相关的操作&#xff0c;并且手机无需root Auto.js的脚本需要使用JavaScri…

Vue中的v-for循环,实现div块的循环生成

前言 大家好,这里是果力成,老规矩,学之!最近在做前端页面遇到一个小问题&#xff0c;说来也不难&#xff0c;但还是花费了我的好些时间&#xff0c;保持习惯记录一下。在前端学习中不免遇到一个div或者一个数组的循环产生&#xff0c;因为挨个儿传数据显然不是最优的。这里讲述…

强大的图片预览组件Viewer.js

​ 1、 Viewer.js简介 Viewer.js 是一款强大的图片查看器。我们通过Viewer.js 在页面上添加强大的图片查看功能&#xff0c;同时&#xff0c;这款优秀的插件配置操作起来也非常的方便。 Viewer.js分为2个版本&#xff0c;js版本和jquery版本&#xff0c;下载地址分别为 纯J…

uniapp组件uni-file-picker中对上传的图片进行压缩至1兆以内

我在做uniapp项目时&#xff0c;用的uni-file-picker组件&#xff0c;这是我做的一个项目实例&#xff0c;主要是将图片通过接口传至后台服务器 如果只是上传一张照片的话 还没有什么大问题&#xff0c;但是如果一连上传很多个图片&#xff0c;像我这个项目一样&#xff0c;而且…

一文搞懂ES6的Map

什么是Map Map是ECMAScript 6 的新增特性&#xff0c;是一种新的集合类型&#xff0c;为javascript带来了真正的键/值存储机 制。 Map 对象存有键值对&#xff0c;其中的键可以是任何数据类型。 Map 对象记得键的原始插入顺序。 Map 对象具有表示映射大小的属性。 Map的基…

海康视频WEB插件 V1.5.2 开发总结

文章目录前言一、效果图二、插件使用步骤总结三、具体步骤分析1.new 一个WebControl 插件实例2.启动插件服务3.创建视频播放窗口、绑定消息回调4.初始化参数&#xff0c;其中secret参数需要通过RSA加密&#xff0c;加密公钥通过WebControl.JS_RequestInterface获取5.通过WebCon…

前端使用html2canvas生成图片踩坑

前端使用html2canvas生成图片经验总结 前言 主要是总结一下html2canvas生成图片的基础用法&#xff0c;以及自己在使用html2canvas过程中踩过的坑和相应的解决思路 背景 近段时间接手一个项目&#xff0c;需要向设备下发某一个图片&#xff0c;为了该图片可以实时更改&…

vue实现tagsview多页签导航功能

文章目录前言一、效果图二、实现思路1. 新建 tags-view.js2. 在Vuex里面引入 tags-view.js3. 新建 tabsView 组件4. 新建 ScrollPane 组件5. 引入 tabsView 组件6. 使用 keep-alive 组件&#xff0c;进行页签的缓存总结前言 基本上后台管理系统都需要有多页签的功能&#xff0…

vue 城市选择器(省市区)的使用 element-china-area-data

一、Element UI 中国省市区级联数据 本文参考&#xff1a;Element UI 中国省市区级联数据 本文参考&#xff1a;根据此文做的整理 1. 安装 npm install element-china-area-data -S2. 使用 import { regionData, CodeToText, TextToCode } from element-china-area-datareg…

vue项目打包优化及配置vue.config.js文件(实测有用)

首先我们需要在根目录里创建一个vue.config.js 首先在文件中先写入 //打包配置文件 module.exports {assetsDir: static, // outputDir的静态资源(js、css、img、fonts)目录publicPath: ./, // 静态资源路径&#xff08;默认/&#xff0c;如果不改打包后会白屏&#x…

HTML樱花飘落

樱花效果 FOR YOU GIRL 以梦为马&#xff0c;不负韶华 LOVE YOU FOREVER 实现代码 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html><head><meta http-equiv"…

【JavaScript-动画原理】如何使用js进行动画效果的实现

&#x1f482; 个人主页&#xff1a;Aic山鱼 个人社区&#xff1a;山鱼社区 &#x1f4ac; 如果文章对你有所帮助请点个&#x1f44d;吧!欢迎关注、点赞、收藏(一键三连)和订阅专哦目录 前言 1.动画原理 2.动画函数的封装 3.给不同元素添加定时器 4.缓动动画原理 5.给动…

原生JS实现FlappyBird游戏 超详细解析 快来做一个自己玩吧

目录​ 1.适配设备&#x1f43e; 2.背景滚动&#x1f490; 3.管道的创建与移动&#x1f338; 4.小鸟操作&#x1f337; 5.碰撞检测&#x1f340; 6.触屏事件&#x1f339; 7.制作开始与结束面板&#x1f33b; 8.得分统计&#x1f33a; 我们先来看看接下来我们要做的效果…

vue 路由报错

在进行如下路由跳转时 const edit (index: number) > { let row: any categoryData.value[index]; router.push({ name: “commodityedit”, query: { id: row.id, name: row.name } }); }; 遇到问题如下 TypeError: Failed to fetch dynamically imported module: http…

【uni-app】第三方ui组件推荐引入的方法

ui组件推荐 1. Muse-UI Muse UI 是一套 Material Design 风格开源组件库&#xff0c;旨在快速搭建页面。它基于 Vue 2.0 开发&#xff0c;并提供了自定义主题&#xff0c;充分满足可定制化的需求。material-design-icons 是谷歌定义的一套icontypeface 是谷歌定义的一套字体…