0.0.24 • Published 1 year ago

@aoviz/graphs v0.0.24

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

@aoviz/graphs

简洁,轻量,可配置的图渲染组件

npm.io

快速上手

import { Force } from '@aoviz/graphs';

以 React 使用为例:

function Viz() {
  const wrapper = useRef<HTMLDivElement>(null);
  useEffect(() => {
    const instance = new Force(wrapper.current!);
    instance.data(data);
  }, [wrapper]);
  return <div ref={wrapper} style={{ height: 500 }}></div>;
}

传入的渲染数据类型:

interface IData {
  nodes: INode[];
  links: ILink[];
}

interface INode {
  id: string;
  name: string;
}

interface ILink {
  id: string;
  source: string;
  target: string;
  name: string;
  cfg?: ILinkCfg;
}

interface INodeCfg {
  radius: number;
  label: ILabel;
  backgroundColor: string;
}

interface ILinkCfg {
  label: Omit<ILabel, 'borderRadius'>;
  curveOffset: number;
  shape: 'line' | 'arc' | 'self';
  stroke: string;
}

图组件配置数据类型:

interface IOption {
  node?: INodeCfg;
  link?: ILinkCfg;
  layout: Partial<ILayoutForceOption>;
}

interface ILayoutForceOption {
  chargeStrength: number; // 电荷力强度,为正模拟重力(吸引力),为负模拟排斥力
  collideStrength: number; // 节点间碰撞强度,范围 [0,1]
  width: number; // 画布宽度,默认父元素宽度
  height: number; // 画布高度,默认传入父元素高度
  linkDistance: number; // 关系的间距
}

图组件默认配置:

const DEFAULT_FONT_STYLE = {
  fontSize: 12,
  fontWeight: 'normal',
  fontFamily: 'sans-serif',
};

export const DEFAULT_OPTION: IOption = {
  node: {
    label: {
      width: 120,
      color: 'rgba(255,255,255,1)',
      ...DEFAULT_FONT_STYLE,
      backgroundColor: 'rgba(0,0,0,.65)',
      borderRadius: 12,
    },
    backgroundColor: '#6EA3FD',
    radius: 28,
  },
  link: {
    label: {
      width: 150,
      color: 'rgba(0,0,0,.65)',
      ...DEFAULT_FONT_STYLE,
      backgroundColor: '#fff',
    },
    stroke: '#9c9b9b',
    shape: 'line',
    curveOffset: 22,
  },
  layout: {
    chargeStrength: -1600,
    collideStrength: 0.5,
    linkDistance: 300,
  },
};

ForceInstance

名称说明类型
data()设置渲染的数据,调用该方法后自动执行布局重绘操作IForceData
getZoom()获取当前缩放比例number
setZoom()设置缩放比例number
onNodeClick$获取节点的 Click 事件Observable<IRenderNode>
onNodeHover$获取节点的 Hover 事件Observable<IRenderNode \| null>
onLinkClick$获取关系的 Click 事件Observable<IRenderLink>
onLinkHover$获取关系的 Hover 事件Observable<IRenderLink \| null>
onNodeDrag$获取节点的 Click 事件Observable<INodeDragEvent>

事件的监听使用了 Rxjs 。了解更多可以前往 官方文档

拖拽事件暴露的类型如下所示:

interface INodeDragEvent {
  data: IRenderNode;
  type: 'dragstart' | 'dragging' | 'dragend';
}

在线体验

简单渲染

事件支持

Roadmap

  • 图布局和渲染
  • 添加事件支持
  • 支持主题和更多的样式配置
  • 支持插件形式,可以自定义控制渲染内容实现
  • 待定...

Good Idea

如果你有好的想法欢迎提 Issues

与我联系

0.0.20

1 year ago

0.0.21

1 year ago

0.0.22

1 year ago

0.0.23

1 year ago

0.0.24

1 year ago

0.0.10

1 year ago

0.0.11

1 year ago

0.0.12

1 year ago

0.0.13

1 year ago

0.0.14

1 year ago

0.0.15

1 year ago

0.0.16

1 year ago

0.0.17

1 year ago

0.0.18

1 year ago

0.0.19

1 year ago

0.0.9

2 years ago

0.0.8

2 years ago

0.0.7

2 years ago

0.0.6

2 years ago

0.0.5

2 years ago

0.0.4

2 years ago

0.0.3

2 years ago

0.0.2

2 years ago

0.0.1

2 years ago