前端知識 | 富文本編輯器 React-draft-wysiwyg

富文本編輯器:

富文本編輯器是一種可內(nèi)嵌于瀏覽器的文本編輯器,富文本編輯器又不同于普通文本編輯器,程序員可到網(wǎng)上下載免費(fèi)的富文本編輯器內(nèi)嵌于自己的網(wǎng)站或程序里(當(dāng)然付費(fèi)的功能會更強(qiáng)大些),方便用戶編輯文章或信息。

React-draft-wysiwyg?的簡單使用:

這是一個(gè)基于 ReactJS 和 DraftJS 的一種富文本組件,想使用首先我們需要安裝依賴,我們可以使用 nodejs 中的 npm 或者?yarn?來安裝:


1. ? ?npm install -Sreact-draft-wysiwyg

2. ? ?yarn addreact-draft-wysiwyg


接下來你還需安裝的包和對應(yīng)版本:


1.?draft-js:0.10.x

2.?immutable:3.x, 4.x


最后我們就可以來簡單的使用這個(gè)組件


import React, {Component } from 'react';

import { Editor } from'react-draft-wysiwyg';

import '../node_modules/react-draft-wysiwyg/dist/react-draft-wysiwyg.css';


const EditorComponent= () =>

React-draft-wysiwyg?的樣式設(shè)計(jì):

默認(rèn)情況下編輯器將使用 DraftJS 編輯器,因?yàn)樗鼪]有任何樣式,它將占用100%寬度的容器。可以通過組件自帶的類或樣式對象來改變富文本編輯器的樣式。


1.wrapperClassName:類應(yīng)用于編輯器和工具欄上

2.editorClassName: 類應(yīng)用于編輯器的周圍

3.toolbarClassName: 類應(yīng)用于工具欄中的

4.wrapperStyle:樣式對象在編輯器和工具欄上應(yīng)用

5.editorStyle: 樣式對象在編輯器中應(yīng)用

6.toolbarStyle: 樣式對象在工具欄上應(yīng)用

React-draft-wysiwyg?中的 state:

編輯器可以實(shí)現(xiàn)為受控組件,可實(shí)現(xiàn)非受控構(gòu)件的自動(dòng)生成。

1.defaultEditorState:屬性在創(chuàng)建編輯器狀態(tài)時(shí)初始化一次,可用來改變EditorState。

2.EditorState:以受控方式更新編輯器狀態(tài)的屬性。

3.onEditorStateChange:每當(dāng)編輯器的狀態(tài)發(fā)生變化時(shí)都會調(diào)用函數(shù),可用來改變 EditorState。

4.defaultContentState:屬性在創(chuàng)建編輯器狀態(tài)時(shí)初始化一次。

5.contentState:以受控方式更新編輯器狀態(tài)的屬性。

6.onChange:每當(dāng)編輯器的狀態(tài)發(fā)生變化時(shí)都調(diào)用函數(shù)。

7.onContentStateChange:每當(dāng)編輯器文本框內(nèi)容的狀態(tài)發(fā)生變化時(shí)都會調(diào)用函數(shù),可用來改變 contentState。

代碼示例:

class ControlledEditor extends Component {

? constructor(props) {

??? super(props);

??? this.state = {

????? editorState:EditorState.createEmpty(), //用來清空編輯器中的內(nèi)容

??? };

? }


? onEditorStateChange:Function = (editorState) => {

??? this.setState({

????? editorState,

??? });

? };


? render() {

??? const { editorState} = this.state;

??? return (


???????editorState={editorState}

???? ???editorClassName="editor-class"

toolbarStyle="tool-style"???????

onEditorStateChange={this.onEditorStateChange}//每次改變編輯器中的內(nèi)容時(shí)都調(diào)用這個(gè)函數(shù)來把參數(shù)傳入 editorState

????? />

??? )

? }

}

獲取 React-draft-wysiwyg 文本框中的值:

我們可以從上面介紹的?contentState?中獲取到文本框的內(nèi)容,下面我們來看下獲取到的 json 值的格式:

{"entityMap":{},"blocks":[{"key":"637gr","text":"Initializedfromontentstate.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}}]};

內(nèi)容主要是存在了 blocks 中其中的 text 就是你在文本框輸入的內(nèi)容,后面的 type 傳的是你是否改變了原文本格式,如有改變后面會給出文本框樣式的改變。接下來就可以簡單的來使用富文本編輯器?react-draft-wysiwyg。

React-draft-wysiwyg在網(wǎng)站中的應(yīng)用:

實(shí)際應(yīng)用 React-draft-wysiwyg 的過程中,我們不僅需要獲取 React-draft-wysiwyg 中的值,我們還需要把這個(gè)值上傳到服務(wù)器,而它本身是 json 格式的值,我們需要序列化之后再上傳到服務(wù)器,這樣可以方便以后從服務(wù)器接收數(shù)據(jù)。

序列化代碼如下:

JSON.stringify(contentState)

其中?contentState?就是在上文中提到的文本輸入框的狀態(tài)。

從服務(wù)器中接收到數(shù)據(jù)后,我們需要再把數(shù)據(jù)反序列化在把數(shù)據(jù)轉(zhuǎn)化回來,在顯示到文本框中。

反序列化代碼如下:

this.setState({

contentState:JSON.parse(服務(wù)器數(shù)據(jù))

?})

先把服務(wù)器數(shù)據(jù)反序列化之后,再把數(shù)據(jù)從新傳回 contentState,這樣從服務(wù)器返回的數(shù)據(jù)就被加載到文本框中了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。