精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

React-flow 工作流案例詳解

開發 前端
一般用過figma或者設計類軟件的小伙伴可能比較熟悉畫布控件和縮略圖的概念。它們可以幫助我們更高效的瀏覽圖表和進行更便捷的圖表操作。當然 react-flow 也提供了開箱即用的插件來實現。

上期和大家分享了我最近做的 React-Flow 中文文檔。到今天為止, 核心部分已經完全翻譯完成。大家可以直接使用中文文檔快速學習和使用 React-Flow 搭建自己的工作流。

圖片圖片

github: https://github.com/MrXujiang/react-flow

文檔地址: http://react-flow.com

接下來我會基于我寫的中文文檔, 帶大家做一個非常有意思的工作流案例, 方便大家快速上手 React-Flow。

案例展示

圖片圖片

這個案例主要包含幾個技術點:

  • 如何自定義節點
  • 如何自定義邊
  • 如何設置畫布縮略圖和畫布控件
  • 如何實現嵌套節點
  • 如何設置畫布樣式
  • 如何拖拽框選多個節點

掌握了以上幾點, 我們可以實現各種場景的流程圖或者工作流。上圖的案例我已經推送到 Github, 大家也可以下載代碼參考學習。

自定義節點

因為官方提供的節點樣式比較有限,所以我們需要自定義節點和節點樣式. 上述我做的案例中有三個自定義節點:

  • 按鈕節點
  • 圖片節點
  • 圖文標簽節點(頂部根節點)

如下圖所示:

圖片圖片

具體的自定義節點的方式我在中文文檔中也有詳細介紹和 demo, 這里給大家分享一下實現方式:

function LogoNode({ data, isConnectable }) {
    const { src, text } = data;
    return (
      <div className="flow-logo">
        <Handle
            type="source"
            position={Position.Bottom}
            id="a"
            // style={handleStyle}
            isConnectable={isConnectable}
        />
        <Handle
            type="source"
            position={Position.Bottom}
            id="b"
            isConnectable={isConnectable}
        />
        <div>
          <img src={src} />
          <div className="flow-logo-text">{ text }</div>
        </div>
      </div>
    );
  }

做好之后我們只需要在 app 入口注冊節點即可:

const nodeTypes = useMemo(() => ({ textUpdater: TextUpdaterNode }), []);
 
return <ReactFlow nodeTypes={nodeTypes} />;

是不是非常簡單? 大家可以按照React-Flow 中文文檔來學習更加復雜的自定義節點功能。

自定義邊

自定義邊和自定義節點的方式類似, 我們先來看一下自定義邊的案例:

圖片圖片

大家在網上看到的花里胡哨的思維導圖, 流程圖的連接線, 我們其實都可以用自定義邊來實現:

import {
  BaseEdge,
  EdgeLabelRenderer,
  getStraightPath,
  useReactFlow,
} from '@xyflow/react';
 
export default function CustomEdge({ id, sourceX, sourceY, targetX, targetY }) {
  const { setEdges } = useReactFlow();
  const [edgePath] = getStraightPath({
    sourceX,
    sourceY,
    targetX,
    targetY,
  });
 
  return (
    <>
      <BaseEdge id={id} path={edgePath} />
      <EdgeLabelRenderer>
        <button
          onClick={() => setEdges((edges) => edges.filter((e) => e.id !== id))}
        >
          刪除
        </button>
      </EdgeLabelRenderer>
    </>
  );
}

設置畫布縮略圖和畫布控件

一般用過figma或者設計類軟件的小伙伴可能比較熟悉畫布控件和縮略圖的概念。

它們可以幫助我們更高效的瀏覽圖表和進行更便捷的圖表操作。當然 react-flow 也提供了開箱即用的插件來實現。

圖片圖片

話不多說, 接下來我們就來看看具體的實現:

import { ReactFlow, MiniMap } from '@xyflow/react';

