主题
React Flow 是为了深度定制而构建的。许多用户完全改变了 React Flow 的外观和感觉,以匹配他们自己的品牌或设计系统。本指南将向您介绍自定义 React Flow 外观的不同方法。
默认样式
React Flow 的默认样式足以开始使用内置节点。它们为样式提供了一些合理的默认值,例如填充、边框半径和动画边。您可以在下面查看它们的样子。
您通常会通过在 App.jsx 文件或其他入口点中导入它们来加载这些默认样式。
import '@xyflow/react/dist/style.css';在不深入 自定义节点 和 边 的情况下,您可以通过三种方式设置 React Flow 的基本外观。
- 通过 style属性传递内联样式
- 使用自定义 CSS 覆盖内置类
- 覆盖 React Flow 使用的 CSS 变量
内置暗黑模式和浅色模式
您可以通过使用 colorMode 属性('dark'、'light' 或 'system')来选择内置颜色模式之一,如 暗黑模式示例 中所示。
import ReactFlow from '@xyflow/react';
 
export default function Flow() {
  return <ReactFlow colorMode="dark" nodes={[...]} edges={[...]} />
}当您使用 colorMode 属性时,React Flow 会向根元素 (.react-flow) 添加一个类,您可以使用该类根据颜色模式设置流程的样式。
.dark .react-flow__node {
  background: #777;
  color: white;
}
 
.light .react-flow__node {
  background: white;
  color: #111;
}使用 style 属性进行自定义
开始自定义流程的外观和感觉的最简单方法是使用 React Flow 中许多组件上的 style 属性来内联自己的 CSS。
import ReactFlow from '@xyflow/react'
 
const styles = {
  background: 'red',
  width: '100%',
  height: 300,
};
 
