Draft.js基於immutable.js實現了壹個不可變的數據結構基於這個數據結構,Draft.js實現了壹個單壹的數據流,即event->;onChange-& gt;編輯狀態
我在CodePen上實現了壹個簡單的演示來顯示EditorState。妳可以在上面試試。
上圖展示了壹個完整的EditorState,我們可以很容易的猜測出壹些屬性的含義,比如currentContent記錄了當前編輯器中顯示內容的狀態,selection標識了當前選擇,redoStack和undoStack分別是undo和redo stack,而EditorState提供了操作這些屬性的頂層方法。
草稿將樣式分為塊級樣式和內聯樣式。塊級樣式線性排列,不能嵌套,而行內樣式由數組記錄,可以重疊。
當我在draft中隨機輸入壹些文本時,text會記錄文本內容,此時用來記錄塊級樣式的type值是unstyled。
現在我們把H1(塊級元素)應用到文本中,可以發現用來標識塊級樣式的type值變成了header-one,當我們繼續在這壹行輸入的時候,它會被賦予同樣的H1樣式。通過上面的數據結構我們可以發現,塊級樣式是由類型指定的,所以塊級樣式是不能嵌套的,也就是不會出現無序列表嵌套在有序列表中的情況。
對於同壹個塊級元素中的文本內容,draft將其拆分成字符,每個字符的內聯樣式通過數組顯示,解決了內聯樣式的嵌套問題。
實體不是不可理解的數據類型。實體數據主要用來展現壹些不可分割的數據類型,比如圖片、情感、超鏈接等等。
典型的場景是情感型。詳細來說,我們在日常使用中會提到壹些富文本編輯器中的人。@xxx的數據類型需要統壹的整體。壹旦刪除了@xxx中的某個字符,就有可能導致@的名字與@的賓語不壹致。
在上圖中,我打印出了插入的圖像數據結構,我們可以發現它是壹個實體,記錄了數據,可變性和類型,Draft.js並公開了壹個頂層接口。在註入實體數據時,可以通過該接口設計數據對象的展現方式,如下圖所示。