项目需要用到富文本编辑器,了解几个后选择了react-draft-wysiwyg。
富文本编辑的基本使用
默认模式使用比较简单
1 | import { Editor } from 'react-draft-wysiwyg'; |
自定义工具栏
需求总是想法比较多的,以上这种基本使用基本是不可能满足需求的。我们还需自定义工具栏。
这里要用到react-draft-wysiwyg 的toolbar自定义属性。
先搞个我们需要的工具栏组件,这里用到了react-color,可以搞的东西还是很多的。
1 | /* eslint-disable react/sort-comp,react/require-default-props */ |
这个库有个坑,它的样式没给暴露出属性自定义,翻了好久issues未果,我是自己改了它的\node_modules.2.14.1@react-color\lib\components\twitter\Twitter.js源码实现的需求。如下:
1 | var styles = (0, _reactcss2.default)({ |
Ok,要的东西准备好了,接下来设置下富文本控件的toolbar属性。
1 | import ColorPic from '../EditRichCustomToolbar'; |
自动获取焦点
我们的编辑需要能够自动获取焦点,这个富文本编辑封装的东西太多,没法一个autofocus解决。需要通过ref来做,步骤如下:
1 | // 构造 |
全局样式调整
这个富文本的默认行距很大,老板不愿意,可以通过设置全局的样式来控制。
新建一个CSS文件
1 | .public-DraftStyleDefault-block > div { |
导入并按如下配置:
1 | import cssStyles from './index.css'; |
富文本的展示样式调整
我们编辑后的富文本,最终要通过div展示出来,我用的是antd table去展示的,列表上的可以通过global样式去设置行间距,直接改lineHeight会有重叠问题:
1 | :global { |
对于富文本的展示,需要用到draftToHtml库,接收的参数是个json,如下:
1 | import draftToHtml from 'draftjs-to-html'; |
这里我展示时遇到个问题,有时页面刚加载,传给富文本控件的JSON是空的,导致会报错。于是在渲染时做了个catch:
1 | componentWillMount() { |
自定义控件封装
需要的是一个点击后可以进行富文本编辑的控件,
控件代码如下:
1 | /* eslint-disable no-return-assign,react/sort-comp */ |
调用方法:
1 | onCellChange = (record, dataIndex, value) => { |