const defaultNodes = [
  {
    id: '1',
    type: 'input',
    data: { label: 'Dooring用戶' },
    position: { x: 250, y: 25 },
    style: { backgroundColor: '#6ede87', color: 'white' },
  },

  {
    id: '2',
    // you can also pass a React component as a label
    data: { label: <div>Dooring零代碼平臺</div> },
    position: { x: 100, y: 125 },
    style: { backgroundColor: '#ff0072', color: 'white' },
  },
  {
    id: '3',
    type: 'output',
    data: { label: '發布頁面' },
    position: { x: 250, y: 250 },
    style: { backgroundColor: '#6865A5', color: 'white' },
  },
];
const defaultEdges = [
  { id: 'e1-2', source: '1', target: '2' },
  { id: 'e2-3', source: '2', target: '3', animated: true },
];

const nodeColor = (node) => {
  switch (node.type) {
    case 'input':
      return '#6ede87';
    case 'output':
      return '#6865A5';
    default:
      return '#ff0072';
  }
};

function Flow() {
  return (
    <div style={{ width: '100%', height: '60vh' }}>
    <ReactFlow defaultNodes={defaultNodes} defaultEdges={defaultEdges} fitView>
      <MiniMap nodeColor={nodeColor} nodeStrokeWidth={3} zoomable pannable />
    </ReactFlow>
    </div>
    
  );
}

export default Flow;

通過上述代碼我們就能實現一個非常簡單的自定義縮略圖的功能, 如下圖所示:

圖片圖片

如何實現嵌套節點

要想實現起嵌套節點的效果, 我們只需要調整節點結構, 即可輕松實現如下效果:

圖片圖片

如果要將一個節點添加為另一個節點的子節點,則需要使用 parentId(在以前的版本中稱為parentNode)選項(您可以在節點選項部分找到所有選項的列表)。一旦我們這樣做了,子節點就會相對于其父節點定位。 { x: 0, y: 0 } 的位置是父級的左上角。

代碼案例如下:

import { useCallback, useState } from 'react';
import {
  ReactFlow,
  addEdge,
  applyEdgeChanges,
  applyNodeChanges,
  Background,
} from '@xyflow/react';

const initialNodes = [
  {
    id: 'A',
    type: 'group',
    data: { label: null },
    position: { x: 0, y: 0 },
    style: {
      width: 170,
      height: 140,
    },
  },
  {
    id: 'B',
    type: 'input',
    data: { label: 'Dooring Node' },
    position: { x: 10, y: 10 },
    parentId: 'A',
    extent: 'parent',
  },
  {
    id: 'C',
    data: { label: 'React Flow' },
    position: { x: 10, y: 90 },
    parentId: 'A',
    extent: 'parent',
  },
];

const initialEdges = [
  { id: 'b-c', source: 'B', target: 'C' }
];

const rfStyle = {
  backgroundColor: '#D0C0F7',
};

function Flow() {
  const [nodes, setNodes] = useState(initialNodes);
  const [edges, setEdges] = useState(initialEdges);

  const onNodesChange = useCallback(
    (changes) => setNodes((nds) => applyNodeChanges(changes, nds)),
    [setNodes],
  );
  const onEdgesChange = useCallback(
    (changes) => setEdges((eds) => applyEdgeChanges(changes, eds)),
    [setEdges],
  );
  const onConnect = useCallback(
    (connection) => setEdges((eds) => addEdge(connection, eds)),
    [setEdges],
  );

  return (
    <div style={{width: '100%', height: '30vh'}}>
      <ReactFlow
        nodes={nodes}
        edges={edges}
        onNodesChange={onNodesChange}
        onEdgesChange={onEdgesChange}
        onConnect={onConnect}
        fitView
        style={rfStyle}
        attributionPosition="top-right"
      >
        <Background />
      </ReactFlow>
    </div>
  );
}

export default Flow;

如何拖拽框選多個節點

