langflow 流程作为工具组件 Flink 并撤退

fcwjkofz  于 5个月前  发布在  Flink
关注(0)|答案(2)|浏览(97)

当使用Flow作为工具组件时,点击并选择另一个进程,将出现一个弹出窗口。

jpfvwuh4

jpfvwuh41#

要解决在Flow中作为工具组件点击并选择另一个进程导致弹出窗口出现,以及组件 Flink 和撤退的问题,您需要确保状态转换得到正确处理。 Flink 和撤退的行为可能是由于isOpenisTransitioning状态的计时和状态管理引起的。
以下是解决了这些问题的SelectionMenu组件的修订版本:

import { useEffect, useState } from "react";
import { NodeToolbar } from "reactflow";
import { GradientGroup } from "../../../../icons/GradientSparkles";
import useFlowStore from "../../../../stores/flowStore";
import { validateSelection } from "../../../../utils/reactflowUtils";

export default function SelectionMenu({
  onClick,
  nodes,
  isVisible,
  lastSelection,
}) {
  const edges = useFlowStore((state) => state.edges);
  const [disable, setDisable] = useState<boolean>(
    lastSelection && edges.length > 0
      ? validateSelection(lastSelection!, edges).length > 0
      : false
  );
  const [isOpen, setIsOpen] = useState(false);
  const [isTransitioning, setIsTransitioning] = useState(false);
  const [lastNodes, setLastNodes] = useState(nodes);

  useEffect(() => {
    if (isOpen) {
      setDisable(validateSelection(lastSelection!, edges).length > 0);
    } else {
      setDisable(false);
    }
  }, [isOpen, lastSelection, edges]);

  useEffect(() => {
    setLastNodes(nodes);
  }, [nodes]);

  useEffect(() => {
    if (isVisible) {
      setIsOpen(true);
      setTimeout(() => {
        setIsTransitioning(true);
      }, 50);
    } else {
      setIsTransitioning(false);
      setTimeout(() => {
        setIsOpen(false);
      }, 500);
    }
  }, [isVisible]);

  return (
    <NodeToolbar
      isVisible={isOpen}
      offset={5}
      nodeId={
        lastNodes && lastNodes.length > 0 ? lastNodes.map((n) => n.id) : []
      }
    >
      <div className="h-10 w-28 overflow-hidden">
        <div
          className={
            "duration-400 h-10 w-24 rounded-md border border-indigo-300 bg-background px-2.5 text-primary shadow-inner transition-all ease-in-out" +
            (isTransitioning ? " opacity-100" : " opacity-0")
          }
        >
          <button
            className={`${
disable
? "flex h-full w-full cursor-not-allowed items-center justify-between text-sm text-muted-foreground"
: "flex h-full w-full items-center justify-between text-sm"
}`}
            onClick={onClick}
            disabled={disable}
          >
            <GradientGroup
              strokeWidth={1.5}
              size={22}
              className="text-primary"
              disabled={disable}
            />
            Group
          </button>
        </div>
      </div>
    </NodeToolbar>
  );
}

关键更改:

  1. 确保在依赖于isOpenlastSelectionedgesuseEffect中正确调用setDisable
  2. setLastNodes更新为直接依赖于nodes,确保在nodes更改时正确更新。
  3. 保持isOpenisTransitioning的状态转换,以确保平滑的可见性更改。
    此外,您还可以参考NodeToolbarComponent中的FlowPage,以获取更高级的状态管理和各种节点交互的处理,这可能会进一步提供关于管理状态转换和避免 Flink 问题的信息。
  • 要继续与Dosu交谈,请提及@dosu。*
rkue9o1l

rkue9o1l2#

@alex-ge123
你能提供更多细节和截图吗?

相关问题