Skip to main content
Version: 4.3

useGraph()

function useGraph<Element, Link>(): GraphApi<Element, Link>;

Access the graph together with its imperative cell-mutation API for adding, updating, removing, and serializing cells. Call this inside a GraphProvider.

Type Parameters​

Type ParameterDefault typeDescription
Element extends ElementJSONInitElementJSONInitelement record shape (use ElementRecord<MyData> for input, Computed<ElementRecord<MyData>> for read shapes)
Link extends LinkJSONInitLinkJSONInitlink record shape (use LinkRecord<MyData> / Computed<LinkRecord<MyData>>)

Returns​

The GraphApi: the dia.Graph instance plus setCell, setCellData, removeCell, resetCells, exportToJSON, and the other cell actions.

exportToJSON​

readonly exportToJSON: (options?) => JSON;

Serialize the graph to a plain JSON object.

By default the output is minimal: attributes that match each cell's defaults are dropped and empty {} placeholders are pruned everywhere except inside attrs at the third nesting level (e.g. attrs.text.textWrap: {} is a meaningful reset marker in JointJS shapes and must survive). Pass { includeDefaults: true } to keep every attribute on every cell, no pruning is applied in that mode.

Parameters​

ParameterType
options?ExportToJSONOptions

Returns​

JSON


graph​

readonly graph: Graph;

The JointJS graph instance.


importFromJSON​

readonly importFromJSON: (json) => void;

Replace the graph contents from a previously exported JSON object (e.g. produced by exportToJSON). Triggers JointJS's reset event so all React subscriptions resync automatically.

Parameters​

ParameterType
jsonJSON

Returns​

void


isElement​

readonly isElement: (input) => input is Element;

Predicate / type guard: true when the input resolves to an element cell. Consults the graph's type registry so any dia.Element subclass (including custom shapes) is recognised, not just the default ElementModel.

Parameters​

ParameterType
inputElement | Link

Returns​

input is Element


readonly isLink: (input) => input is Link;

Predicate / type guard: true when the input resolves to a link cell. Consults the graph's type registry so any dia.Link subclass (including custom shapes) is recognised, not just the default LinkModel.

Parameters​

ParameterType
inputElement | Link

Returns​

input is Link


removeCell​

readonly removeCell: (cellRef?, metadata?) => void;

Remove a cell by id or dia.Cell reference. A nullish reference warns in dev and no-ops; a reference that resolves to no cell is a silent no-op. The optional metadata is forwarded as the graph.removeCells event opt.

Parameters​

ParameterType
cellRef?CellRef | null
metadata?Record<string, unknown>

Returns​

void


removeCells​

readonly removeCells: (cellRefs?, metadata?) => void;

Remove multiple cells by id or dia.Cell reference. A nullish array warns in dev and no-ops; references that resolve to no cell are silently skipped. The optional metadata is forwarded as the graph.removeCells event opt.

Parameters​

ParameterType
cellRefs?readonly CellRef[] | null
metadata?Record<string, unknown>

Returns​

void


resetCells​

readonly resetCells: (input, metadata?) => void;

Atomically replace the cell set. Accepts dia.Cell instances alongside records. The optional metadata is forwarded as the graph.resetCells opt.

Parameters​

ParameterType
inputArrayUpdate<Element | Link, CellInput<Element, Link>>
metadata?Record<string, unknown>

Returns​

void


setCell​

readonly setCell: SetCell<Element, Link>;

Add or update a cell. Two forms:

  • setCell(record), record.id names the target. Existing cell: attributes merge over it. Missing cell: the cell is added.
  • setCell(id, (prev) => next), updater form. The updater is invoked once with the real previous record. A nullish id, or an id with no matching cell, warns in dev and no-ops (use the direct form to add).

setCellData​

readonly setCellData: SetCellData<HandleCellData<Element, Link>>;

Set a single cell's data field. Two forms, both keyed by cell id:

  • setCellData(id, data), replaces the cell's data with data.
  • setCellData(id, (prev) => next), updater form; prev is the current data, the return value replaces it (merge inside the updater for a partial update). A nullish id, or an id with no matching cell, warns in dev and no-ops.

The data type is derived from the useGraph<Element, Link> generics: typed records flow through, otherwise it falls back to Record<string, unknown>. A cell id can't be narrowed to element-vs-link at the type level, so when both are typed the updater sees their union. Narrow inside it, or fix the data shape via useGraph<ElementRecord<MyData>>().


transaction​

readonly transaction: Transaction;

Run a callback as one atomic transaction: every edit inside collapses into a single undo entry and (for sync callbacks) a single re-render. Pass { rollbackOnError: true } to restore the graph on error (off by default — partial edits stay; enabling it snapshots the full cells array up-front, so leave off for large graphs when the callback is trusted). See Transaction.


updateCells​

readonly updateCells: (updater, metadata?) => void;

Apply an updater to the current cells array. Updater may return dia.Cell instances. The optional metadata is forwarded as the sync event opt.

Parameters​

ParameterType
updater(previous) => readonly CellInput<Element, Link>[]
metadata?Record<string, unknown>

Returns​

void

Example​

import { GraphProvider, Paper, useGraph } from '@joint/react';

function Toolbar() {
const { setCell, exportToJSON } = useGraph();
return (
<button
onClick={() =>
setCell({
id: 'node-1',
type: 'standard.Rectangle',
position: { x: 40, y: 40 },
size: { width: 120, height: 60 },
})
}
>
Add node
</button>
);
}

function App() {
return (
<GraphProvider>
<Paper />
<Toolbar />
</GraphProvider>
);
}