Skip to content
ФреймворкJavaScript

React-компонент BlokEditor

Компонент-редактор «всё в одном», который поставляют адаптеры фреймворков: <BlokEditor> в @bloklabs/react и @bloklabs/vue, <blok-editor> (BlokEditorComponent) в @bloklabs/angular. Он принимает любую опцию конфигурации редактора как проп, пробрасывает неизвестные пропы на контейнерный div и даёт доступ к живому экземпляру Blok через ref/onReady. Пропы ниже описывают специфичную для адаптеров поверхность; остальное совпадает с опциями раздела «Конфигурация».

Обновлено 17 июл. 2026 г.Редактировать на GitHub
TypeScript
import { useState } from 'react';
import { BlokEditor } from '@bloklabs/react';
import { Header, Paragraph, List } from '@bloklabs/core/tools';
import type { OutputData } from '@bloklabs/core';

export function Editor() {
  const [data, setData] = useState<OutputData>();

  // data + onSave form a controlled component: onSave fires (debounced)
  // with the serialized document; echoing it back is deduped and
  // caret-stable, while genuine external data changes re-render in place.
  return (
    <BlokEditor
      tools={{ paragraph: Paragraph, header: Header, list: List }}
      data={data}
      onSave={setData}
      theme="auto"
      className="my-editor"
    />
  );
}

Компонент BlokEditor

СвойствоОписание
toolsRecord<string, ToolConstructable | ToolSettings>Регистрируемые блок-инструменты. Функции внутри конфигурации инструмента (например, колбэк загрузчика) автоматически перепривязываются к последнему рендеру — свободно передавайте инлайновые замыкания; запись в deps нужна только при смене классов инструментов.
dataOutputDataСодержимое редактора (реактивное). Задаёт начальный документ; после монтирования новое содержимое перерисовывается на месте. Обновления дедуплицируются глубоким сравнением, поэтому возврат собственного вывода редактора никогда не сбивает каретку.
onSave(data: OutputData, api: API) => voidВыходная половина контролируемого компонента: срабатывает (с дебаунсом) с полным сериализованным документом при каждом изменении — не нужно вручную опрашивать save(). Связка onSave={setData} безопасна и не зацикливается.
onChange(api: API, event: CustomEvent) => voidНизкоуровневые события мутаций (блок добавлен/изменён/перемещён/удалён) — когда нужна погранулярность мутаций, а не сериализованный вывод.
onReady(editor: Blok) => voidВызывается один раз с живым экземпляром Blok. Срабатывает после фиксации пробрасываемого ref, поэтому ref.current к этому моменту уже заполнен.
depsDependencyListЗначения, при смене идентичности которых редактор уничтожается и создаётся заново (для структурной конфигурации вроде классов инструментов). Держите каждое значение референциально стабильным. Функции внутри конфигурации инструментов сюда НЕ входят — они перепривязываются к последнему рендеру автоматически.
readOnlyboolean | ReadOnlyModeConfigРежим «только чтение». Реактивный: после монтирования переключается на месте, без перемонтирования.
theme'light' | 'dark' | 'auto'Цветовая тема (реактивная). Не оборачивайте компонент в styled() или HOC, резервирующий проп theme — он не дойдёт до редактора.
onThemeChange(resolvedTheme: 'light' | 'dark') => voidВызывается с разрешённой темой при каждом её изменении (например, когда 'auto' следует за ОС).
width'narrow' | 'full'Режим ширины содержимого (реактивный). После монтирования синхронизируется через editor.width.set().
styleBlokConfig['style']The all-in-one editor component shipped by the framework adapters — <BlokEditor> in @bloklabs/react and @bloklabs/vue, <blok-editor> (BlokEditorComponent) in @bloklabs/angular. It accepts every editor config option as a prop, forwards unknown props to the container div, and exposes the live Blok instance via ref/onReady. The props below cover the adapter-specific surface; everything else matches the Configuration options.
i18nBlokConfig['i18n']The all-in-one editor component shipped by the framework adapters — <BlokEditor> in @bloklabs/react and @bloklabs/vue, <blok-editor> (BlokEditorComponent) in @bloklabs/angular. It accepts every editor config option as a prop, forwards unknown props to the container div, and exposes the live Blok instance via ref/onReady. The props below cover the adapter-specific surface; everything else matches the Configuration options.
autofocusbooleanСфокусировать редактор после монтирования.
placeholderstring | falseПлейсхолдер в первом пустом блоке.
onBlocksRendered(payload: BlocksRenderedPayload) => voidВызывается после завершения пакетного рендера (событие ядра blocks:rendered) — декларативный аналог editor.on('blocks:rendered', …).
onBlockRendered(payload: BlockRenderedPayload) => voidВызывается для каждого блока, отрендеренного в DOM (событие ядра block:rendered).
refRef<Blok | null>Пробрасывается к живому экземпляру Blok для императивных вызовов (save, render, blocks, caret, …). Равен null до монтирования редактора.
className, id, …HTMLAttributes<HTMLDivElement>Любой проп, не являющийся опцией конфигурации редактора, пробрасывается на контейнерный div. Стилизуйте редактор через className (style сохраняет своё значение из конфигурации).