Перейти к основному содержимому

Справочник событий

Все колбэки событий являются необязательными пропсами. Колбэки «Before» могут вернуть false для отмены операции.

Примечание

React-обёртка использует имена пропсов в формате onCamelCase (например, onAfterAction), тогда как JS API Spreadsheet использует имена событий в формате camelCase на event bus (например, afterAction). Смотрите Справочник событий JS API для императивного API.

События действий​

Срабатывают при любом действии пользователя, например при редактировании ячеек, форматировании или структурных изменениях.

ПропсОтменяемоеОписание
onBeforeActionДаСрабатывает перед выполнением любого действия пользователя. Вернуть false для отмены. Обработчик: BeforeActionHandler. JS API: beforeAction.
onAfterActionНетСрабатывает после завершения любого действия пользователя. Обработчик: AfterActionHandler. JS API: afterAction.

Пример: Блокировка удаления строк

import { Actions } from "@dhtmlx/trial-react-spreadsheet";

<ReactSpreadsheet
sheets={sheets}
onBeforeAction={(action, config) => {
if (action === Actions.deleteRow) return false;
}}
/>

Пример: Запись всех действий пользователя

<ReactSpreadsheet
sheets={sheets}
onAfterAction={(action, config) => {
console.log("Action:", action, "Cell:", config.cell);
}}
/>

События выделения​

Срабатывают при изменении выделения или фокуса ячейки.

ПропсОтменяемоеОписание
onBeforeSelectionSetДаСрабатывает перед добавлением ячейки в выделение. Обработчик: BeforeCellHandler. JS API: beforeSelectionSet.
onAfterSelectionSetНетСрабатывает после добавления ячейки в выделение. Обработчик: AfterCellHandler. JS API: afterSelectionSet.
onBeforeSelectionRemoveДаСрабатывает перед удалением ячейки из выделения. Обработчик: BeforeCellHandler.
onAfterSelectionRemoveНетСрабатывает после удаления ячейки из выделения. Обработчик: AfterCellHandler.
onBeforeFocusSetДаСрабатывает перед изменением активной ячейки. Обработчик: BeforeCellHandler. JS API: beforeFocusSet.
onAfterFocusSetНетСрабатывает после изменения активной ячейки. Обработчик: AfterCellHandler. JS API: afterFocusSet.

Пример: Отслеживание выбранной ячейки

const [selectedCell, setSelectedCell] = useState<string>("");

<ReactSpreadsheet
sheets={sheets}
onAfterFocusSet={(cell) => setSelectedCell(cell)}
/>

<p>Current cell: {selectedCell}</p>

События редактирования​

Срабатывают при начале или завершении редактирования ячейки.

ПропсОтменяемоеОписание
onBeforeEditStartДаСрабатывает перед началом редактирования ячейки. Обработчик: BeforeEditHandler. JS API: beforeEditStart.
onAfterEditStartНетСрабатывает после начала редактирования ячейки. Обработчик: AfterEditHandler. JS API: afterEditStart.
onBeforeEditEndДаСрабатывает перед завершением редактирования ячейки. Вернуть false для отмены и продолжения редактирования. Обработчик: BeforeEditHandler. JS API: beforeEditEnd.
onAfterEditEndНетСрабатывает после завершения редактирования ячейки и сохранения значения. Обработчик: AfterEditHandler. JS API: afterEditEnd.

Пример: Валидация перед сохранением

<ReactSpreadsheet
sheets={sheets}
onBeforeEditEnd={(cell, value) => {
if (cell.startsWith("B") && isNaN(Number(value))) {
return false; // Отмена: столбец B должен содержать числа
}
}}
/>

События листов​

Срабатывают при смене активной вкладки листа.

ПропсОтменяемоеОписание
onBeforeSheetChangeДаСрабатывает перед сменой активного листа. Обработчик: BeforeSheetHandler. JS API: beforeSheetChange.
onAfterSheetChangeНетСрабатывает после смены активного листа. Обработчик: AfterSheetHandler. JS API: afterSheetChange.

Пример: Отслеживание активного листа

<ReactSpreadsheet
sheets={sheets}
onAfterSheetChange={(sheet) => {
console.log("Switched to sheet:", sheet.name);
}}
/>

События данных​

Срабатывают при загрузке данных таблицы.

ПропсОписание
onAfterDataLoadedСрабатывает после завершения загрузки данных (через sheets или loadUrl). JS API: afterDataLoaded.

Пример: Отображение состояния загрузки

const [loading, setLoading] = useState(true);

<ReactSpreadsheet
loadUrl="/api/data"
onAfterDataLoaded={() => setLoading(false)}
/>

События ввода​

Срабатывают при вводе пользователя в ячейках или строке формул.

ПропсОписание
onGroupFillСрабатывает при операциях автозаполнения (перетаскивание). Обработчик: (focusedCell: string, selectedCell: string) => void. JS API: groupFill.
onEditLineInputСрабатывает при вводе в строку формул/редактирования. Обработчик: (value: string) => void.
onCellInputСрабатывает при вводе в ячейку во время редактирования. Обработчик: (cell: string, value: string) => void.

Колбэки производных состояний​

Эти колбэки уведомляют об изменениях вычисленных состояний, а не о прямых действиях пользователя.

ПропсОписание
onStateChangeУведомляет об изменении доступности отмены/повтора. Обработчик: (state: { canUndo: boolean; canRedo: boolean }) => void.
onSearchResultsУведомляет со ссылками на совпадающие ячейки, когда активен пропс search. Обработчик: (cells: string[]) => void.
onFilterChangeУведомляет при изменении пользователем фильтров через интерфейс. Обработчик: (filter: SheetFilter) => void.

Пример: Кнопки отмены/повтора

import { useRef, useState } from "react";
import { ReactSpreadsheet, type SpreadsheetRef } from "@dhtmlx/trial-react-spreadsheet";

function App() {
const ref = useRef<SpreadsheetRef>(null);
const [history, setHistory] = useState({ canUndo: false, canRedo: false });

return (
<>
<button
disabled={!history.canUndo}
onClick={() => ref.current?.instance?.undo()}
>
Undo
</button>
<button
disabled={!history.canRedo}
onClick={() => ref.current?.instance?.redo()}
>
Redo
</button>
<ReactSpreadsheet
ref={ref}
sheets={sheets}
onStateChange={setHistory}
/>
</>
);
}

Пример: Управляемый поиск с результатами

const [search, setSearch] = useState<SearchConfig | undefined>();
const [results, setResults] = useState<string[]>([]);

<input
placeholder="Search..."
onChange={(e) =/> setSearch({ query: e.target.value, open: true })}
/>
<p>{results.length} cells found</p>

<ReactSpreadsheet
sheets={sheets}
search={search}
onSearchResults={setResults}
/>

Пример: Синхронизация состояния фильтра

const [activeFilter, setActiveFilter] = useState<SheetFilter | null>(null);

<ReactSpreadsheet
sheets={sheets}
onFilterChange={(filter) => setActiveFilter(filter)}
/>