因爲本文檔目錄太多,建議安裝Chrome插件 Smart TOC,可清晰一覽文檔層次結構,同時也方便按目錄跳轉查看。javascript
因本人仍在開發及探索中,目前此文檔的層級結構還沒有肯定,只能是碰到什麼便整理總結什麼,仍待更新完善。html
Github:https://github.com/blueju/vue...vue
g6-editor 做爲圖編輯器,根據官方文檔提供的DEMO,主要能作如下三類圖:java
但在實際使用中,對所提供 API 的瞭解,彷佛又不只能作如下三類圖,還可作網絡圖/拓撲圖
該目錄主要整理 g6-editor 在HTML層面的術語解釋、使用規範、示例和注意點。node
工具欄負責盛放一個操做按鈕,相似 wangEditor 中頂部的操做工具按鈕區域。git
g6-editor 已經爲咱們作好了許多工做,咱們只須要按規範寫好HTML標籤,而後給它們配上合適的圖標和標題。github
我使用的圖標是 font-awesome
<div id="toolbar"> <i data-command="save" class="command fa fa-floppy-o" title="保存"></i> <i data-command="undo" class="command fa fa-undo" title="撤銷"></i> <i data-command="redo" class="command fa fa-repeat" title="重作"></i> <i data-command="delete" class="command fa fa-trash-o" title="刪除"></i> <i data-command="zoomOut" class="command fa fa-search-minus" title="縮小"></i> <i data-command="zoomIn" class="command fa fa-search-plus" title="放大"></i> <i data-command="clear" class="command fa fa-eraser" title="清除畫布"></i> <i data-command="toFront" class="command fa fa-arrow-up" title="提高層級"></i> <i data-command="toBack" class="command fa fa-arrow-down" title="降低層級"></i> <i data-command="selectAll" class="command fa fa-check-square-o" title="全選"></i> <i data-command="copy" class="command fa fa-files-o" title="複製"></i> <i data-command="paste" class="command fa fa-clipboard" title="粘貼"></i> <i data-command="autoZoom" class="command fa fa-expand" title="實際大小"></i> <i data-command="resetZoom" class="command fa fa-compress" title="適應頁面"></i> <i data-command="addGroup" class="command fa fa-object-group" title="組合"></i> <i data-command="unGroup" class="command fa fa-object-ungroup" title="取消組合"></i> .... </div>
元素面板負責盛放一些可拖拽的元素,供使用人員拖拽到畫板中。web
元素僅僅是一個定義了一些屬性和 class 的HTML標籤,爲了給予美觀的效果,我通常會往元素標籤中添加圖片。chrome
g6-editor的官方文檔中,並未說起元素圖片,結合搜索引擎,我也僅搜索四種元素圖片,格式爲svg。canvas
若是你想本身自定義的元素圖片,建議使用svg。
名稱 | 地址 |
---|---|
起止節點 | https://gw.alipayobjects.com/... |
常規節點 | https://gw.alipayobjects.com/... |
分叉節點 | https://gw.alipayobjects.com/... |
模型節點 | https://gw.alipayobjects.com/... |
<div id="itempannel"> <div class="getItem" data-type="node" data-shape="flow-rect" data-size="120*48" data-label="常規節點" data-color="#1890FF" > <img draggable="false" src="https://gw.alipayobjects.com/zos/rmsportal/wHcJakkCXDrUUlNkNzSy.svg" /> </div> <div class="getItem" data-type="node" data-shape="flow-circle" data-size="72*72" data-label="起止節點" data-color="#FA8C16" > <img draggable="false" src="https://gw.alipayobjects.com/zos/rmsportal/ZnPxbVjKYADMYxkTQXRi.svg" /> </div> <div class="getItem" data-type="node" data-shape="flow-rhombus" data-size="80*72" data-label="分叉節點" data-color="#13C2C2" > <img draggable="false" src="https://gw.alipayobjects.com/zos/rmsportal/SnWIktArriZRWdGCnGfK.svg" /> </div> <div class="getItem" data-type="node" data-shape="flow-capsule" data-size="80*48" data-label="模型節點" data-color="#722ED1" > <img draggable="false" src="https://gw.alipayobjects.com/zos/rmsportal/rQMUhHHSqwYsPwjXxcfP.svg" /> </div> </div>
以上示例中的 class 名稱(getItem),不可刪除,不可用其餘 class 替換,不然會出現沒法將元素拖拽入畫板的問題。
元素標籤中,全部帶有 * 屬性都會被添加進節點的數據模型。
以上示例中 HTML代碼 和 data-* 屬性,已經是本人在保證語義化和無bug出現狀況下的最精簡版本,可直接複製使用。
熟悉G6的同窗可能秒懂,但若是不清楚什麼意思也不要緊,後續操做中你就會發現其聯繫。
元素圖片必須設置爲禁止拖拽,draggable="false",不然拖拽到畫板後,須要二次點擊纔會取消元素選中狀態。
<div id="page"></div>
畫布標籤的 id 必須爲 page,不然控制檯會報錯,緣由不明,錯誤以下:
必須在CSS中爲畫布設定高度
屬性欄通常在畫布右側,用於設置節點/邊/畫布等屬性,相似這種:
我初次看 g6-editor 文檔的示例DEMO時,看到屬性欄的HTML標籤中含有 data-status="node-selected" 等屬性,覺得,可是在後續的操做,並未發現 data-status="*" 的屬性的做用,也多是我暫時沒有發現。
我在實踐中感受這裏 g6-editor 並無爲咱們提供什麼現成的東西,更可能是隻是咱們須要在右側這一塊區域,建立一些表單,在進行一些操做時(好比選中一個節點),經過API獲取數據並填充到表單中,以此來展現所選元素的屬性。
<div id="detailpannel"> <!-- 節點屬性欄 --> <div id="nodeAttributeBar" data-status="node-selected"> <div class="title">節點屬性</div> <div class="main"> <el-form :model="nodeAttributeForm" label-position="top" label-width="80px"> <el-form-item label="節點文本"> <el-input v-model="nodeAttributeForm.label" @change="saveNodeAttribute"></el-input> </el-form-item> <el-form-item label="寬度"> <el-input v-model="nodeAttributeForm.width" @change="saveNodeAttribute"></el-input> </el-form-item> <el-form-item label="高度"> <el-input v-model="nodeAttributeForm.height" @change="saveNodeAttribute"></el-input> </el-form-item> <el-form-item label="顏色"> <el-color-picker v-model="nodeAttributeForm.color" @change="saveNodeAttribute"></el-color-picker> </el-form-item> </el-form> </div> </div> <!-- 邊屬性欄 --> <div id="edgeAttributeBar" data-status="edge-selected"> <div class="title">邊屬性</div> <div class="main"> <el-form :model="edgeAttributeForm" label-position="top" label-width="80px"> <el-form-item label="邊文本"> <el-input v-model="edgeAttributeForm.label" @change="saveEdgeAttribute"></el-input> </el-form-item> <el-form-item label="邊文本"> <el-select v-model="edgeAttributeForm.shape" @change="saveEdgeAttribute"> <el-option label="流程圖折線" value="flow-polyline"></el-option> <el-option label="流程圖圓⻆折線" value="flow-polyline-round"></el-option> <el-option label="流程圖曲線" value="flow-smooth"></el-option> </el-select> </el-form-item> </el-form> </div> </div> </div>
未免也太簡陋了。。。
<div id="detailpannel"> <div data-status="node-selected">節點屬性欄</div> <div data-status="edge-selected">邊屬性欄</div> <div data-status="group-selected">羣組屬性欄</div> <div data-status="canvas-selected">畫布屬性欄</div> <div data-status="multi-selected">多選時屬性欄</div> </div>
該目錄主要整理 g6-editor 在 JS 層面的術語解釋、使用規範、示例和注意點。
爲了更好服務⽤戶,G6Editor 會將 URL 和版本信息發送回 AntV 服務器,除了 URL 與 G6 版本信息外,不會收集任何其餘信息。
若有擔⼼,能夠經過下⾯的代碼關閉:
G6Editor.track(false)
該類是整個 g6-editor 的主控類,其主要職責是將 g6-editor 的各個組件協同起來。(摘自官方文檔並作了微調)
至於爲何說是類,可能他們是用 ES6 語法 class 實現的吧。
使用須要實例化
import G6Editor from "@antv/g6-editor"; const editor = new G6Editor(); ...
可打印實例化後 editor,經過查看上一層原型鏈的方式查看更多方法。除下表方法之外,還有一些方法,但均以 _ 開頭,可能爲私有方法用得少,下表再也不列舉,想看的可在控制檯自行查看。
方法 | 名稱 | 備註 |
---|---|---|
add | 添加組件 | |
commandEnable | ||
destroy | 銷燬編輯器 | |
executeCommand | 執行命令 | 經過此方法執行的操做,均會進入隊列,可撤銷/重作,建議使用 |
getCommands | ||
getComponents | ||
getComponentsByType | ||
getCurrentCommand | ||
getCurrentPage | ||
getDefaultCfg | ||
setCommandDOMenable |
根據官網文檔,事件包括鼠標事件、編輯器事件、數據變動事件、狀態變動事件、控制事件這幾類,官方文檔僅僅只是作了模糊歸納,並未詳細列出有哪些事件。
經過查閱原官方文檔、查閱源碼 和 實際操做,總結出如下事件列表:
import G6Editor from "@antv/g6-editor";const editor = new G6Editor();
const page = editor.getCurrentPage()
// 下表中,節點和邊,一併簡稱爲對象
事件 | 備註 | 提供者 |
---|---|---|
aftercommandexecute | editor 編輯器 | |
beforecommandexecute | editor 編輯器 | |
afterchange | 改變後 | page 畫布 |
afterdelete | 刪除後 | page 畫布 |
afteritemactived | page 畫布 | |
afteritemselected | 選擇對象後 | page 畫布 |
afteritemunactived | 取消激活後 | page 畫布 |
afteritemunselected | page 畫布 | |
anchor:mousedown | page 畫布 | |
anchor:mouseenter | page 畫布 | |
anchor:mouseleave | page 畫布 | |
anchor:mouseup | page 畫布 | |
beforechange | page 畫布 | |
beforeitemactived | page 畫布 | |
beforeitemselected | page 畫布 | |
beforeitemunactived | page 畫布 | |
beforeitemunselected | page 畫布 | |
click | page 畫布 | |
contextmenu | page 畫布 | |
dragedge:beforeshowanchor | page 畫布 | |
edge:mouseenter | page 畫布 | |
edge:mouseleave | page 畫布 | |
hoveranchor:beforeaddedge | page 畫布 | |
hovernode:beforeshowanchor | page 畫布 | |
keyup | page 畫布 | |
mousedown | page 畫布 | |
mouseenter | page 畫布 | |
mouseleave | page 畫布 | |
mouseup | page 畫布 | |
node:click | page 畫布 | |
node:mousedown | page 畫布 | |
node:mouseenter | page 畫布 | |
node:mouseleave | page 畫布 | |
node:mouseup | page 畫布 | |
statuschange | page 畫布 | |
使用 on 方法
上面我發現整理的事件,可
import G6Editor from "@antv/g6-editor"; let editor = new G6Editor(); // 可能沒法當即查看,可設個定時器,1秒後查看 let events = editor.getCurrentPage()._events; console.log(events);
方法有不少,我可能沒辦法將所有都列出來並解釋,在實際操做中,更多的是須要你們本身經過在控制檯打印的方式,在原型鏈中查找符合需求的方法。
將畫布數據保存爲數據模型,執行該方法將返回一個包含節點數據和邊數據的對象
import G6Editor from "@antv/g6-editor"; let editor = new G6Editor(); // 可能沒法當即查看,可設個定時器,1秒後查看 editor.getCurrentPage().save(); // {nodes: [...], edges: [...]}
將畫布數據數據保存爲圖片,執行該方法將返回一個canvas
import G6Editor from "@antv/g6-editor"; let editor = new G6Editor(); // 可能沒法當即查看,可設個定時器,1秒後查看 editor.getCurrentPage().saveImage();
讀取數據模型,並展現在畫板中,入參是一個包含節點數據和邊數據的對象
import G6Editor from "@antv/g6-editor"; let editor = new G6Editor(); let dataModel = {...} editor.getCurrentPage().read(dataModel);
共26個,按字母排序
命令 | 備註 | 適用頁面 |
---|---|---|
add | 新增元素 | |
addGroup | 組合 | |
appendChild | 添加子節點 | 腦圖 |
append | 添加相鄰節點 | 腦圖 |
autoZoom | 自適應尺寸 | 全部 |
clear | 清空畫布 | 全部 |
collapse | 收縮 | |
collapseExpand | 摺疊/展開 | |
common | ||
copy | 複製 | |
copyAdjacent | ||
delete | 刪除 | |
expand | 展開 | |
move | 移動 | |
moveMindNode | 移動腦圖節點 | |
multiSelect | 多選 | |
paste | 粘貼 | |
pasteHere | ||
redo | 重作 | |
resetZoom | 實際尺寸 | |
selectAll | 全選 | |
toBack | 下降層級 | |
toFront | 提高層級 | |
unGroup | 取消組合 | |
undo | 撤銷 | |
update | 更新 | |
zoomIn | 放大 | |
zoomOut | 縮小 | |
zoomTo |
源碼文件:g6Editor.js
源碼對應位置:將 g6Editor.js 格式化後,檢索關鍵詞 registerCommand(",以下圖:
我想經過點擊工具欄中的保存圖標來保存數據模型
<i data-command="save" class="command fa fa-floppy-o" title="保存"></i>
使用 editor.Command.registerCommand() 方法註冊自定義命令save,在其正向命令中,添加本身須要的處理邏輯。
Command.registerCommand("save", { // 命令是否進入隊列,進入隊列可執行撤銷/重作,默認是 true queue: false, // 命令是否可用 enable(eidtor) { return true; }, // 正向命令 execute(editor) { ... }, // 反向命令 back(editor) { ... }, // 快捷鍵:Ctrl + Shirt + S shortcutCodes: [["ctrlKey", "shiftKey", "s"]] });
固然咱們有另一種方式,即給保存圖標添加點擊事件,在方法中執行本身須要的處理邏輯。
註冊的自定義命令中,即使你設置了快捷鍵,但仍是默認不啓用的。
若是須要啓用,須要按以下設置進行開啓。
因爲我本人使用的 Flow 流程圖,因此在 Flow 中設置開啓,若是你使用的是 MindMap 腦圖,則可能在 new G6Editor.MindMap({}) 中設置開啓。
const flow = new G6Editor.Flow({ graph: { container: "page" }, shortcut: { // 開啓保存快捷鍵 save: true } });
經過快捷鍵,可快速執行一些命令,默認狀況下,含快捷鍵的內置命令有:
下表中的"Mac快捷鍵" 和"適用頁面",摘自官方文檔,本人未驗證源碼文件:g6Editor.js
源碼對應位置:將 g6Editor.js 格式化後,檢索關鍵詞 shortcutCodes: [
官方文檔PDF中的快捷鍵表格,存在錯誤,由於在源碼檢索 copy/paste 等命令並未發現其有快捷鍵
共有10個,按字母排序
命令 | Win 快捷鍵 | Mac 快捷鍵 | 備註 | 適⽤⻚⾯ |
---|---|---|---|---|
append | Enter | Enter | 添加相鄰節點 | 思惟導圖 |
appendChild | Tab | Tab | 添加⼦節點 | 思惟導圖 |
collapseExpand | Ctrl + / | ⌘/ | 摺疊/展開 | 思惟導圖 |
delete | Delete | Delete | 刪除 | 全部頁面 |
redo | Ctrl + Shift + Z | ⇧⌘Z | 重作 | 全部頁面 |
resetZoom | Ctrl + 0 | ⌘0 | 實際尺⼨ | 全部頁面 |
selectAll | Ctrl+A | ⌘A | 全選 | 全部頁面 |
undo | Ctrl + Z | ⌘Z | 撤銷 | 全部頁面 |
zoomIn | Ctrl + = | ⌘= | 放大 | 全部頁面 |
zoomOut | Ctrl + - | ⌘- | 縮小 | 全部頁面 |
命令 | Win 快捷鍵 | Mac 快捷鍵 | 備註 | 適⽤⻚⾯ |
---|---|---|---|---|
clear | 清空畫布 | 全部頁面 | ||
selectAll | Ctrl+A | ⌘A | 全選 | 全部頁面 |
undo | Ctrl + Z | ⌘Z | 撤銷 | 全部頁面 |
redo | Ctrl + Shift + Z | ⇧⌘Z | 重作 | 全部頁面 |
delete | Delete | Delete | 刪除 | 全部頁面 |
zoomIn | Ctrl + = | ⌘= | 放大 | 全部頁面 |
zoomOut | Ctrl + - | ⌘- | 縮小 | 全部頁面 |
autoZoom | ⾃適應尺⼨ | 全部頁面 | ||
resetZoom | Ctrl + 0 | ⌘0 | 實際尺⼨ | 全部頁面 |
toFront | 提高層級 | 全部頁面 | ||
toBack | 降低層級 | 全部頁面 | ||
copy | Ctrl + C | ⌘C | 複製 | 流程圖 |
paste | Ctrl + V | ⌘V | 粘貼 | 流程圖 |
multiSelect | 多選模式 | 流程圖 | ||
addGroup | Ctrl + G | ⌘G | 組合 | 流程圖 |
unGroup | Ctrl + Shift + G | ⇧⌘G | 取消組合 | 流程圖 |
append | Enter | Enter | 添加相鄰節點 | 思惟導圖 |
appendChild | Tab | Tab | 添加⼦節點 | 思惟導圖 |
collapseExpand | Ctrl + / | ⌘/ | 摺疊/展開 | 思惟導圖 |
源碼位置:
common | 直線,不帶箭頭 |
flow-base | 直線,帶箭頭 |
flow-polyline | 流程圖折線 |
flow-polyline-round | 流程圖圓角折線 |
flow-smooth | 流程圖曲線 |
diagram-base | 直線,帶箭頭。 與 flow-base 的區別未知。 |
page-base | 僅在源碼中發現其被註冊爲內置邊,未實際操做,效果未知。 |
mind-placeholder-edge | 弧線,無錨點,線位於節點底部,更適用於思惟導圖。 |
mind-edge | 弧線,更適用於思惟導圖腦圖。 |
koni-base | 拖拽target目標節點時,邊會圍繞source源節點,自動調整爲最近的錨點。 直線,帶箭頭,更適用於⽹絡圖/拓撲圖。 |
源碼文件:g6Editor.js
源碼對應位置:將 g6Editor.js 格式化後,檢索關鍵詞 registerCommand(",以下圖: