本章介绍的内容将在3.0.8版本中发布。
草稿文档
定义节点时设定
在自定义节点时,通过options字段指定各个状态下的样式及属性值,需要特别说明的一点是,除默认状态外,其他状态是对keyShape起作用。
// 带有图标的圆,可用于拓扑图中
G6.registerNode('circleIcon', {
// 自定义节点时的配置
options: {
// 默认配置
default: {
r: 20,
fill: '#40a9ff',
stroke: '#91d5ff',
lineWidth: 1,
x: 0,
y: 0,
// 文本样式配置
labelCfg: {
style: {
fill: '#595959'
}
},
// 节点中icon配置
icon: {
// 是否显示icon,值为 false 则不渲染icon
show: true,
// icon的地址,可以是字符串或Image
img: Icon,
width: 16,
height: 16
}
},
// 鼠标hover状态下的配置
hover: {
lineWidth: 3
},
// 选中节点状态下的配置
select: {
lineWidth: 5
}
},
// 文本位置
labelPosition: 'bottom',
drawLabel(cfg, group) {
const customStyle = this.getCustomConfig(cfg) || {};
const defaultConfig = customStyle.default || {};
const labelCfg = deepMix({}, this.options.default.labelCfg, defaultConfig.labelCfg, cfg.labelCfg);
const labelStyle = this.getLabelStyle(cfg, labelCfg, group);
const label = group.addShape('text', {
attrs: labelStyle
});
return label;
},
drawShape(cfg, group) {
const customStyle = this.getCustomConfig(cfg) || {};
const defaultConfig = customStyle.default;
// const { icon, ...circleStyle } = defaultConfig;
const attrs = deepMix({}, this.options.default, defaultConfig, cfg.style);
const keyShape = group.addShape('circle', {
attrs
});
const { icon } = attrs;
const { width, height } = icon;
const image = group.addShape('image', {
attrs: {
x: -width / 2,
y: -height / 2,
...icon
}
});
image.set('capture', false);
return keyShape;
}
}, 'circle');
默认效果
触发各状态
通过上面的方式定义完节点以后,如果要触发这个状态,则只需要通过以下方式即可:
graph.on('node:mouseenter', evt => {
const { item } = evt
graph.setItemState(item, 'hover', true)
})
graph.on('node:mouseleave', evt => {
const { item } = evt
graph.setItemState(item, 'hover', false)
})
重点说明 自定义节点或基于内置节点修改时,配置各个状态下的样式,然后根据具体业务执行graph.setItemState(item, 'stateName', true)
即可。
**
扩展内置节点
当内置的节点不能满足需求时,可以通过getCustomConfig()
或getStateStyle()
方法实现。
基于内置节点circleIcon
来扩展。
G6.registerNode('shadowCircle', {
getCustomConfig() {
return {
default: {
shadowOffsetX: 0,
shadowOffsetY: 0,
shadowBlur: 10,
shadowColor: '#e6f7ff',
lineWidth: 5,
icon: {
show: false
}
}
}
}
}, 'circleIcon')
G6.registerNode('stateCircle', {
getStateStyle(name, value, item) {
// 这里可以根据item判断,返回不同类型的style
return {
fill: 'green',
stroke: '#000',
lineWidth: 5
}
}
}, 'circleIcon')
从默认效果扩展出来的效果:
- node2:改变circle大小、颜色、icon大小及文本颜色;
- node3:改变circle的背景色,不显示icon。
node4为默认效果,5-9为扩展出来的效果。