LogicFlow节点文本换行配置与实现方法

0 次阅读

LogicFlow节点文本换行配置与实现方法

在流程图、业务建模和可视化编辑场景中,节点文本显示效果直接影响用户体验。随着业务流程越来越复杂,节点名称往往不再是简单的几个字符,而可能包含较长的描述信息。如果文本长度超过节点宽度,默认情况下容易出现溢出、遮挡或者显示不完整的问题。

LogicFlow作为一款基于JavaScript的流程图编辑框架,提供了丰富的节点扩展能力,但节点文本换行并不是所有场景下自动生效,需要结合节点配置、文本组件以及自定义节点实现。合理配置LogicFlow节点文本换行,可以让流程图更加清晰,提高信息展示效率。

LogicFlow节点文本默认显示机制

LogicFlow中的节点文本通常由Text组件负责渲染。普通节点在创建时,可以通过text属性设置显示内容,例如:

const nodeConfig = {
  type: 'rect',
  x: 200,
  y: 200,
  text: '这是一个流程节点名称'
};

默认情况下,节点文本会根据节点尺寸进行展示。如果文本长度超过节点范围,可能出现以下情况:

  • 文本超出节点边界;

  • 文本被截断;

  • 长文本影响流程图整体布局;

  • 用户无法快速识别节点含义。

因此,在实际项目中,需要针对文本长度进行换行处理。

LogicFlow节点文本换行的常见实现方式

LogicFlow节点文本换行主要有三种方式:

  1. 手动插入换行符;

  2. 配置节点文本宽度和样式;

  3. 自定义节点Text渲染逻辑。

不同方式适用于不同业务场景。

方法一:通过换行符实现固定换行

最简单的方式是在节点文本中直接添加换行符。

示例:

const lf = new LogicFlow({
  container: document.querySelector('#container')
});

lf.render({
  nodes: [
    {
      id: 'node1',
      type: 'rect',
      x: 200,
      y: 150,
      text: '用户提交申请
系统自动审核'
    }
  ]
});

通过 可以让文本分成多行显示。

这种方式适合:

  • 节点文字内容固定;

  • 文本格式提前确定;

  • 流程节点数量较少。

但是,如果文本来自后台数据,长度无法提前预测,手动换行维护成本较高。

方法二:调整节点文本区域实现自动换行

LogicFlow节点文本支持设置文本区域尺寸,通过限制宽度,让浏览器或SVG文本根据规则进行换行。

例如:

const lf = new LogicFlow({
  container: document.querySelector('#container')
});

lf.register('custom-node', ({ RectNode, RectNodeModel }) => {
  class CustomNode extends RectNode {}

  class CustomNodeModel extends RectNodeModel {
    setAttributes() {
      this.width = 160;
      this.height = 80;
    }

    getTextStyle() {
      const style = super.getTextStyle();
      style.fontSize = 14;
      style.width = 120;
      return style;
    }
  }

  return {
    view: CustomNode,
    model: CustomNodeModel
  };
});

通过限制文本宽度,可以避免文字无限横向扩展,使节点内容更加规整。

方法三:自定义节点实现自动计算换行

在企业流程系统中,更推荐根据文本长度动态计算换行。

例如:

function formatText(text, maxLength = 8) {
  let result = '';
  let count = 0;

  for (let i = 0; i < text.length; i++) {
    result += text[i];
    count++;

    if (count >= maxLength) {
      result += '
';
      count = 0;
    }
  }

  return result;
}

const nodeText = formatText('客户信息审核流程节点');

console.log(nodeText);

输出结果:

客户信息审
核流程节
点

这种方式可以根据字符数量自动分割文本,适用于:

  • 工作流平台;

  • BPM流程设计器;

  • 低代码开发平台;

  • 数据流程管理系统。

实际项目中,还可以根据字符宽度进行计算,避免中文、英文混排导致换行不准确。

LogicFlow自定义Text组件实现换行

如果默认文本组件无法满足需求,可以扩展LogicFlow的TextView。

示例:

import { RectNode, RectNodeModel } from '@logicflow/core';

class TextNodeModel extends RectNodeModel {

  getTextStyle() {
    const style = super.getTextStyle();

    style.fontSize = 14;
    style.color = '#333';
    style.textWidth = 100;

    return style;
  }

}

class TextNode extends RectNode {

}

export default {
  type: 'text-node',
  view: TextNode,
  model: TextNodeModel
};

通过重写getTextStyle()方法,可以统一控制节点文本样式,包括:

  • 字体大小;

  • 文本颜色;

  • 文本宽度;

  • 对齐方式;

  • 行高。

这种方案更符合大型项目的组件化开发方式。

中文节点文本换行注意事项

中文和英文文本在换行时存在一定区别。

中文字符通常占据固定宽度,而英文单词可能整体作为一个单位处理。例如:

用户OrderInformation审核

如果简单按照字符数量切割,可能出现:

用户Order
Information
审核

导致显示效果不理想。

更好的方式是根据实际渲染宽度计算:

function splitText(text, maxWidth) {
  let line = '';
  let lines = [];

  for (const char of text) {
    if ((line + char).length > maxWidth) {
      lines.push(line);
      line = char;
    } else {
      line += char;
    }
  }

  if (line) {
    lines.push(line);
  }

  return lines.join('
');
}

这样可以提高不同语言环境下的兼容性。

节点尺寸需要同步调整

文本换行后,节点高度也需要同步调整,否则容易出现文字超出节点的问题。

例如:

setAttributes() {
  this.width = 180;
  this.height = 100;
}

如果文本可能出现三行以上,应动态调整高度:

const lineHeight = 20;