精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

91最新在线视频| www.啪啪.com| 三级无遮挡在线观看| 性高湖久久久久久久久| 亚洲精品国精品久久99热| 日韩欧美视频网站| porn视频在线观看| 国产精品18久久久久久久网站| 久久久久久久97| 波多野在线播放| 动漫一区二区三区| 精品国产电影一区| 亚洲一区尤物| 四虎免费在线观看| 久久91精品国产91久久小草| 97超碰蝌蚪网人人做人人爽| 三上悠亚在线观看视频| 欧美变态网站| 欧美丰满少妇xxxxx高潮对白| 久久久久久久久久久99| 久久精品视频观看| 久久久久久久久久久电影| 成人午夜小视频| 人妻 日韩精品 中文字幕| 91精品91| 亚洲一二三在线| 最新版天堂资源在线| 亚洲欧美一级| 欧美午夜在线观看| 亚洲 欧美 日韩 国产综合 在线 | 久久九九免费| 欧美激情视频播放| 午夜激情视频在线播放| 免费一区二区| 精品国产免费一区二区三区香蕉| 三级视频中文字幕| 另类激情视频| 欧美日韩在线视频观看| 日本中文字幕在线视频观看| 国产高清一区二区三区视频 | 日韩久久在线| 奇米影视888狠狠狠777不卡| 成人不卡免费av| 91原创国产| 91tv国产成人福利| 麻豆精品新av中文字幕| 国产97在线|亚洲| 日本三级小视频| 亚洲黄色免费| 性色av一区二区三区红粉影视| 妺妺窝人体色www聚色窝仙踪| 91精品久久久久久久蜜月| 日韩中文字幕国产精品| 欧美福利在线视频| 99国产精品一区二区| 中文字幕欧美日韩| 亚洲女人毛茸茸高潮| 操欧美老女人| 色偷偷综合社区| 久久久99999| 91成人入口| 人妻va精品va欧美va| 久久国产激情视频| 亚洲va久久久噜噜噜久久天堂| 亚洲精品在线观看www| 成人在线播放网址| 久久免费电影| 亚洲黄色录像片| 成年人视频大全| 里番在线播放| 偷拍与自拍一区| 国产成人精品无码播放| 电影在线观看一区二区| 欧美日韩久久不卡| 欧美专区第二页| xxxx日韩| 亚洲视频精品在线| 精品一区二区三孕妇视频| 欧美aaaaaaaaaaaa| 欧美黑人巨大xxx极品| 国产91av视频| 久久久久免费| 国产男人精品视频| 亚洲成人av综合| 91日韩一区二区三区| 亚洲精品一区二| 在线看女人毛片| 精品欧美激情精品一区| 美女一区二区三区视频| 国产精区一区二区| 日韩成人av网址| 成人性视频免费看| 黄色亚洲在线| 国产999精品久久久影片官网| 一区二区三区亚洲视频| 精品一区二区三区亚洲| 国产精品亚洲欧美在线播放| 中文字幕在线观看播放| 午夜电影网一区| 北条麻妃在线一区| 日韩精品成人在线观看| 亚洲女人天堂视频| 久久高清内射无套| 日日夜夜天天综合| 26uuu亚洲| 99re99热| 最新中文字幕在线播放| 91精品在线观看入口| 少妇被狂c下部羞羞漫画| 欧美日韩黑人| 午夜精品福利在线观看| 在线观看国产小视频| www.av精品| 2021狠狠干| 四虎影视4hu4虎成人| 亚洲大胆人体视频| 亚洲精品久久久久久国| 亚洲女人av| 国产高清一区视频| 免费网站成人| 欧美日韩免费看| 国产又粗又猛又爽又黄| 欧美系列电影免费观看| 欧美精品在线播放| 中文字幕a级片| 97超碰欧美中文字幕| 国产一级大片免费看| 欧美啪啪网站| 亚洲欧美日韩一区在线| 久久久久性色av无码一区二区| 秋霞电影网一区二区| 久久精品magnetxturnbtih| 羞羞污视频在线观看| 欧美精品一二三区| 日日操免费视频| 人人超碰91尤物精品国产| 久久久久成人精品免费播放动漫| 超清av在线| 精品福利视频一区二区三区| 艳妇荡乳欲伦69影片| 蜜臀av一级做a爰片久久| 日本最新一区二区三区视频观看| 国产精品一区二区日韩| 日韩欧美一级二级| 国产女片a归国片aa| 久久精品国产精品青草| 亚洲欧美日韩不卡一区二区三区| 99re66热这里只有精品4| 亚洲欧美激情四射在线日| 日韩精品1区2区| 91片在线免费观看| 国产一级片黄色| 精品大片一区二区| 国产成人精品一区二区三区| 黄色软件在线| 欧美丝袜丝交足nylons| 日本美女xxx| 麻豆精品一二三| 18视频在线观看娇喘| 国产精品xnxxcom| 九九热精品在线| 亚洲欧美另类一区| 亚洲电影一区二区三区| 色婷婷免费视频| 久久精品一区二区国产| 日韩视频在线观看国产| 久久亚洲精品人成综合网| 久久久精品久久久| 精品国产一级片| 亚洲成人动漫av| 日韩网站在线播放| 喷白浆一区二区| 在线不卡日本| 这里视频有精品| 午夜精品久久久久久久99热浪潮| 亚洲日本中文字幕在线| 91国在线观看| 爱爱视频免费在线观看| 成人午夜看片网址| 欧美精品成人网| 天天天综合网| 精品欧美国产| 六九午夜精品视频| 欧美激情极品视频| 欧洲一区av| 3d动漫精品啪啪1区2区免费| 国产一级av毛片| 国产日韩精品一区二区三区在线| 亚洲第一区第二区第三区| 亚洲精品字幕| 亚洲精品一区二区毛豆| 99久久婷婷国产综合精品青牛牛| 欧洲成人免费视频| 精品国产丝袜高跟鞋 | 中文字幕日产av| 一区二区三区不卡视频在线观看 | 99色精品视频| 亚洲欧美网站在线观看| 麻豆精品蜜桃一区二区三区| 综合欧美精品| 热re91久久精品国99热蜜臀| 国产超级va在线视频| 亚洲免费视频观看| av中文在线观看| 在线精品视频一区二区三四| 久草视频中文在线| 国产精品天干天干在观线| 成熟妇人a片免费看网站| 理论片日本一区| 精品人妻一区二区三区四区在线 | 欧美日韩在线中文| 一区二区三区四区在线观看国产日韩 | 潘金莲一级淫片aaaaaa播放| 又紧又大又爽精品一区二区| 娇妻被老王脔到高潮失禁视频| 国产91在线看| 小早川怜子一区二区三区| 巨乳诱惑日韩免费av| 青春草国产视频| 一区二区影院| 视频一区二区三区免费观看| 超碰97久久国产精品牛牛| 成人精品在线观看| 小明成人免费视频一区| 欧美在线影院在线视频| 波多一区二区| 色综合久久久888| 毛片在线不卡| 搡老女人一区二区三区视频tv| 三级在线视频| 日韩精品极品视频| 狠狠综合久久av一区二区| 欧美日韩国产123区| 亚洲永久精品一区| 91久久一区二区| 中文字幕第四页| 精品成人av一区| 91久久国产视频| 亚洲成av人片一区二区| 国产一区二区播放| 中文字幕亚洲区| jizzjizzjizz国产| 国产精品久久久久四虎| 美女福利视频网| 国产精品伦一区二区三级视频| 久久午夜福利电影| 国产女主播在线一区二区| 亚洲精品国产熟女久久久| 久久久噜噜噜久久中文字幕色伊伊 | 做爰高潮hd色即是空| 91九色精品| 一级黄色免费在线观看| 亚洲激情五月| 男人天堂网站在线| 亚洲午夜精品久久久久久app| www.国产二区| 亚洲久久在线| 国产主播在线看| 天堂成人国产精品一区| 激情综合网俺也去| 看电视剧不卡顿的网站| 日本高清一区二区视频| 国产一级精品在线| 国产精品99精品无码视亚| jlzzjlzz亚洲日本少妇| 亚洲天堂久久新| 欧美国产综合色视频| 小早川怜子一区二区的演员表| 亚洲精选视频在线| 自拍偷拍欧美亚洲| 91高清视频在线| 51精品国产人成在线观看 | 又嫩又硬又黄又爽的视频| 色一区二区三区| x99av成人免费| h视频在线免费观看| 欧美黑人极品猛少妇色xxxxx| 国产后进白嫩翘臀在线观看视频 | 51精品免费网站| 一个色在线综合| 天堂网av手机版| 欧美三级日本三级少妇99| 99国产精品一区二区三区| 精品成人佐山爱一区二区| 青青草在线播放| 日韩在线中文字幕| 国产黄色大片在线观看| 国产精品爱啪在线线免费观看| 欧美一级在线| 国产欧美日韩综合精品二区| 国产一区不卡| 国产成人一二三区| 午夜一区不卡| 一级做a爱视频| 久久综合久久综合久久| 婷婷激情四射网| 欧美日韩国内自拍| 国产精品久久久久久久久久久久久久久久| 国产欧美日韩在线看| 久久成人一区二区| 久久婷婷综合色| 99福利在线| 按摩亚洲人久久| 不卡专区在线| 成人免费在线网址| 美女毛片一区二区三区四区最新中文字幕亚洲| 亚洲欧洲另类精品久久综合| 激情文学一区| 黄色aaaaaa| 国产亚洲一区二区在线观看| 精品在线视频免费| 欧美日韩国产综合草草| 青青青草原在线| 欧美激情网友自拍| 在线免费观看亚洲| 欧美中日韩免费视频| 伊人久久大香线蕉综合热线| 天堂中文av在线| 日本一区二区三区四区在线视频| 精品在线免费观看视频| 日韩一区二区免费电影| 97在线观看免费观看高清 | zzzwww在线看片免费| 91久久精品日日躁夜夜躁国产| 国产欧美高清视频在线| 3d动漫一区二区三区| 国产aⅴ精品一区二区三区色成熟| 欧美熟妇激情一区二区三区| 亚洲人成伊人成综合图片| 乱色588欧美| 激情久久综合| 精品无码av一区二区三区不卡| 日韩一区日韩二区| 一区二区视频网| 国产一区二区黑人欧美xxxx| 国产精品av一区二区三区 | 人妻精品一区二区三区| 久久91亚洲精品中文字幕| 成人51免费| 国产精品jizz在线观看老狼| 蜜桃精品在线观看| 婷婷丁香综合网| 欧美日本国产视频| 免费在线观看av片| 91精品中文在线| 国产精品88久久久久久| 成人av毛片在线观看| 中文字幕一区二区三区色视频| 一区二区精品视频在线观看| 中文字幕亚洲欧美一区二区三区| 国产成人福利夜色影视| 亚洲欧美日韩国产yyy| 免费观看久久久4p| 日本精品久久久久中文| 欧美日韩精品一区二区天天拍小说 | 色综合亚洲精品激情狠狠| 91tv亚洲精品香蕉国产一区| 亚洲人成网站在线观看播放 | 精品久久久久久久久久ntr影视| 免费成人在线看| 欧美最近摘花xxxx摘花| 精品国产一区探花在线观看| 超碰在线播放91| 亚洲色图视频免费播放| 亚洲第一视频在线| 97在线视频免费| 欧美日韩激情在线一区二区三区| 亚洲第一中文av| 亚洲人成小说网站色在线| 免费观看黄色一级视频| 青青久久av北条麻妃黑人| 精品国产精品国产偷麻豆| 五月天婷婷影视| 图片区日韩欧美亚洲| h视频在线播放| 91久久爱成人| 午夜亚洲精品| 在线观看天堂av| 精品福利视频一区二区三区| 欧美xx视频| 日韩第一页在线观看| 成人精品国产免费网站| 天堂网免费视频| 久久人人爽人人爽爽久久| 国产一区二区在线视频你懂的| 丰满少妇被猛烈进入高清播放| 国产精品久久免费看| 蜜桃视频久久一区免费观看入口| 国产97免费视| 红桃视频国产一区| 一区二区不卡免费视频| 欧美美女bb生活片| 美女露胸视频在线观看| 天天综合中文字幕| 99精品欧美一区二区蜜桃免费| 曰批又黄又爽免费视频| 亚州av一区二区| 91精品亚洲| 亚洲国产天堂av| 欧美成人女星排名|