首页龙虾技能列表 › React Flow Code Review

React Flow Code Review

v1.1.0

Reviews React Flow code for anti-patterns, performance issues, and best practices. Use when reviewing code that uses @xyflow/react, checking for common mista...

0· 89·1 当前·1 累计
by @anderskev (Kevin Anderson)·MIT-0
下载技能包
License
MIT-0
最后更新
2026/3/27
安全扫描
VirusTotal
无害
查看报告
OpenClaw
安全
high confidence
The skill is an instruction-only code-review checklist for React Flow usage; its requested footprint (no installs, no env vars, no files to execute) matches its stated purpose.
评估建议
This skill is an instruction-only checklist for reviewing React Flow code and appears internally consistent and low-risk. Before installing, note: (1) it provides manual review advice, not automated linting or code changes — you still should run your own linters/tests; (2) it references the package name '@xyflow/react' and specific APIs (Position, useReactFlow, updateNodeData) — confirm these match the library/version you use; (3) because it’s just documentation, it does not require credentials ...
详细分析 ▾
用途与能力
Name and description match the SKILL.md content: it provides manual review guidance for @xyflow/react-based code. There are no unrelated requirements (no credentials, no binaries) that would be inconsistent with a code-review helper.
指令范围
SKILL.md contains static guidance, examples, and a checklist for reviewing React Flow code. It does not instruct the agent to read system files, access environment variables, call external endpoints, or perform actions outside the scope of reviewing code snippets. It is descriptive rather than prescriptive (no commands or automated code execution).
安装机制
No install spec is present. This is lowest-risk: nothing is downloaded or written to disk as part of installation.
凭证需求
The skill requests no environment variables, credentials, or config paths — appropriate for a documentation/instruction-only code review helper.
持久化与权限
always is false and there are no indications the skill requests persistent presence or modifies other skills/config. Autonomous invocation is allowed by platform default but the skill does not request elevated privileges.
安全有层次,运行前请审查代码。

License

MIT-0

可自由使用、修改和再分发,无需署名。

运行时依赖

无特殊依赖

版本

latestv1.1.02026/3/27

- Added comprehensive best practices guide for reviewing React Flow code, focusing on anti-patterns, performance, and common mistakes. - Lists critical anti-patterns such as improper memoization, callback usage, and misuse of providers. - Includes checklists for node/edge rendering, state updates, and viewport handling. - Addresses common integration errors like missing container height, required CSS, and proper event handling. - Highlights TypeScript tips for improved type safety with custom nodes and components. - Provides review questions to ensure code quality and consistency.

● 无害

安装命令 点击复制

官方npx clawhub@latest install react-flow-code-review
镜像加速npx clawhub@latest install react-flow-code-review --registry https://cn.clawhub-mirror.com

技能文档

Critical Anti-Patterns

1. Defining nodeTypes/edgeTypes Inside Components

Problem: Causes all nodes to re-mount on every render.

// BAD - recreates object every render
function Flow() {
  const nodeTypes = { custom: CustomNode };  // WRONG
  return ;
}

// GOOD - defined outside component const nodeTypes = { custom: CustomNode }; function Flow() { return ; }

// GOOD - useMemo if dynamic function Flow() { const nodeTypes = useMemo(() => ({ custom: CustomNode }), []); return ; }

2. Missing memo() on Custom Nodes/Edges

Problem: Custom components re-render on every parent update.

// BAD - no memoization
function CustomNode({ data }: NodeProps) {
  return 
{data.label}
; }

// GOOD - wrapped in memo import { memo } from 'react'; const CustomNode = memo(function CustomNode({ data }: NodeProps) { return

{data.label}
; });

3. Inline Callbacks Without useCallback

Problem: Creates new function references, breaking memoization.

// BAD - inline callback
 setNodes(applyNodeChanges(changes, nodes))}
/>

// GOOD - memoized callback const onNodesChange = useCallback( (changes) => setNodes((nds) => applyNodeChanges(changes, nds)), [] );

4. Using useReactFlow Outside Provider

// BAD - will throw error
function App() {
  const { getNodes } = useReactFlow();  // ERROR: No provider
  return ;
}

// GOOD - wrap in provider function FlowContent() { const { getNodes } = useReactFlow(); // Works return ; }

function App() { return ( ); }

5. Storing Complex Objects in Node Data

Problem: Reference equality checks fail, causing unnecessary updates.

// BAD - new object reference every time
setNodes(nodes.map(n => ({
  ...n,
  data: { ...n.data, config: { nested: 'value' } }  // New object each time
})));

// GOOD - use updateNodeData for targeted updates const { updateNodeData } = useReactFlow(); updateNodeData(nodeId, { config: { nested: 'value' } });

Performance Checklist

Node Rendering

  • [ ] Custom nodes wrapped in memo()
  • [ ] nodeTypes defined outside component or memoized
  • [ ] Heavy computations inside nodes use useMemo
  • [ ] Event handlers use useCallback

Edge Rendering

  • [ ] Custom edges wrapped in memo()
  • [ ] edgeTypes defined outside component or memoized
  • [ ] Edge path calculations are not duplicated

State Updates

  • [ ] Using functional form of setState: setNodes((nds) => ...)
  • [ ] Not spreading entire state for single property updates
  • [ ] Using updateNodeData for data-only changes
  • [ ] Batch updates when adding multiple nodes/edges

Viewport

  • [ ] Not calling fitView() on every render
  • [ ] Using fitViewOptions for initial fit only
  • [ ] Animation durations are reasonable (< 500ms)

Common Mistakes

Missing Container Height

// BAD - no height, flow won't render

// GOOD - explicit dimensions

Missing CSS Import

// Required for default styles
import '@xyflow/react/dist/style.css';

Forgetting nodrag on Interactive Elements

// BAD - clicking button drags node

// GOOD - prevents drag

Not Using Position Constants

// BAD - string literals

// GOOD - type-safe constants import { Position } from '@xyflow/react';

Mutating Nodes/Edges Directly

// BAD - direct mutation
nodes[0].position = { x: 100, y: 100 };
setNodes(nodes);

// GOOD - immutable update setNodes(nodes.map(n => n.id === '1' ? { ...n, position: { x: 100, y: 100 } } : n ));

TypeScript Issues

Missing Generic Types

// BAD - loses type safety
const [nodes, setNodes] = useNodesState(initialNodes);

// GOOD - explicit types type MyNode = Node<{ value: number }, 'custom'>; const [nodes, setNodes] = useNodesState(initialNodes);

Wrong Props Type

// BAD - using wrong type
function CustomNode(props: any) { ... }

// GOOD - correct props type function CustomNode(props: NodeProps) { ... }

Review Questions

  • Are all custom components memoized?
  • Are nodeTypes/edgeTypes defined outside render?
  • Are callbacks wrapped in useCallback?
  • Is the container sized properly?
  • Are styles imported?
  • Is useReactFlow used inside a provider?
  • Are interactive elements marked with nodrag?
  • Are types used consistently throughout?
数据来源:ClawHub ↗ · 中文优化:龙虾技能库
OpenClaw 技能定制 / 插件定制 / 私有工作流定制

免费技能或插件可能存在安全风险,如需更匹配、更安全的方案,建议联系付费定制

了解定制服务