Skip to content

useGridFocus

@astryxdesign/core v0.7.1 · useGridFocus

参数 ​

名称类型默认值说明
optionsUseGridFocusOptions—必填。网格焦点行为的配置对象。
options.columnsnumber | MaybeRefOrGetter<number>—必填。网格列数。上下方向键按这个数跨格。
options.cellSelectorstring'button:not([disabled]), [tabindex]:not([tabindex="-1"])'选格子的选择器。要按 DOM 顺序选中所有位置,禁用和空的也算,这样行列几何才对得上。
options.isCellFocusable(cell: HTMLElement) => boolean每个选中的格子都能接焦点判断某个格子能不能接焦点。不传就当成都能接。
options.getFocusTarget(cell: HTMLElement) => HTMLElement | null格子本身从一个格子算出真正要聚焦的元素,例如 role="gridcell" 里包着的按钮。
options.onNavigateBefore(column: number, offset: number) => void—焦点要走到第一个格子之前时调用。拿到当前列序号和步长(横向是 1,纵向是列数)。
options.onNavigateAfter(column: number, offset: number) => void—焦点要走到最后一个格子之后时调用。参数同上。
options.onPageUp() => void—按 Page Up 时调用(例如日历翻到上个月)。不传就不拦这个键。
options.onPageDown() => void—按 Page Down 时调用(例如日历翻到下个月)。不传就不拦这个键。
options.hasRovingTabIndexboolean | MaybeRefOrGetter<boolean>false整张网格只留一个 Tab 落脚点:当前格子的目标元素 tabindex="0",其余 -1。挂载后补上,方向键移动时跟着走。

返回值 ​

名称类型说明
gridRefRef<HTMLElement | null>挂到网格容器上的模板 ref。
handleKeyDown(event: KeyboardEvent) => void挂到网格容器的 keydown 上。
handleFocus(event: FocusEvent) => void挂到网格容器的 focusin 上。开着 hasRovingTabIndex 时保持 Tab 落脚点同步,没开就什么都不做,挂上也无害。
focusCell(index: number) => void按序号聚焦某个格子,序号会夹到合法范围里。接不了焦点的格子会跳过。
focusFirst() => void聚焦第一个能接焦点的格子。
focusLast() => void聚焦最后一个能接焦点的格子。