vue 白边 项目_GUIDE.md · kaiking_g/g6-vue-demo - Gitee.com
# 使用教程
## 安裝
```js
npm install @antv/g6
npm install welabx-g6
```
## 引入/使用
v0.4.x (不推薦)
```js
import WelabxG6 from 'welabx-g6';
const g6 = new WelabxG6({
// config
});
const graph = g6.instance; // G6實(shí)例
graph.read(data);
graph.paint();
// 銷(xiāo)毀實(shí)例
g6.destroy();
```
## v0.5+ (推薦)
```js
import G6 from '@antv/g6';
import registerFactory from 'welabx-g6';
const config = registerFactory(G6, {
// g6 config
});
const graph = new G6.Graph(config);
graph.read(data);
graph.destory();
```
### 自定義節(jié)點(diǎn)和邊(邊支持設(shè)置箭頭)
| 非內(nèi)置節(jié)點(diǎn)和邊 | type | 寬高/半徑屬性 |
| ---- | ---- | ---- |
| rect-node | 方形節(jié)點(diǎn) | width, height, radius(圓角) |
| circle-node | 圓形節(jié)點(diǎn) | r (半徑) |
| ellipse-node | 橢圓節(jié)點(diǎn) | rx, ry 橢圓焦距 |
| diamond-node | 菱形節(jié)點(diǎn) | size, 默認(rèn) [80, 80] |
| triangle-node | 三角形節(jié)點(diǎn) | size, 默認(rèn) [60, 100] direction, 默認(rèn) 'up', 可設(shè)為 'down' |
| line-edge | 自定義邊 | 默認(rèn)屬性 |
| polyline-edge | 自定義邊 | 默認(rèn)屬性 |
| quadratic-edge | 自定義邊 | 默認(rèn)屬性 |
| cubic-edge | 自定義邊 | 默認(rèn)屬性 |
| hvh-edge | 自定義邊 | 單向開(kāi)口 |
| hvh-h-edge | 自定義邊 | 雙向開(kāi)口 |
### 事件監(jiān)聽(tīng)與通知
> 已支持事件列表
| 事件名稱 | 回調(diào)參數(shù) | 說(shuō)明 |
| ---- | ---- | ---- |
| after-node-selected | event 對(duì)象 | 節(jié)點(diǎn)選中事件 |
| after-edge-selected | event 對(duì)象 | 邊選中事件 |
| on-canvas-click | event 對(duì)象 | 鼠標(biāo)點(diǎn)擊畫(huà)布事件 |
| on-canvas-dragend | event 對(duì)象(內(nèi)置了畫(huà)布偏移量dx, dy) | 畫(huà)布拖拽結(jié)束事件 |
| on-node-mouseenter | event 對(duì)象 | 鼠標(biāo)移入節(jié)點(diǎn)事件 |
| on-node-mousemove | event 對(duì)象 | 鼠標(biāo)在節(jié)點(diǎn)上移動(dòng)事件(持續(xù)觸發(fā)) |
| on-node-mouseleave | event 對(duì)象 | 鼠標(biāo)從節(jié)點(diǎn)上移開(kāi)事件 |
| on-node-mousedown | event 對(duì)象 | 鼠標(biāo)左鍵按下節(jié)點(diǎn)事件 |
| on-node-mouseup | event 對(duì)象 | 鼠標(biāo)左鍵抬起節(jié)點(diǎn)事件 |
| on-node-dragstart | event 對(duì)象 | 節(jié)點(diǎn)拖拽開(kāi)始事件(也是錨點(diǎn)拖拽事件) |
| on-node-drag | event 對(duì)象 | 節(jié)點(diǎn)拖拽中事件(也是錨點(diǎn)拖拽事件) |
| on-node-dragend | event 對(duì)象 | 節(jié)點(diǎn)拖拽結(jié)束事件(也是錨點(diǎn)拖拽事件) |
| on-node-drop | event 對(duì)象 | 在節(jié)點(diǎn)上釋放事件(e.item 當(dāng)前拖拽節(jié)點(diǎn), e.target 當(dāng)前釋放節(jié)點(diǎn)) |
| on-edge-mouseenter | event 對(duì)象 | 同節(jié)點(diǎn)事件 |
| on-edge-mousemove | event 對(duì)象 | 同節(jié)點(diǎn)事件 |
| on-edge-mouseleave | event 對(duì)象 | 同節(jié)點(diǎn)事件 |
| before-node-removed | event 對(duì)象 | 節(jié)點(diǎn)移除前的事件 |
| after-node-removed | event 對(duì)象 | 節(jié)點(diǎn)移除后的事件 |
| after-node-dblclick | event 對(duì)象 | 雙擊節(jié)點(diǎn)事件 |
| after-edge-dblclick | event 對(duì)象 | 雙擊邊事件 |
| before-edge-add | event 對(duì)象 | 添加邊之前的事件 |
(回調(diào)中有些情況下是空, 有些回調(diào)會(huì)觸發(fā)多次, 因?yàn)閮?nèi)部也在使用, 如果影響較大, 后期考慮減少空回調(diào)和重復(fù)回調(diào))
```js
graph.on('after-node-selected', e => {
if(e && e.item) {
console.log(e.item.get('id'));
}
});
graph.on('after-edge-selected', e => {
if(e && e.item) {
console.log(e.item.get('id'));
}
});
graph.on('before-node-removed', ({target, callback}) => {
console.log(target);
setTimeout(() => {
callback(true);
}, 1000);
});
graph.on('before-edge-add', ({ source, target, sourceAnchor, targetAnchor }) => {
setTimeout(() => {
this.graph.addItem('edge', {
source: source.get('id'),
target: target.get('id'),
sourceAnchor,
targetAnchor,
label: 'edge label',
// ... item 其他屬性
});
}, 1000);
});
// 自定義事件監(jiān)聽(tīng)需在 registerFactory 中定義
```
### 添加節(jié)點(diǎn)
```js
// 節(jié)點(diǎn) model 中添加 singleEdge 屬性時(shí), 拖拽錨點(diǎn)只能生成 1 條邊
const model = {
label: 'node',
id: '1', // 非必傳
// 形狀
type: 'rect-node', // e.target.dataset.shape
// 坐標(biāo)
x: e.clientX - 50,
y: e.clientY + 200,
singleEdge: true, // 拖拽錨點(diǎn)只能生成 1 條邊
};
graph.addItem('node', model);
```
> 自定義的 modes
- canvas-event
- delete-item
- select-node
- hover-node
- drag-node
- active-edge
## 自定義G6實(shí)例
```js
import G6 from '@antv/g6';
import registerFactory from 'welabx-g6';
const config = registerFactory(G6, {
// ...
});
const graph = new G6.TreeGraph(config);
graph.read({
nodes: [{
id: 'root',
label: 'Root',
children: [{
id: '1',
data: {
action: '初始化',
},
type: 'modelRect-node',
style: { // 節(jié)點(diǎn)樣式
// fill: '#39495b',
},
// 左側(cè)方條
preRect: {
show: true, // 是否顯示左側(cè)方條
width: 4,
fill: '#40a9ff',
radius: 2,
},
labels: [{
x: -70,
y: -10,
label: '標(biāo)題,最長(zhǎng)10個(gè)字符~~',
labelCfg: {
fill: '#666',
fontSize: 14,
maxlength: 10,
},
}, {
x: -70,
y: 7,
label: '描述,最長(zhǎng)12個(gè)字符~~~',
labelCfg: {
fontSize: 12,
fill: '#999',
maxlength: 12,
},
}, {
x: -70,
y: 24,
label: '第三行,最長(zhǎng)16個(gè)字符,超出顯示省略號(hào)~~~',
labelCfg: {
fontSize: 10,
fill: '#ccc',
maxlength: 16,
},
}],
}, {
id: '2',
type: 'modelRect-node',
style: {
width: 230,
height: 60,
fill: '#65b586',
lineWidth: 0,
},
label: '初始化事件和生命周期和其他',
labelCfg: {
stroke: '#ccc',
fill: '#fff',
maxlength: 10,
},
}],
}]
});
```
## 注冊(cè)自定義節(jié)點(diǎn)/邊/行為
```js
import G6 from '@antv/g6';
import registerFactory from 'welabx-g6';
G6.registerNode('your-node', {
// your code here
});
// 注冊(cè)自定義邊
G6.registerEdge('your-edge', {
// your code here
});
// 注冊(cè)自定義行為
G6.registerBehavior('your-behavior', {
// your code here
});
const config = registerFactory(G6, {
// ...
});
const graph = new G6.TreeGraph(config);
graph.read(data);
graph.paint();
// 銷(xiāo)毀實(shí)例
graph.destroy();
```
## 二次繼承
> *-node 支持二次繼承擴(kuò)展?fàn)顟B(tài)回調(diào)了!
> 先繼承 [*-node], 在生命周期中通過(guò) stateApplying 方法進(jìn)行狀態(tài)值處理
```js
/* file 1 */
export default G6 => {
G6.registerNode('your-unique-node', {
shapeType: 'rect',
draw (cfg, group) {
return this.drawShape(cfg, group);
},
stateApplying (name, value, item) {
// 繼承更多狀態(tài)回調(diào)
},
}, 'rect-node' /* 要繼承的 *-node */);
}
```
```js
/* file 2 */
import G6 from '@antv/g6';
import register from 'welabx-g6';
const config = registerFactory(G6, {
// ...
});
const graph = new G6.TreeGraph(config);
graph.read({
// your data
});
```
## 完整案例
```js
import G6 from '@antv/g6';
import registerFactory from 'welabx-g6';
const data = {
node: [
{
id: '1',
data: {
// 業(yè)務(wù)數(shù)據(jù)
},
type: 'rect-node', // 對(duì)應(yīng)注冊(cè)的節(jié)點(diǎn)name, 還可以是 ellipse-node / rect-node / diamond-node 等
style: {
// ... 當(dāng)前節(jié)點(diǎn)的樣式
r: 40, // 圓形節(jié)點(diǎn)半徑
fill: 'orange',
lineDash: [1, 2],
shadowOffsetX: 0,
shadowOffsetY: 2,
shadowColor: '#666',
shadowBlur: 10,
hover: {
fill: '#ccc',
},
selected: {
stroke: '#ccc',
},
},
label: 'new Vue()', // 節(jié)點(diǎn)上顯示的文字
// node 文本默認(rèn)樣式
labelCfg: {
fill: '#fff',
textAlign: 'center',
textBaseline: 'middle',
fontWeight: 'bold',
fontSize: 24,
},
// 當(dāng)前節(jié)點(diǎn)多狀態(tài)樣式, 覆蓋全局樣式, 僅對(duì)當(dāng)前節(jié)點(diǎn)生效
nodeStateStyles: {
'nodeState:default': {
fill: 'orange',
},
'nodeState:hover': {
fill: '#ffbd17',
},
'nodeState:selected': {
fill: '#f1ac00',
},
},
},
{
id: 'node-2',
label: 'beforeCreate',
type: 'rect-node',
style: {
radius: 2,
},
// 自定義錨點(diǎn)數(shù)量和位置(二維數(shù)組, 含義參見(jiàn)官網(wǎng))
anchorPoints: [
[0, 0],
[0.5, 0],
[0, 1],
[0.5, 1],
[1, 0],
[1, 1],
],
},
],
edges: [
{
source: '1', // 來(lái)源節(jié)點(diǎn) id
target: '2', // 目標(biāo)節(jié)點(diǎn) id
label: '條件', // 邊上的文字 / 當(dāng)前只支持1個(gè)文案
data: { // 當(dāng)前邊的自定義屬性
type: 'xxx',
amount: '100,000 元',
date: '2019-08-03',
},
style: {
stroke: '#ccc',
lineDash: [5,5],
lineWidth: 2,
lineAppendWidth: 10,
// 支持引用 G6內(nèi)置箭頭了!
endArrow: {
path: G6.Arrow.rect(10, 10, 3),
fill: '#aab7c1',
stroke: '#aab7c1',
},
},
labelCfg: {
position: 'center', // 其實(shí)默認(rèn)就是 center,這里寫(xiě)出來(lái)便于理解
autoRotate: true, // 使文本隨邊旋轉(zhuǎn)
style: {
stroke: 'white', // 給文本添加白邊和白色背景
fill: '#722ed1', // 文本顏色
lineWidth: 5, // 文本白邊粗細(xì)
},
},
// 邊的多狀態(tài)樣式, 會(huì)覆蓋全局樣式, 僅對(duì)這條邊生效
edgeStateStyles: {
'edgeState:default': {
strokeOpacity: 1,
stroke: '#ccc',
animate: false,
},
'edgeState:hover': {
strokeOpacity: 0.6,
stroke: '#ccc',
animate: true,
animationType: 'ball', // 內(nèi)置 ball/dash 兩種動(dòng)畫(huà), 默認(rèn)使用 dash
},
'edgeState:selected': {
strokeOpacity: 1,
stroke: '#ccc',
},
},
},
],
}
const minimap = new G6.Minimap({
size: [200, 100],
});
const confg = registerFactory(G6, {
container: 'id',
width: 1000,
height: 300,
renderer: 'canvas', // 默認(rèn) canvas, 也可選用 svg, 但有些事件沒(méi)有兼容, 也不打算兼容了, 只維護(hù)canvas版本
// 自定義注冊(cè)行為, 事件, 交互
plugins: [minimap],
defaultEdge: {
type: 'polyline-edge', // 擴(kuò)展了內(nèi)置邊, 有邊的事件
style: {
radius: 5,
offset: 15,
stroke: '#aab7c3',
lineAppendWidth: 10, // 防止線太細(xì)沒(méi)法點(diǎn)中
/* startArrow: {
path: 'M 0,0 L 8,4 L 7,0 L 8,-4 Z',
fill: '#aab7c3',
}, */
endArrow: {
path: 'M 0,0 L 8,4 L 7,0 L 8,-4 Z',
fill: '#aab7c1',
stroke: '#aab7c1',
},
},
},
// 默認(rèn)節(jié)點(diǎn)不同狀態(tài)下的樣式集合
nodeStateStyles: {
'nodeState:default': {
fill: '#E7F7FE',
stroke: '#1890FF',
},
'nodeState:hover': {
fill: '#d5f1fd',
},
'nodeState:selected': {
fill: '#caebf9',
stroke: '#1890FF',
},
},
// 默認(rèn)邊不同狀態(tài)下的樣式集合
edgeStateStyles: {
'edgeState:default': {
stroke: '#aab7c3',
},
'edgeState:selected': {
stroke: '#1890FF',
},
'edgeState:hover': {
stroke: '#1890FF',
},
},
// ... 其他G6參數(shù)
});
const graph = new G6.Graph(config);
graph.read(data);
```
## modelRect-node 與樹(shù)圖配置
```js
// 樹(shù)形結(jié)構(gòu)
data = {
id: 'root',
label: 'Root',
type: 'modelRect-node',
style: {
// 節(jié)點(diǎn)樣式
},
edgeStyle: { // 邊的樣式
stroke: '#39495b',
},
children: [{
type: 'modelRect-node',
style: {
fill: '#fff',
},
// 左側(cè)方條
preRect: {
show: true, // 是否顯示左側(cè)方條
width: 4,
fill: '#40a9ff',
radius: 2,
},
// logo圖標(biāo), 注意: 坐標(biāo) (0, 0) 代表圖形幾何中心
logoIcon: {
show: true, // 是否顯示圖標(biāo)
x: 0, // 控制圖標(biāo)在橫軸上的位置
y: 0, // 控制圖標(biāo)在縱軸上的位置
// url 用于圖標(biāo)地址
img: 'https://gw.alipayobjects.com/zos/basement_prod/4f81893c-1806-4de4-aff3-9a6b266bc8a2.svg',
// 相對(duì)路徑
// img: require('../../image.png'),
text: '\ue610;', // 用于支持 iconfont, text 是 iconfont.css 中的content, 注意加 u
width: 16,
height: 16,
// 圖標(biāo)樣式
style: {
stroke: '#333',
fill: '#fc0',
},
},
// 狀態(tài)圖標(biāo), 注意: 坐標(biāo) (0, 0) 代表圖形幾何中心
stateIcon: {
show: true, // 是否顯示圖標(biāo)
x: 70, // 控制圖標(biāo)在橫軸上的位置
y: 10, // 控制圖標(biāo)在縱軸上的位置
text: '\ue610', // css中對(duì)應(yīng)的content, 注意加 u
fontFamily: 'iconfont', // 這里是css中定義的字體名稱
fontSize: 20,
style: {
stroke: '#333',
fill: '#fc0',
},
},
// 這里是數(shù)組! 這里是數(shù)組! 這里是數(shù)組!
labels: [{
label: '標(biāo)題,最長(zhǎng)10個(gè)字符~~',
labelCfg: {
textBaseline: 'middle',
fontWeight: 'bold',
maxlength: 10, // 超出10個(gè)字符顯示省略號(hào)
fontSize: 14,
fill: '#666',
},
className: 'node-text-0', // 可用于綁定自定義事件
}, {
label: '描述描述',
labelCfg: {
maxlength: 12,
fontSize: 12,
fill: '#999',
},
className: 'node-text-1',
}, {
label: '第三行,最長(zhǎng)16個(gè)字符,超出顯示省略號(hào)~~~',
labelCfg: {
maxlength: 16,
fontSize: 10,
fill: '#ccc',
},
className: 'node-text-2',
}],
}]
};
```
## 隱藏所有節(jié)點(diǎn)錨點(diǎn)
```js
defaultNode: {
anchorControls: {
hide: true, // 隱藏所有錨點(diǎn)
},
}
```
一鍵復(fù)制
編輯
Web IDE
原始數(shù)據(jù)
按行查看
歷史
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的vue 白边 项目_GUIDE.md · kaiking_g/g6-vue-demo - Gitee.com的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ubuntu安装mysql远程_Ubun
- 下一篇: c#.net配置mysql数据库连接池_