跳到主要内容

Events 参考

所有事件回调均为可选 props。"Before" 回调可返回 false 以取消相应操作。

备注

React 封装器使用 onCamelCase 形式的 prop 名称(例如 onAfterAction),而 JS Spreadsheet API 在 event bus 上使用 camelCase 形式的事件名称(例如 afterAction)。命令式 API 请参见 JS API Events 参考

操作事件

在任何用户操作(如单元格编辑、格式设置或结构性更改)时触发。

Prop可取消描述
onBeforeAction在任何用户操作执行之前触发。返回 false 可取消操作。Handler:BeforeActionHandler。JS API:beforeAction
onAfterAction在任何用户操作完成之后触发。Handler: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);
}}
/>

选区事件

在单元格选区或焦点发生变化时触发。

Prop可取消描述
onBeforeSelectionSet在单元格被加入选区之前触发。Handler:BeforeCellHandler。JS API:beforeSelectionSet
onAfterSelectionSet在单元格被加入选区之后触发。Handler:AfterCellHandler。JS API:afterSelectionSet
onBeforeSelectionRemove在单元格从选区中移除之前触发。Handler:BeforeCellHandler
onAfterSelectionRemove在单元格从选区中移除之后触发。Handler:AfterCellHandler
onBeforeFocusSet在焦点单元格发生变化之前触发。Handler:BeforeCellHandler。JS API:beforeFocusSet
onAfterFocusSet在焦点单元格发生变化之后触发。Handler:AfterCellHandler。JS API:afterFocusSet

示例:跟踪当前选中单元格

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

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

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

编辑事件

在单元格编辑开始或结束时触发。

Prop可取消描述
onBeforeEditStart在单元格编辑开始之前触发。Handler:BeforeEditHandler。JS API:beforeEditStart
onAfterEditStart在单元格编辑开始之后触发。Handler:AfterEditHandler。JS API:afterEditStart
onBeforeEditEnd在单元格编辑结束之前触发。返回 false 可取消并保持编辑状态。Handler:BeforeEditHandler。JS API:beforeEditEnd
onAfterEditEnd在单元格编辑结束且值已提交之后触发。Handler:AfterEditHandler。JS API:afterEditEnd

示例:提交前校验

<ReactSpreadsheet
sheets={sheets}
onBeforeEditEnd={(cell, value) => {
if (cell.startsWith("B") && isNaN(Number(value))) {
return false; // Cancel: column B must be numeric
}
}}
/>

工作表事件

在活动工作表标签页发生切换时触发。

Prop可取消描述
onBeforeSheetChange在活动工作表切换之前触发。Handler:BeforeSheetHandler。JS API:beforeSheetChange
onAfterSheetChange在活动工作表切换之后触发。Handler:AfterSheetHandler。JS API:afterSheetChange

示例:跟踪活动工作表

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

数据事件

在电子表格数据加载完成时触发。

Prop描述
onAfterDataLoaded在数据加载完成后触发(通过 sheetsloadUrl)。JS API:afterDataLoaded

示例:显示加载状态

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

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

输入事件

在用户于单元格或公式栏中输入时触发。

Prop描述
onGroupFill在自动填充(拖拽填充)操作过程中触发。Handler:(focusedCell: string, selectedCell: string) => void。JS API:groupFill
onEditLineInput在公式栏/编辑栏中有输入时触发。Handler:(value: string) => void
onCellInput在编辑状态下单元格中有输入时触发。Handler:(cell: string, value: string) => void

派生状态回调

这些回调用于通知计算状态的变更,而非直接的用户操作。

Prop描述
onStateChange在撤销/重做可用性发生变化时通知。Handler:(state: { canUndo: boolean; canRedo: boolean }) => void
onSearchResultssearch prop 激活时,将匹配的单元格引用通知给调用方。Handler:(cells: string[]) => void
onFilterChange在用户通过 UI 更改筛选器时通知。Handler:(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)}
/>