如果我們更喜歡 Figma/sketch/design 工具控件,可以設置panOnScroll={true}和selectinotallow={true}:

  • 平移:空格+拖動鼠標、滾動、鼠標中鍵或右鍵
  • 縮放:俯仰或 cmd + 滾動
  • 創建選區:拖動鼠標

這樣就能實現類似多選框選的效果了:

圖片圖片

代碼如下:

import { useCallback } from 'react';
import {
  ReactFlow,
  addEdge,
  useEdgesState,
  useNodesState,
  SelectionMode,
} from '@xyflow/react';

const initialNodes = [
  {
    id: '1',
    data: { label: 'Dooring' },
    position: { x: 150, y: 0 },
  },
  {
    id: '2',
    data: { label: 'Nest-Admin' },
    position: { x: 0, y: 150 },
  },
  {
    id: '3',
    data: { label: 'Next-Admin' },
    position: { x: 300, y: 150 },
  },
];

const initialEdges = [
  { id: 'e1-2', source: '1', target: '2' },
  { id: 'e1-3', source: '1', target: '3' },
];

function Flow() {
  const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
  const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);

  const onConnect = useCallback(
    (connection) => setEdges((eds) => addEdge(connection, eds)),
    [setEdges],
  );

  const panOnDrag = [1, 2];

  return (
    <div style={{width: '100%', height: '30vh'}}>
      <ReactFlow
        nodes={nodes}
        edges={edges}
        onNodesChange={onNodesChange}
        onEdgesChange={onEdgesChange}
        onConnect={onConnect}
        panOnScroll
        selectionOnDrag
        panOnDrag={panOnDrag}
        selectionMode={SelectionMode.Partial}
        fitView
      />
    </div>
    
  );
}

export default Flow;

文章最開頭的案例的源碼我已經上傳 Github 了, 大家感興趣可以學習參考一下。完整案例效果圖:

圖片圖片


責任編輯:武曉燕 來源: 趣談前端
相關推薦

2021-02-20 06:11:07

Git-Flow工作流分支

2009-03-03 09:13:36

工作流BPM業務流程

2009-11-18 09:14:49

Visual Stud

2022-10-26 08:00:43

Activiti工作流BPM

2009-04-15 11:00:31

Workflow工作流角色

2021-03-12 06:44:09

Argo Workfl開源項目

2021-10-14 11:34:05

技術工作流引擎

2013-04-23 10:28:08

IBeamMDAAWF

2024-04-25 08:00:00

DevOps架構軟件開發

2010-01-04 17:42:50

SilverLight

2012-07-23 10:36:46

工作流

2023-01-04 08:02:16

工作流架構設計

2010-07-28 17:19:28

ICMP協議

2023-07-05 09:48:44

Activiti部署

2011-12-14 09:58:58

JavajBPM

2025-05-20 04:00:00

Bad CasesDifyRAG

2015-07-14 09:26:28

微型工作流引擎設計

2015-06-24 10:18:26

2013-09-29 17:13:59

PowerShell工作流

2024-07-31 08:01:48

點贊
收藏

51CTO技術棧公眾號

