draft.js開發富文本編輯器


 

寫在前頭的話

在react中去尋找一個好用的富文本編輯器網上很少有推薦的,搜到的也只有一些個人不成熟的作品,慢慢發現網上比較推薦的一個東東叫做draft.js。

這個東西在網上可以找到的教程也是手指頭可以數到的,但是出來一年多了,使用者比較少的原因主要還是很難用

1. 它需要你理解一些富文本領域的新的理念。

2. 它不是一個成品,而是一套工具,需要你去花大量的時間用它來開發富文本編輯器,而傳統意義上的富文本編輯器都是開箱即用的,一般人很少去做這種事。

說白了就是新學一套類似於webpack一樣的系統的知識。

作為facebook力推的一款工具,它的存在就像一股橫跨web界的清流。總之react沒什么好用的富文本插件,不妨來看看它是一個什么東東吧。

開始使用

安裝

npm install draft.js
yarn add daft.js

 使用

import React from 'react';
import { Editor,EditorState} from 'draft-js';
class DraftEditor extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            editorState: EditorState.createEmpty()
        };
        this.onChange = editorState => {
            this.setState({ editorState });
        };
    }

    render() {
        let editorState = this.state.editorState;
        return (
            <Editor
                placeholder={'Write what you would say.'}
                editorState={editorState}
                onChange={this.onChange}
            />
        )
    }
}

export default DraftEditor;

完美,這樣我們就成功的入門(keng)了,顯示出來就是這樣子,如果沒有那個placeholder, 你會發現整個頁面是空的。

excuse me?

我的加粗呢,我的斜體呢,我的下划線呢?對了,這特喵的和就是個textarea嘛。

其實這就是draft的特點,並沒有提供一個開箱即用的編輯器,而是給了一套快速高效開發編輯器的工具。

冷靜下來

第一次冷靜下來之后,我開始了一波新的思考。沒錯,故事不會如此的簡單的,這么簡單,那我或者豈不是太幸福了。

第一步,他既然什么都沒有,那么我們就自己開發咯

這個是我自己寫的編輯器的樣式,四個部分

1. 前進和后退

2. 行內樣式的切換,這個是一段文字可以同時擁有多個樣式。

3. 塊級元素的樣式切換,這個的話一段文字只能擁有一個樣式

4. 多媒體,超鏈接以及一個全屏按鈕。

差不多已經夠用了,不夠用的可以自行網上加。

 

Editor是組件,EditorState是內容,那么現在我們需要渲染。就用這個吧RichUtils

import { Editor, EditorState, RichUtils } from 'draft-js';  //引入這個工具
RichUtils渲染工具,這個是最容易上手的一個方法,有了他我們就能左好多事情了。

 首先我們用四步搞定行內樣式那個

1. 首先呢,添加按鈕,el是元素,style是可以賦予的樣式。從這個數組map到編輯器里自行寫辦法搞定。

let defaultInlineStyle = [
    { el: <span style={{ fontWeight: "bold" }}>B</span>, style: 'BOLD' },
    { el: <span style={{ fontStyle: "italic" }}>I</span>, style: 'ITALIC' },
    { el: <span style={{ textDecoration: "underline" }}>U</span>, style: 'UNDERLINE' },
    { el: <span><div className="color-show" style={{ backgroundColor: '#e24' }}></div></span>, style: 'RED' },
    { el: <span><div className="color-show" style={{ backgroundColor: '#39f' }}></div></span>, style: 'BLUE' },
    { el: <span><div className="color-show" style={{ backgroundColor: '#f93' }}></div></span>, style: 'ORANGE' },
    { el: <span><div className="color-show" style={{ backgroundColor: '#3a6' }}></div></span>, style: 'GREEN' }
];
let customColorStyleMap = {
    'RED': { color: '#e24' },
    'BLUE': { color: '#39f' },
    'ORANGE': { color: '#f93' },
    'GREEN': { color: '#3a6' }
};

2. 我們定義這個map函數,把樣式名稱和樣式對應起來。就像上面那樣。為什么沒有BOLD, ITALIC, UNDERLINE呢,因為這個默認就有的

3. 編輯器里綁定方法

                <Editor
                            // basic config
                            placeholder={'Write what you would say.'}
                            editorState={editorState}

                            // event
                            onChange={this.onChange}// style
                            customStyleMap={customStyleMap}/>

我們添加了這個customStyleMap折后,然后就可以在按鈕上綁定切換樣式的方法了

              <div className="editor-btn-group">
                            {defaultInlineStyle.map(item =>
                                <span onClick={() => this.toggleInlineStyle(item.style)} key={item.style}>
                                    {item.el}
                                </span>)}
                        </div>
  toggleInlineStyle(style) {
        let state = RichUtils.toggleInlineStyle(this.state.editorState, style);
        this.onChange(state);
    }

綁定添加樣式的方法通過toggleInlineStyle來實現。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM