Skip to main content


const allCommands = useCommands();



Return value

An object containing all the commands available in the editor.


This hooks exposes all the commands from your chosen extensions (and those built in by default).

For instance the command selectText is provided by a built-in extension and always available. However toggleBold would require the BoldExtension to be present.

Commands allow you to modify editor state.


By convention, when using this hook, you deconstruct the commands needed for your use case.

const { toggleHeading } = useCommands();

Each command can be called as a function, passing the arguments as required.

const handleToggleHeading = useCallback(() => {
toggleHeading({ level: 1 });
}, [toggleHeading]);

However, be aware that a command might not make sense in the current selection context. For instance, you cannot add a link within a code block.

Remirror provides the <commandName>.enabled() property on each command, so you can disable or hide parts of your UI where the command is not available.


It is good practice to pass the same arguments to .enabled(), as you do the command itself, to ensure accurate results.

<button onClick={handleToggleHeading} disabled={!toggleHeading.enabled({ level: 1 })}>
Toggle heading

Multiple commands

If you are using an uncontrolled editor, you can use multiple commands from useCommands one after the other without concern.

const { toggleBold, toggleItalic } = useCommands();

const handleToggleBoldItalic = useCallback(() => {
// N.B. This only works in uncontrolled editors
}, [toggleBold, toggleItalic]);

When using a controlled editor, multiple commands must be performed via chained commands instead (via the useChainedCommands hook).

See potential pitfalls in the controlled editor documentation for a in-depth description of the problem.

Custom Dispatch (Advanced)

useCommands exposes a command customDispatch that allows you to dispatch ProseMirror transactions directly to the editor.

This allows you to write ad-hoc command functions that enable the bare-metal power of ProseMirror.

const insertCustomText = (text = 'Powered by Remirror!') => {
return ({ tr, dispatch }) => {
if (!isTextSelection(tr.selection)) {
return false;


return true;

const Button = () => {
const { customDispatch } = useCommands();

const handleClick = useCallback(() => {
}, [customDispatch]);

return <button onClick={handleClick}>Click me!</button>;

Consider whether your custom commands might be better suited as proper commands surfaced by a custom extension.