复合交互及其自定义 Behavior
Behavior 指 F6 中的复合交互,一般 Behavior 包含一个或多个事件的监听与处理以及一系列对图中元素的操作。
Behavior 默认包含 shouldBegin,shouldUpdate,shouldEnd 三个回调,代表是否开始行为,是否更新元素,是否进行结束行为,当返回值为 false 时阻止默认行为。
所有内置 Behavior 及其参数参见 内置的 Behavior 教程。当 内置 Behavior 不能满足需求时,使用 registerBehavior(behaviorName, behavior) 方法注册自定义的交互行为。详见 Behavior API。本文将介绍如何自定义 Behavior。
F6.registerBehavior(behaviorName: string, behavior: BehaviorOption)
// Custom a type of Behavior
F6.registerBehavior('behaviorName', {
  // Bind the event and its callback
  getEvents() {
    return {
      'node:tap': 'onTap',
      mousemove: 'onMousemove',
      'edge:tap': 'onEdgeTap',
    };
  },
  /**
   * Handle the callback for node:tap
   * @override
   * @param  {Object} evt The handler
   */
  onTap(evt) {
    const node = evt.item;
    const graph = this.graph;
    const point = { x: evt.x, y: evt.y };
    const model = node.getModel();
    // TODO
  },
  /**
   * Handle the callback for mousemove
   * @override
   * @param  {Object} evt The handler
   */
  onMousemove(evt) {
    // TODO
  },
  /**
   * Handle the callback for :tap
   * @override
   * @param  {Object} evt The handler
   */
  onEdgeTap(evt) {
    // TODO
  },
});参数
| 名称 | 类型 | 是否必选 | 描述 | 
|---|---|---|---|
| behaviorName | String | true | 自定义 Behavior 的名称。 | 
| behavior | BehaviorOption | true | 自定义 behavior 时的配置项,配置项中包括的方法及作用具体请参考:Behavior API。 | 
BehaviorOption.getEvents()
自定义 Behavior 时,定义事件及处理事件的方法。
getEvents() 方法中可以使用的事件请参考Event 文档。
用法
F6.registerBehavior('behaviorName', {
  getEvents() {
    return {
      'node:tap': 'onNodeTap',
      'edge:tap': 'onEdgeTap',
      'mousemove': 'onMouseMove'
    }
  }
}BehaviorOption.onNodeTap(evt)
onNodeTap、onEdgeTap 和 onMouseMove 都属于自定义方法,用于处理 node:tap、edge:tap、mousemove 事件。
参数
| 名称 | 类型 | 是否必选 | 描述 | 
|---|---|---|---|
| evt | Event | 否 | 包含事件句柄、当前操作对象及各坐标值等 | 
参数 evt 包括以下属性:
| 名称 | 类型 | 描述 | 
|---|---|---|
| x | Number | 元素视口 x 坐标 | 
| y | Number | 元素视口 y 坐标 | 
| canvasX | Number | 元素 Canvas x 坐标 | 
| canvasY | Number | 元素 Canvas y 坐标 | 
| clientX | Number | 屏幕/页面 x 坐标 | 
| clientY | Number | 屏幕/页面 y 坐标 | 
| event | MouseEvent | 事件句柄 | 
| target | Shape | 当前对象 | 
| type | String | 操作类型 | 
| currentTarget | Object | |
| item | Shape | 操作的目标元素 | 
| removed | Boolean | 是否删除/销毁 | 
| timeStamp | Number | 时间戳 | 
| bubbles | Boolean | 是否支持事件冒泡 | 
| defaultPrevented | Boolean | 是否阻止默认事件 | 
| cancelable | Boolean | 是否取消 | 
用法
F6.registerBehavior('behaviorName', {
  getEvents() {
    return {
      'node:tap': 'onNodeTap',
      'edge:tap': 'onEdgeTap',
      mousemove: 'onMouseMove',
    };
  },
  onNodeTap(evt) {
    // TODO
  },
  onEdgeTap(evt) {
    // TODO
  },
  onMouseMove(evt) {
    // TODO
  },
});BehaviorOption.getDefaultCfg()
定义自定义 Behavior 时的默认参数,会与用户传入的参数进行合并。
提示:该方法是可选的。
用法
F6.registerBehavior('behaviorName', {
  getDefaultCfg() {
    return {
      trigger: 'click' // mouseneter or click
    }
  }
}BehaviorOption.shouldBegin(evt)
是否阻止行为发生,默认返回 true,不阻止行为,需要在处理逻辑中自行调用。
用法
F6.registerBehavior('behaviorName', {
  shouldBegin() {
    // 这里可以根据业务自定义
    return true
  }
}BehaviorOption.shouldUpdate(evt)
是否更新数据及更改视图,默认返回 true,允许更新,如果返回 false,则不更新数据和视图。
用法
const graph = new F6.Graph({
  ...
  width: 500,
  height: 500,
  modes: {
    default: [
      'drag-canvas',
      {
        type: 'self-behavior',
        shouldUpdate: (e) => {
          if (e.target.type !== 'text') {
            return false;
          }
          return true;
        },
      },
    ],
  },
});BehaviorOption.shouldEnd(evt)
是否结束行为,默认返回 true。