學習 React 時作的練手項目,基於純 Hooks 和 flex 佈局實現的思惟導圖。git
項目地址:RMind,喜歡的話還請點個 star,謝謝啦~ 😉github
在線演示:RMind Democanvas
全部組件都是函數組件,由 Hook 實現事件、狀態等的管理。除了 useState
、useEffect
等基本操做外,還實現了:api
useReducer
和 useContext
的結合,代替 Redux 進行全局狀態管理。項目中第一個實現的功能是思惟導圖的繪製,當時圖省事沒有使用 canvas 或 SVG,而是將導圖節點做爲 DOM,用 CSS flex 佈局。數組
後來發現這樣算是給本身挖了個坑,繪製節點鏈接線時仍是繞不開 canvas,並且由於要獲取節點 DOM 的 offset 參數,反而顯得有些繁瑣。數據結構
不過正由於節點是 DOM,調用 DOM 的 api,很輕易就實現了拖拽功能。最初構想時覺得這會是項目裏的難點。函數
思惟導圖數據結構使用多叉樹實現,經過 DFS 進行文件的讀寫和節點查找。佈局
後來想過用平級結構存儲,渲染時根據每一個節點保存的子節點 ID 信息,實時構建一棵樹出來,可能效率還高一點,不過由於懶就沒再深刻研究。學習
用控制檯查看流量時,發現「導出功能」的頁面耗費 60k,頂得上總加載流量的一半了。考慮到這個功能打開頻率不高,利用 React.lazy
將其封裝爲懶加載組件。測試
使用 useMemo
封裝變量,減小了一些沒必要要的渲染。
一開始想的是作個基本的增刪改就行,作着作着快捷鍵加上了…主題加上了…撤銷重作加上了。context
越寫越大,帶來了一些組件的重複渲染問題。不過本地測試時還挺流暢,就先擱置不解決了😝
本人經驗能力有限,寫的代碼可能不夠美觀,可能藏了不少 bug(雖然本身已經抓出來了不少…)。但願各位高手能不吝賜教~
話很少說,下面放上項目簡介
RMind = React + Mindmap
基於 React Hooks 與 flex 佈局,實現了大部分功能的思惟導圖。
功能 | 按鍵 |
---|---|
切換所選節點 | ↑ /↓ /← /→ |
添加子節點 | Tab |
添加兄弟節點 | Enter |
刪除節點 | Backspace /Delete |
修改節點文字 | F2 |
切換顯示子節點 | Space |
撤銷 | Cmd/Ctrl +Z |
重作 | Cmd/Ctrl +Shift +Z |
編輯文字狀態下:
功能 | 按鍵 |
---|---|
取消 | Esc |
確認 | Enter |
RMind,喜歡的話還請點個 star,謝謝啦~ 😉
在線演示:RMind Demo