Source on GitHub (opens in a new tab)

In some cases, you might need to access the store directly. This hook returns the store object which can be used on demand to access the state or dispatch actions.

This hook should only be used if there is no other way to access the internal state. For many of the common use cases, there are dedicated hooks available such as useReactFlow, useViewport, etc.

import { useState, useCallback } from 'react';
import ReactFlow, { useStoreApi } from 'reactflow';
const NodesLengthDisplay = () => {
  const [nodesLength, setNodesLength] = useState(0);
  const store = useStoreApi();
  const onClick = useCallback(() => {
    const { nodeInternals } = store.getState();
    const length = Array.from(nodeInternals.values()).length || 0;
  }, [store]);
  return (
      <p>The current number of nodes is: {nodesLength}</p>
      <button onClick={onClick}>Update node length.</button>
function Flow() {
  return (
    <ReactFlow nodes={nodes}>
      <NodesLengthLogger />

This example computes the number of nodes in the flow on-demand. This is in contrast to the example in the useStore hook that re-renders the component whenever the number of nodes changes.

Choosing whether to calculate values on-demand or to subscribe to changes as they happen is a bit of a balancing act. On the one hand, putting too many heavy calculations in an event handler can make your app feel sluggish or unresponsive. On the other hand, computing values eagerly can lead to slow or unnecessary re-renders.

We make both this hook and useStore available so that you can choose the approach that works best for your use-case.