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

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

Все колбэки событий являются необязательными пропсами. Колбэки «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)}
/>