欧美精品亚洲精品日韩精品| 日批视频在线看| 国产三区四区在线观看| 久久99热这里只有精品| 欧美黄色三级网站| 亚洲v国产v欧美v久久久久久| 欧美视频精品| 黄色成人av在线| 一区二区不卡在线| 婷婷色在线观看| 日本不卡视频在线| 97视频在线观看网址| 强制高潮抽搐sm调教高h| 都市激情亚洲| 欧美精品久久99久久在免费线 | 久久久久国产精品| 亚洲精品福利在线| 国产三级精品三级在线| 国产中文在线播放| 亚洲精品中文在线观看| 欧美亚洲丝袜| 黄色aaa大片| 极品少妇一区二区| 国产精品久久久久久久久久东京| 久久久久久久国产精品毛片| 波多野结衣的一区二区三区 | 熟妇无码乱子成人精品| 99re久久| 日韩欧美国产黄色| 国产自产在线视频| 亚洲无线看天堂av| 中文字幕av不卡| 欧美不卡三区| 日韩有码第一页| 国产91精品入口| 成人午夜黄色影院| 91精品人妻一区二区三区果冻| 亚洲综合99| 午夜精品久久久久久久99热浪潮| 欧美一区二区三区爽爽爽| 日韩在线二区| 亚洲偷欧美偷国内偷| 特大黑人巨人吊xxxx| 久久亚洲道色| 亚洲国产私拍精品国模在线观看| 樱花草www在线| 日本午夜精品久久久久| 欧美影院一区二区三区| 婷婷六月天在线| 69堂免费精品视频在线播放| 色综合久久久久久久久| 成人观看免费完整观看| 少妇一区视频| 欧美在线一区二区| 日本激情综合网| 日韩毛片免费看| 欧美日韩色一区| 五月天婷婷亚洲| 国产一区2区在线观看| 欧美喷潮久久久xxxxx| 天天干天天爽天天射| 97久久网站| 欧美精品久久99久久在免费线| 激情久久综合网| 99综合久久| 日韩一区二区麻豆国产| 亚洲av午夜精品一区二区三区| 永久免费精品视频| 亚洲国产精品女人久久久| 三叶草欧洲码在线| 国产videos久久| 日韩中文字幕国产精品| 天天操天天操天天操天天操天天操| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 九一国产精品视频| 伊人久久在线| 欧美日韩国产免费一区二区| 先锋资源在线视频| 国产精品毛片视频| 亚洲丝袜av一区| 四虎精品免费视频| 伊人久久成人| 国产精品久久久久久久久久小说| 亚洲一区二区影视| 国产999精品久久久久久绿帽| 久久久99爱| 四虎久久免费| 亚洲成a人片在线观看中文| 成人黄色片视频| 国产999精品在线观看| 亚洲成人久久一区| 91资源在线播放| 欧美激情偷拍| 国产精品露脸自拍| 亚洲AV午夜精品| 久久婷婷国产综合精品青草| 亚洲制服中文| 爱啪视频在线观看视频免费| 精品国产老师黑色丝袜高跟鞋| 亚洲免费看av| 免费萌白酱国产一区二区三区| 中文字幕国产日韩| 久久久夜色精品| 蜜臀av性久久久久蜜臀aⅴ| 国产精品12| 免费在线看黄网站| 色婷婷久久久久swag精品| 自拍一级黄色片| 久久99精品国产自在现线| www.xxxx欧美| 狠狠狠狠狠狠狠| 菠萝蜜视频在线观看一区| 亚洲国产婷婷香蕉久久久久久| 日本r级电影在线观看| 亚洲人成网亚洲欧洲无码| 麻豆乱码国产一区二区三区| 国产又粗又猛又黄视频| 91在线视频免费观看| 免费国产成人看片在线| 日韩精品99| 亚洲国产美女精品久久久久∴| 美国一级片在线观看| 久久av在线| 国产伦理一区二区三区| 成年视频在线观看| 欧美久久婷婷综合色| www.久久国产| 99精品国产99久久久久久福利| 亚洲一区精品电影| 日本在线观看网站| 在线精品视频一区二区| 粉嫩av蜜桃av蜜臀av| 国产精品亚洲综合色区韩国| 国产成人成网站在线播放青青| 精品麻豆一区二区三区| 欧美人与z0zoxxxx视频| 成人18视频免费69| 久久精品久久99精品久久| 欧美精品免费观看二区| 亚洲国产福利| 日韩精品视频免费| 欧美一区二区激情视频| eeuss鲁片一区二区三区在线观看| 欧洲精品视频在线| 美女精品视频在线| 九九热视频这里只有精品| aaa一区二区三区| 亚洲色图丝袜美腿| 成人免费播放视频| 亚洲二区在线| 久久riav二区三区| 小h片在线观看| 亚洲人成电影网站色…| 波多野结衣啪啪| 欧美国产一区在线| 亚洲一区二区福利视频| 婷婷六月综合| 成人午夜电影免费在线观看| 欧美草逼视频| 亚洲成人三级在线| 精品国产一区二区三区四| 久久久久亚洲蜜桃| 久久这里只精品| 亚洲色图88| 国产成人精品福利一区二区三区 | 一级黄色在线播放| 一区二区三区四区在线观看国产日韩| 7777精品伊久久久大香线蕉语言| 国精产品一区一区三区mba下载| 精品久久久久久综合日本欧美| 日本免费一二三区| 国产亚洲精品资源在线26u| 一区二区xxx| 欧美在线亚洲| 久久av一区二区三区漫画| 国产经典一区| 欧美大片大片在线播放| 亚洲 欧美 激情 小说 另类| 欧美性色aⅴ视频一区日韩精品| 国产精品视频看看| 99久久精品国产麻豆演员表| aaa毛片在线观看| 91精品国产视频| 精品国产免费一区二区三区| 黄色精品视频网站| 久久免费国产视频| 自拍视频在线| 亚洲国产精品yw在线观看| 波多野结衣网站| 伊人婷婷欧美激情| 中文幕无线码中文字蜜桃| 久久99久久99| 激情综合在线观看| 中文不卡在线| 欧美极品视频一区二区三区| 日本免费一区二区视频| 日本中文字幕成人| 人人超在线公开视频| 在线精品播放av| 香蕉视频黄色片| 日韩一区二区三| 中文字幕一区二区三区波野结| 亚洲妇熟xx妇色黄| 性欧美疯狂猛交69hd| 久久先锋资源网| 亚洲色图欧美另类| 极品美女销魂一区二区三区免费| av免费播放网址| 伊人激情综合| 黄黄视频在线观看| 日产精品一区二区| 欧美xxxx黑人又粗又长密月| 97久久综合区小说区图片区 | 亚洲精品无码久久久久| 午夜婷婷国产麻豆精品| 四虎免费在线视频| 中文字幕一区二区三区不卡| www.自拍偷拍| av一区二区三区四区| 成人一区二区三区仙踪林| 免费在线观看视频一区| 国产二区视频在线播放| 国内精品久久久久久久97牛牛| 人人妻人人澡人人爽精品欧美一区| 亚洲区小说区图片区qvod按摩| 国产精品一区二区欧美| 精品中文视频| 亚洲xxxx18| 国产一精品一av一免费爽爽| 国产欧美精品日韩精品| 欧美电影在线观看网站| 国产精国产精品| 亚洲www啪成人一区二区| 国产91精品久久久久| 9lporm自拍视频区在线| 久久久久在线观看| 牛牛精品在线| 久久久免费高清电视剧观看| 美洲精品一卡2卡三卡4卡四卡| 欧美人与性动交| 欧美v亚洲v| 萌白酱国产一区二区| 国产黄色小视频在线| 日韩在线视频一区| 大片免费在线观看| 九九热这里只有精品6| 天天干在线视频论坛| 欧美激情女人20p| 91破解版在线观看| 国产91精品久久久| 电影在线观看一区二区| 国产精品综合不卡av| 国产精品18| 粉嫩高清一区二区三区精品视频| 操欧美女人视频| 久久综合九色欧美狠狠| 国产精品免费99久久久| 免费国产一区二区| 欧洲杯什么时候开赛| 伊人久久大香线蕉av一区| 亚洲综合五月| 免费看国产一级片| 国产精品一区毛片| 午夜免费高清视频| 韩国一区二区视频| 亚洲av永久无码精品| 久久久久久久网| 国产老头老太做爰视频| 亚洲成人一区在线| 亚洲午夜无码久久久久| 在线不卡一区二区| 可以免费观看的毛片| 亚洲三级免费看| 国产在线高潮| 性欧美视频videos6一9| 日韩毛片一区| 亚洲一区二区三| 亚洲欧洲色图| 亚洲天堂第一区| 亚洲一区日韩在线| 中文字幕 欧美日韩| 成人av电影免费观看| 99久久精品免费视频 | 日韩精品成人一区| 欧美午夜精品一区二区三区| 国产a级免费视频| 亚洲精品久久久久中文字幕二区| 成人亚洲性情网站www在线观看| 日韩在线视频导航| 超碰在线公开| 成人美女免费网站视频| 天堂av一区二区三区在线播放| 中国人体摄影一区二区三区| 99国产一区| 国产老头和老头xxxx×| 国产日韩精品一区| 国产小视频在线观看免费| 欧美亚洲国产怡红院影院| 亚洲国产欧美另类| 中文字幕亚洲综合| 国产美女精品写真福利视频| 91精品中国老女人| 九九久久精品| 国产中文字幕乱人伦在线观看| 美国三级日本三级久久99| 老司机午夜免费福利| 亚洲欧美欧美一区二区三区| 波多野结衣电车| 日韩电影中文字幕在线| 国精产品一区一区三区mba下载| 国产精品揄拍500视频| 天海翼亚洲一区二区三区| 欧美国产综合在线| 蜜臀a∨国产成人精品| 亚洲午夜久久久久久久久红桃 | 久久色视频免费观看| 久久婷婷国产麻豆91| 欧美一区二区免费视频| 夜级特黄日本大片_在线| 日韩美女主播视频| 精品福利一区| 成人一级生活片| 国产精品中文有码| 天海翼在线视频| 欧美日韩一区二区三区在线看 | 日韩不卡一二三| 国产欧美日韩在线看| 欧美日韩综合在线观看| 亚洲第一中文字幕| 女人黄色免费在线观看| 91传媒视频免费| 欧美成人一区二免费视频软件| 日本在线一二三区| 中文字幕一区二区三区av| 日批视频免费观看| 亚洲性日韩精品一区二区| 亚洲精品一区| 欧美日韩精品久久| 免费视频一区| 婷婷色一区二区三区| 色综合天天综合狠狠| 欧美日韩国产综合视频| 日本亚洲欧美三级| 日韩电影一区| 91插插插影院| 亚洲综合网站在线观看| 日本高清视频在线| 97国产精品免费视频| 日韩精品导航| 色综合天天色综合| 国产精品久久久久aaaa樱花| 一级片在线观看视频| 久久精品国产69国产精品亚洲| 亚洲青青久久| 2022中文字幕| 播五月开心婷婷综合| 一级片中文字幕| 国产一区二区三区中文 | 国产v亚洲v天堂无码| 99国产精品99久久久久久粉嫩| 亚洲精品视频大全| 欧美少妇一区二区| 国产激情在线视频| 国产精品欧美久久| 老牛影视一区二区三区| 超碰人人人人人人人| 日韩一区二区三区在线观看| 成人影音在线| 欧美一区二区三区四区五区六区| 麻豆精品久久久| 久久久久久久久久99| 精品小视频在线| 欧洲精品久久久久毛片完整版| 男人添女人下部视频免费| 97精品超碰一区二区三区| 国产精品51麻豆cm传媒| 欧美大胆a视频| 嫩草一区二区三区| 久久精品无码一区二区三区毛片| 精品动漫一区二区| 欧美96在线| 蜜桃视频日韩| 狠狠色综合播放一区二区| 韩国av免费观看| 上原亚衣av一区二区三区| 91夜夜蜜桃臀一区二区三区| 久久午夜夜伦鲁鲁一区二区| 一级日本不卡的影视| 成年人视频免费在线观看| 99久久久精品免费观看国产| 日韩精品一卡二卡三卡四卡无卡| 三级全黄做爰视频| 亚洲性日韩精品一区二区| 国产精品videossex| 亚洲国产成人va在线观看麻豆| 亚洲午夜久久久久久久久电影院| 欧美另类自拍| 国产女主播一区二区三区| 老司机精品视频导航| 免费观看一区二区三区毛片|