富文本及 Markdown 编辑器
基于 braft-editor 和 react-mde 的富文本编辑器。
install
$ npm install git+https://git.links123.net/node/editor.git --save
使用
RichEditor
import React from 'react'
import { RichEditor } from 'editor';
const { EditorState } = RichEditor;
export default class RichEditorDemo extends React.Component {
    state = {
        // 创建一个空的editorState作为初始值
        editorState: EditorState.createFrom('')
    }
    async componentDidMount () {
        // 假设此处从服务端获取html格式的编辑器内容
        const htmlContent = await fetchEditorContent()
        const htmlContent = '<h1>ss</h1>'
        // 使用EditorState.createFrom将html字符串转换为编辑器需要的editorState数据
        this.setState({
            editorState: EditorState.createFrom(htmlContent)
        })
    }
    submitContent = async () => {
        // 在编辑器获得焦点时按下ctrl+s会执行此方法
        // 编辑器内容提交到服务端之前,可直接调用editorState.toHTML()来获取HTML格式的内容
        const htmlContent = this.state.editorState.toHTML()
        const result = await saveEditorContent(htmlContent)
    }
    handleEditorChange = (editorState) => {
        this.setState({ editorState })
    }
    render () {
        const { editorState } = this.state
        return (
            <div>
                <RichEditor
                    value={editorState}
                    onChange={this.handleEditorChange}
                    onSave={this.submitContent}
                />
            </div>
        )
    }
}
| props | type | value | 
| controls | array |  | 
const controls = [ 'headings', 'text-color', 'bold', 'italic', 'underline', 'strike-through', 'separator',
      'superscript', 'subscript', 'remove-styles', 'emoji', 'text-align', 'separator',
            'list-ul', 'list-ol', 'blockquote', 'code', 'separator',
                'link', 'separator', 'hr', 'separator',
                'media', 'separator',  'undo', 'redo' ]
MarkdownEditor
import React from "react";
import { MarkdownEditor } from 'editor';
export default class MarkdownEditorDemo extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            mdeState: null,
        };
        this.converter = new Showdown.Converter({tables: true, simplifiedAutoLink: true});
    }
    handleValueChange = (mdeState) => {
        this.setState({mdeState});
    }
    render() {
        return (
            <MarkdownEditor
                onChange={this.handleValueChange}
                editorState={this.state.mdeState}
            />
        );
    }
}
| props | type | value | 
| layout | string | ‘horizontal’ | 
| buttonContentOptions | object |  | 
| generateMarkdownPreview | func |  | 
const icons = {
    "bold": <FontAwesomeIcon icon="bold" />,
    "heading": <FontAwesomeIcon icon="heading" />,
    "italic": <FontAwesomeIcon icon="italic" />,
    "strikethrough": <FontAwesomeIcon icon="strikethrough" />,
    "link": <FontAwesomeIcon icon="link" />,
    "quote-right": <FontAwesomeIcon icon="quote-right" />,
    "code": <FontAwesomeIcon icon="code" />,
    "image": <FontAwesomeIcon icon="image" />,
    "list-ul": <FontAwesomeIcon icon="list-ul" />,
    "list-ol": <FontAwesomeIcon icon="list-ol" />,
    "tasks": <FontAwesomeIcon icon="tasks" />,
  };
const iconProvider = (name) => {
  return icons[name] || "❓";
};
  
const defaultProps = {
        layout: 'horizontal',
        buttonContentOptions: { iconProvider },
        generateMarkdownPreview: (markdown) => Promise.resolve(this.converter.makeHtml(markdown)),
}