富文本编辑器braft-editor的使用

在写react时需要用到富文本编辑器,找了很多后最后选择了braft-editor富文本编辑器

  • 美观易用的react富文本编辑器
  • 可结合antd使用
  • 本质是封装的draft-js
  • 提供多媒体的功能(图片、音频、视频)

这里我只介绍常见的一些功能和问题,详情请参考官网

在这里插入图片描述
在这里插入图片描述
项目地址:github地址
预览地址:预览地址

基本使用

通过valueonChangeeditorState组件进行双向绑定,注意value的值的类型必须是editorState对象(这一点类似于Ant Design中的日期选择器组件,它使用moment对象作为数据格式)

import BraftEditor from 'braft-editor'

...

state = {
	editorState: BraftEditor.createEditorState(null)
}

...
handleChange = (editorState) => {
	this.setState({ editorState })
}

...
 <BraftEditor
	value={this.state.editorState}
	onChange={this.handleChange}
 />

判断富文本编辑的内容是否为空
this.state.editorState.isEmpty()

清空富文本编辑器的内容
this.setState({
      editorState: ContentUtils.clear(this.state.editorState)
  })
}

我刚开始的时候直接用editorState:BraftEditor.createEditorState(null)来清空富文本编辑器的内容,但是清空后发现光标跳动,最后用了上面clear方法清空才解决问题。

多媒体上传
  1. 获取上传的文件(param.file)
  2. 上传到服务器(这里可用任何一个ajax作为通信工具,我使用的是fetch)
  3. 获取上传结果,根据结果调用param的方法
 myUploadFn = async (param) => {
        const formData = new FormData();
        formData.append('file', param.file);
        const res = await fetch(`${process.env.REACT_APP_BASE_URL}/upload`, {
            method: 'POST',
            headers: {
                Authorization: `Bearer ${isAuthenticated()}`,
            },
            body: formData
        }).then(response => response.json())

        if (res.status === 0) {
            param.success(res.data)   //success需要一个有url属性的对象{url:'...'}
        } else {
            param.error({
                msg: '上传错误'
            })
        }
    }

定制键盘命令

BraftEditor组件其实是封装的DraftJSBraftEditor组件没有提供键盘的回车事件,我们可以用DraftJS的属性去做键盘事件

...
//定制键盘命令
 handleKeyCommand = (command) => {
     //如果是回车命名就处理
     if (command === 'split-block') {
         //回车事件的处理函数
         this.test()
         return 'handled';
     }
     return 'not-handled';
 }
 
 <BraftEditor
 	//直接传给DraftJS的Editor组件的属性
	 draftProps={{
         handleKeyCommand: this.handleKeyCommand
     }}
 />

当富文本编辑器按下键盘命令时,会触发handleKeyCommand,将此时触发的命令作为参数传递到处理函数中。
回车命令、退格命令、保存命令(ctrl+s)分别对应split-block、backspace、braft-save。当处理函数handleKeyCommand返回’handled’,则认为该命令已处理。如果它返回’not-handled’,执行默认命令

好的,你可以参考下面这个示例代码: ```jsx import React, { useState } from "react"; import BraftEditor from "braft-editor"; import "braft-editor/dist/index.css"; const initialContent1 = "<p>Hello World!</p>"; const initialContent2 = "<p>Hello BraftEditor!</p>"; const DiffViewer = ({ content1, content2 }) => { const [diff, setDiff] = useState(""); const handleCompare = () => { const diffResult = window.diffString(content1, content2); setDiff(diffResult); }; return ( <div> <div> <h3>Content 1</h3> <BraftEditor readOnly value={content1} /> </div> <div> <h3>Content 2</h3> <BraftEditor readOnly value={content2} /> </div> <div> <button onClick={handleCompare}>Compare</button> </div> <div> <h3>Diff Result</h3> <pre>{diff}</pre> </div> </div> ); }; const App = () => { return <DiffViewer content1={initialContent1} content2={initialContent2} />; }; export default App; ``` 这段代码中,我们首先定义了两个富文本内容 `initialContent1` 和 `initialContent2`,然后创建了一个 `DiffViewer` 组件。该组件包含了两个 `BraftEditor` 组件,分别用于展示 `content1` 和 `content2` 的内容。 当用户点击 `Compare` 按钮时,我们会调用 `window.diffString` 函数来计算出两段文本的差异,并将结果保存在 `diff` 状态中。最后,我们将 `diff` 显示在页面上。 要让这段代码能够运行,你需要在 `index.html` 文件中添加以下内容: ```html <script src="https://cdnjs.cloudflare.com/ajax/libs/diff_match_patch/20200713/diff_match_patch.js"></script> <script> window.diffString = function (a, b) { var dmp = new diff_match_patch(); var diff = dmp.diff_main(a, b); dmp.diff_cleanupSemantic(diff); return dmp.diff_prettyHtml(diff); }; </script> ``` 这里我们加载了 `diff_match_patch.js` 库,并定义了一个 `window.diffString` 函数来计算文本差异。注意,这个函数只是一个简单的示例,如果你需要更复杂的差异比较功能,你需要使用更专业的库来实现。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值