专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

XYFlow:用 React 和 Svelte 构建基于节点强大 UI 库!

ins518 2025-06-24 14:07:51 技术文章 2 ℃ 0 评论

家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。

什么是 xyflow

React Flow | Svelte Flow - Powerful open source libraries for building node-based UIs with React (https://reactflow.dev) or Svelte (https://svelteflow.dev). Ready out-of-the-box and infinitely customizable.

xyflow 是强大的开源库,用于使用 React 或 Svelte 构建基于节点的 UI。开箱即用,可无限定制。

xyflow 存储库包含四个特定的包:

  • React Flow 12 @xyflow/react
  • React Flow 11 ReactFlow v11 分支
  • Svelte Flow @xyflow/svelte
  • svelte 共享帮助程序库 @xyflow/system

目前 xyflow 在 GIthub 通过 MIT 协议开源,有超过 22.6k 的 star、。5k 的 fork、项目依赖量 5.2k、代码贡献者 90+、妥妥的前端优质开源项目。

如何使用 xyflow

如果是在 React 中使用,可以先安装下面的包:

npm install @xyflow/react
// react 项目
npm install @xyflow/svelte
// svelte 项目

当然,开发者也可以使用下面方法快速开始一个 vite 项目:

npx degit xyflow/vite-react-flow-template app-name
// pnpm
pnpm create vite my-react-flow-app -- --template react
// yarn
yarn create vite my-react-flow-app -- --template react

ReactFlow 包导出 <ReactFlow /> 组件作为默认导出,开发者需要的就是这些以及一些节点和边!删除 App.jsx 中的所有内容并添加以下内容:

import React from 'react';
import {ReactFlow} from '@xyflow/react';

import '@xyflow/react/dist/style.css';

const initialNodes = [
  {id: '1', position: { x: 0, y: 0}, data: { label: '1' } },
  {id: '2', position: { x: 0, y: 100}, data: { label: '2' } },
];
const initialEdges = [{id: 'e1-2', source: '1', target: '2'}];

export default function App() {
  return (
    <div style={{ width: '100vw', height: '100vh'}}>
      <ReactFlow nodes={initialNodes} edges={initialEdges} />
    </div>
  );
}

这里有几点需要注意:

  • 开发者必须导入 React Flow 样式表。
  • 组件必须包裹在具有宽度和高度的元素中。

当然,开发者还可以通过特定的方法为节点添加交互性,比如下面的示例:

import React, { useCallback } from 'react';
import {
  ReactFlow,
  useNodesState,
  useEdgesState,
  addEdge,
} from '@xyflow/react';
import '@xyflow/react/dist/style.css';
const initialNodes = [
  { id: '1', position: { x: 0, y: 0 }, data: { label: '1' } },
  { id: '2', position: { x: 0, y: 100 }, data: { label: '2' } },
];
const initialEdges = [{ id: 'e1-2', source: '1', target: '2' }];
export default function App() {
  const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
  const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
  const onConnect = useCallback(
    (params) => setEdges((eds) => addEdge(params, eds)),
    [setEdges],
  );
  return (
    <div style={{ width: '100vw', height: '100vh' }}>
      <ReactFlow
        nodes={nodes}
        edges={edges}
        onNodesChange={onNodesChange}
        onEdgesChange={onEdgesChange}
        onConnect={onConnect}
      />
    </div>
  );
}

在 Svelte 中使用方式略有不同,比如下面的简单使用示例:

<script lang="ts">
import {writable} from 'svelte/store';
import {
  SvelteFlow,
  Controls,
  Background,
  BackgroundVariant,
  MiniMap,
} from '@xyflow/svelte';
// 导入方法
import '@xyflow/svelte/dist/style.css'
// 导入样式
const nodes = writable([
  {
    id: '1',
    type: 'input',
    data: {label: 'Input Node'},
    position: {x: 0, y: 0}
  },
  {
    id: '2',
    type: 'custom',
    data: {label: 'Node'},
    position: {x: 0, y: 150}
  }
]);
// 实例化节点
const edges = writable([
  {
    id: '1-2',
    type: 'default',
    source: '1',
    target: '2',
    label: 'Edge Text'
  }
]);
// 实例化边
</script>
<SvelteFlow
{nodes}
{edges}
fitView
on:nodeclick={(event) => console.log('on node click', event)}
>
<Controls />
<Background variant={BackgroundVariant.Dots} />
<MiniMap />
</SvelteFlow>

更多关于 xyflow 的用法和示例可以参考文末资料,本文不再过多展开。

参考资料

https://github.com/xyflow/xyflow

https://reactflow.dev/learn

https://www.xyflow.com/

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表