富文本编辑器 Braft Editor 在业务中使用遇到的问题

3,013 阅读2分钟

在业务开发中,在Ant Design 的 Form 表单中使用,遇到了一些问题,在此记录一些。

问题一:Braft Editor 的 editorState 对象的状态管理问题

在当前的业务项目代码结构中,对Braft Editor 重新封装成一个基础组件,然后在父组件(parentComponent)中调用该基础组件,该父组件是对 Ant Design 中 Form 表单的Form.Item 表单域的一个封装,也就是该父组件(parentComponent)具有Form.Item表单域的功能,然后再在一个父层组件(grandpaComponent)中调用parentComponent组件,这时就会涉及到 Braft Editor 的 editorState 对象的状态管理问题,如果把 editorState 放到 parentComponent 的 state 里,在富文本编辑器里编辑文本内容的时候,会出现卡顿的现象,造成这个问题的原因是,editorState 对象放在了parentComponent 的state里,在编辑内容的时候,触发了grandpaComponent 组件里的所有子组件的更新。

为了解决 编辑文本卡顿的问题,就把 Braft Editor 的 editorState 对象放在其自身组件的 state 里,editorState 的状态变化由自身组件的 state 管理,这样,当 editorState 发生变化时,只是自身组件发生重新渲染,并不会引起父组件的一系列重新渲染,这就解决了编辑文本是卡顿的问题。

把 Braft Editor 的 editorState 对象放在其自身组件的 state 里,那么第二个问题来了,怎么及时的把 editorState 同步到Form表单的Form.Item的表单域里?

问题二:如何及时的把 editorState 同步到Form表单的Form.Item的表单域里?

最开始的设想是当富文本编辑器失去焦点时,把 editorState 同步到Form表单的Form.Item表单域里,但有一个问题就是,当在富文本编辑器中编辑完文本后,直接点击grandpaComponent组件中的提交按钮,此时会无法触发富文本编辑器的失去焦点事件,就会导致无法获取到最新的 editorState,那么怎么解决这个问题呢?最后的解决方案是在 grandpaComponent 组件中获取 富文本编辑器组件的实例,然后通过 富文本编辑器组件的实例获取到当前组件实例的 state,从而获取到最新的 editorState。

最终的解决方案

富文本编辑器失去焦点时同步 editorState 到Form.Item表单域 + 通过 富文本编辑器组件的实例获取到当前组件实例的 state,从而获取到最新的 editorState

确保在grandpaComponent组件点击提交按钮时Form.Item表单域有值并且能获取到最新的editorState。