export default function Flow() {
  return <ReactFlow style={styles} nodes={[...]} edges={[...]} />
}CSS 变量
如果您不想完全替换默认样式,而只是想调整整体外观和感觉,您可以覆盖我们在整个库中使用的 CSS 变量。
这些变量大多不言自明。以下是您可能想要调整的所有变量及其默认值,供您参考。
| 变量名称 | 默认 | 
|---|---|
| --xy-edge-stroke-default | #b1b1b7 | 
| --xy-edge-stroke-width-default | 1 | 
| --xy-edge-stroke-selected-default | #555 | 
| --xy-connectionline-stroke-default | #b1b1b7 | 
| --xy-connectionline-stroke-width-default | 1 | 
| --xy-attribution-background-color-default | rgba(255, 255, 255, 0.5) | 
| --xy-minimap-background-color-default | #fff | 
| --xy-background-pattern-dot-color-default | #91919a | 
| --xy-background-pattern-line-color-default | #eee | 
| --xy-background-pattern-cross-color-default | #e2e2e2 | 
| --xy-node-color-default | inherit | 
| --xy-node-border-default | 1px solid #1a192b | 
| --xy-node-background-color-default | #fff | 
| --xy-node-group-background-color-default | rgba(240, 240, 240, 0.25) | 
| --xy-node-boxshadow-hover-default | 0 1px 4px 1px rgba(0, 0, 0, 0.08) | 
| --xy-node-boxshadow-selected-default | 0 0 0 0.5px #1a192b | 
| --xy-handle-background-color-default | #1a192b | 
| --xy-handle-border-color-default | #fff | 
| --xy-selection-background-color-default | rgba(0, 89, 220, 0.08) | 
| --xy-selection-border-default | 1px dotted rgba(0, 89, 220, 0.8) | 
| --xy-controls-button-background-color-default | #fefefe | 
| --xy-controls-button-background-color-hover-default | #f4f4f4 | 
| --xy-controls-button-color-default | inherit | 
| --xy-controls-button-color-hover-default | inherit | 
| --xy-controls-button-border-color-default | #eee | 
| --xy-controls-box-shadow-default | 0 0 2px 1px rgba(0, 0, 0, 0.08) | 
这些变量用于定义 React Flow 中各种元素的默认值。这意味着它们仍然可以被内联样式或自定义类按元素覆盖。如果您想覆盖这些变量,您可以通过添加
.react-flow {
  --xy-node-background-color-default: #ff5050;
}请注意,这些变量是在 .react-flow 和 :root 下定义的。
覆盖内置类
有些人认为过度使用内联样式是一种反模式。在这种情况下,您可以使用自己的 CSS 覆盖 React Flow 使用的内置类。React Flow 中有许多类附加到各种元素,但您可能想要覆盖的类列在下面。
| 类名 | 描述 | 
|---|---|
| .react-flow | 最外层的容器 | 
| .react-flow__renderer | 内部容器 | 
| .react-flow__zoompane | 缩放和平移窗格 | 
| .react-flow__selectionpane | 选择窗格 | 
| .react-flow__selection | 用户选择 | 
| .react-flow__edges | 包含流程中所有边的元素 | 
| .react-flow__edge | 应用于流程中的每个 Edge | 
| .react-flow__edge.selected | 当 Edge被选中时,会添加到Edge中。 | 
| .react-flow__edge.animated | 当 Edge的animated属性为true时,会添加到Edge中。 | 
| .react-flow__edge.updating | 当 Edge通过onReconnect更新时,会添加到Edge中。 | 
| .react-flow__edge-path | SVG 的 <path />元素,属于Edge。 | 
| .react-flow__edge-text | SVG 的 <text />元素,属于Edge标签。 | 
| .react-flow__edge-textbg | SVG 的 <text />元素,位于Edge标签的后面。 | 
| .react-flow__connection | 应用于当前连接线。 | 
| .react-flow__connection-path | 连接线的 SVG <path />。 | 
| .react-flow__nodes | 包含流程中所有节点的元素。 | 
| .react-flow__node | 应用于流程中的每个 Node。 | 
| .react-flow__node.selected | 当 Node被选中时添加。 | 
| .react-flow__node-default | 当 Node类型为"default"时添加。 | 
| .react-flow__node-input | 当 Node类型为"input"时添加。 | 
| .react-flow__node-output | 当 Node类型为"output"时添加。 | 
| .react-flow__nodesselection | 节点选择。 | 
| .react-flow__nodesselection-rect | 节点选择矩形。 | 
| .react-flow__handle | 应用于每个 <Handle />组件。 | 
| .react-flow__handle-top | 当句柄的 Position设置为"top"时应用。 | 
| .react-flow__handle-right | 当句柄的 Position设置为"right"时应用。 | 
| .react-flow__handle-bottom | 当句柄的 Position设置为"bottom"时应用。 | 
| .react-flow__handle-left | 当句柄的 Position设置为"left"时应用。 | 
| .connectingfrom | 当连接线位于句柄之上时,添加到句柄。 | 
| .connectingto | 当连接线位于句柄之上时,添加到句柄。 | 
| .valid | 当连接线位于句柄之上 **并且** 连接有效时,添加到句柄。 | 
| .react-flow__background | 应用于 <Background />组件。 | 
| .react-flow__minimap | 应用于 <MiniMap />组件。 | 
| .react-flow__controls | 应用于 <Controls />组件。 | 
如果您深入研究源代码以寻找其他要覆盖的类,请小心。一些类在内部使用,是库正常运行所必需的。如果您替换它们,您可能会遇到意想不到的错误或错误!
第三方解决方案
您可以选择完全不使用 React Flow 的默认样式,而是使用第三方样式解决方案。如果您想这样做,您必须确保您仍然导入了基本样式。
import '@xyflow/react/dist/base.css';这些基本样式是 React Flow 正确运行的 **必需** 条件。如果您没有导入它们,或者用自己的样式覆盖了它们,一些功能可能无法按预期工作!
样式化组件
您直接渲染的许多组件,例如 <MiniMap />,都接受 className 和 style 属性。这意味着您可以使用任何您喜欢的样式解决方案,例如 样式化组件
import { MiniMap } from '@xyflow/react';
 
const StyledMiniMap = styled(MiniMap)`
  background-color: ${(props) => props.theme.bg};
 
  .react-flow__minimap-mask {
    fill: ${(props) => props.theme.minimapMaskBg};
  }
 
  .react-flow__minimap-node {
    fill: ${(props) => props.theme.nodeBg};
    stroke: none;
  }
`;有关使用样式化组件和 React Flow 的完整示例,请查看 示例!
TailwindCSS
自定义节点和边只是 React 组件,您可以使用任何您喜欢的样式解决方案来对其进行样式设置。例如,您可能想使用 Tailwind 对您的节点进行样式设置
function CustomNode({ data }) {
  return (
    <div className="px-4 py-2 shadow-md rounded-md bg-white border-2 border-stone-400">
      <div className="flex">
        <div className="rounded-full w-12 h-12 flex justify-center items-center bg-gray-100">
          {data.emoji}
        </div>
        <div className="ml-2">
          <div className="text-lg font-bold">{data.name}</div>
          <div className="text-gray-500">{data.job}</div>
        </div>
      </div>
 
      <Handle
        type="target"
        position={Position.Top}
        className="w-16 !bg-teal-500"
      />
      <Handle
        type="source"
        position={Position.Bottom}
        className="w-16 !bg-teal-500"
      />
    </div>
  );
}如果您想覆盖默认样式,请确保在 React Flows 基本样式之后导入 Tailwinds 入口点。
import '@xyflow/react/dist/style.css';
import 'tailwind.css';有关使用 Tailwind 和 React Flow 的完整示例,请查看 示例!