fix(line): lines not re-rendering after hover (#181)

This commit is contained in:
Louis Young 2025-04-27 16:55:59 +08:00 committed by GitHub
parent 311180b2c8
commit 4a6e7a736f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 24 additions and 22 deletions

View File

@ -21,8 +21,8 @@ import { useVisible } from './use-visible';
import { IconPlusCircle } from './button'; import { IconPlusCircle } from './button';
export const LineAddButton = (props: LineRenderProps) => { export const LineAddButton = (props: LineRenderProps) => {
const { line, selected, color } = props; const { line, selected, hovered, color } = props;
const visible = useVisible({ line, selected, color }); const visible = useVisible({ line, selected, hovered });
const nodePanelService = useService<WorkflowNodePanelService>(WorkflowNodePanelService); const nodePanelService = useService<WorkflowNodePanelService>(WorkflowNodePanelService);
const document = useService(WorkflowDocument); const document = useService(WorkflowDocument);
const dragService = useService(WorkflowDragService); const dragService = useService(WorkflowDragService);

View File

@ -1,14 +1,14 @@
import { LineColors, usePlayground, WorkflowLineEntity } from '@flowgram.ai/free-layout-editor'; import { usePlayground, WorkflowLineEntity } from '@flowgram.ai/free-layout-editor';
import './index.less'; import './index.less';
export const useVisible = (params: { export const useVisible = (params: {
line: WorkflowLineEntity; line: WorkflowLineEntity;
selected?: boolean; selected?: boolean;
color?: string; hovered?: boolean;
}): boolean => { }): boolean => {
const playground = usePlayground(); const playground = usePlayground();
const { line, selected = false, color } = params; const { line, selected = false, hovered } = params;
if (line.disposed) { if (line.disposed) {
// 在 dispose 后,再去获取 line.to | line.from 会导致错误创建端口 // 在 dispose 后,再去获取 line.to | line.from 会导致错误创建端口
return false; return false;
@ -16,19 +16,7 @@ export const useVisible = (params: {
if (playground.config.readonly) { if (playground.config.readonly) {
return false; return false;
} }
if (!selected && color !== LineColors.HOVER) { if (!selected && !hovered) {
return false;
}
if (
line.fromPort.portID === 'loop-output-to-function' &&
line.toPort?.portID === 'loop-function-input'
) {
return false;
}
if (
line.fromPort.portID === 'batch-output-to-function' &&
line.toPort?.portID === 'batch-function-input'
) {
return false; return false;
} }
return true; return true;

View File

@ -118,17 +118,16 @@ export class WorkflowLinesLayer extends Layer<LinesLayerOptions> {
} }
private lineProps(line: WorkflowLineEntity): LineRenderProps { private lineProps(line: WorkflowLineEntity): LineRenderProps {
const renderData = line.getData(WorkflowLineRenderData);
const { renderVersion } = renderData;
const { lineType } = this.workflowDocument.linesManager; const { lineType } = this.workflowDocument.linesManager;
const selected = this.selectService.isSelected(line.id); const selected = this.selectService.isSelected(line.id);
const { version: lineVersion, color } = line; const hovered = this.hoverService.isHovered(line.id);
const version = this.lineVersion(line);
const version = `${this._version}:${lineVersion}:${renderVersion}:${color}:${selected}`;
return { return {
key: line.id, key: line.id,
color: line.color, color: line.color,
selected, selected,
hovered,
line, line,
lineType, lineType,
version, version,
@ -136,6 +135,20 @@ export class WorkflowLinesLayer extends Layer<LinesLayerOptions> {
}; };
} }
private lineVersion(line: WorkflowLineEntity): string {
const renderData = line.getData(WorkflowLineRenderData);
const { renderVersion } = renderData;
const selected = this.selectService.isSelected(line.id);
const hovered = this.hoverService.isHovered(line.id);
const { version: lineVersion, color } = line;
const version = `v:${this._version},lv:${lineVersion},rv:${renderVersion},c:${color},s:${
selected ? 'T' : 'F'
},h:${hovered ? 'T' : 'F'}`;
return version;
}
private lineComponent(props: LineRenderProps): ReactNode { private lineComponent(props: LineRenderProps): ReactNode {
const RenderInsideLine = this.options.renderInsideLine ?? (() => <></>); const RenderInsideLine = this.options.renderInsideLine ?? (() => <></>);
return ( return (

View File

@ -10,6 +10,7 @@ export interface LineRenderProps {
key: string; key: string;
color?: string; // 高亮颜色,优先级最高 color?: string; // 高亮颜色,优先级最高
selected?: boolean; selected?: boolean;
hovered?: boolean;
line: WorkflowLineEntity; line: WorkflowLineEntity;
lineType: LineRenderType; lineType: LineRenderType;
version: string; // 用于控制 memo 刷新 version: string; // 用于控制 memo 刷新