「AntV」6.xflow自定义节点渲染组件

817 阅读1分钟

注意:写文章的时候,我用的xflow版本是1.x的

1. 自定义节点

x6可以使用自定义节点,用react或者vue都可以,只是xflow稍微简化了一下注册流程。

  config.setNodeRender('NODE', Node);

2.节点组件

import { IApplication, MODELS, NsGraph, useModelAsync, useXFlowApp } from '@antv/xflow';
import cs from 'classnames';
import { useMemo } from 'react';
import styles from './index.less';
const GraphNode: NsGraph.INodeRender<NsGraph.INodeConfig & { extra?: NodeExtraData }> = (props) => {
  const app: IApplication = useXFlowApp();
  const [selectedNodes] = useModelAsync<MODELS.SELECTED_NODES.IState>({
    getModel: async () => await MODELS.SELECTED_NODES.getModel(app.modelService),
    initialState: [],
  });
  const isSelected = useMemo(() => {
    return selectedNodes.some((i) => i.getData().id === props.data.id);
  }, [selectedNodes, props.data.id]);
  return (
    <div
      className={cs(styles['node-container'], {
        [styles['node-container-selected']]: isSelected,
      })}
      // 补充样式防止导出丢失样式
      style={{
        boxSizing: 'border-box',
        justifyContent: 'center',
        alignItems: 'center',
      }}
    >
      <div className={styles['name']}>{props.data.extra?.name}</div>
    </div>
  );
};
export default GraphNode;

这里要注意一下,有的class样式在导出图片的时候不会被写进去,所以简单的方法就是用style再写一遍缺失的样式,但是要注意由于写了style导致的样式优先级问题。

2.1 节点props

自定义节点会被注入一些属性

{
    position: 位置
    size: 大小
    data:存储的数据
}

还有一些属性是类型没有定义的,可以打印出来看

3.其他自定义组件

自定义边组件实际上是自定义边上面的label,并不是整个边的组件。因为边只能用svg画,需要计算获得。

所以实际上能完全自定义的只有节点