NavigableContainer 是一个 React 组件,用于渲染可通过键盘导航的容器。只有可聚焦的元素才能被导航到。它目前始终是一个 div。

NavigableContainer 导出为两个组件:NavigableMenu 和 TabbableContainer。NavigableContainer 本身不导出。NavigableMenu 和 TabbableContainer 具有下面列出的 props。任何其他 props 都将透传给 div。


Props

这些是 NavigableMenu 和 TabbableContainer 的 props。任何特定于某个组件的 props 都标有适当的标签。

cycle: boolean

一个布尔值,指示组件是否应从末尾循环回到开头,反之亦然。

  • Required: No
  • default: true

eventToOffset: ( event: KeyboardEvent ) => -1 | 0 | 1 | undefined

(仅限 TabbableContainer)
根据事件获取偏移量。

  • Required: No

onKeyDown: ( event: KeyboardEvent ) => void

在 keydown 事件时调用的回调函数。

  • Required: No

onNavigate: ( index: number, focusable: HTMLElement ) => void

当菜单导航到其子项之一时调用的回调函数,将索引和子项作为参数传递

  • Required: No

orientation: ‘vertical’ | ‘horizontal’ | ‘both’

(仅限 NavigableMenu)
菜单的方向。可以是“vertical”、“horizontal”或“both”。

  • Required: No
  • Default: "vertical"

Components

NavigableMenu

NavigableMenu 允许通过方向键在组件上下(或左右)移动。未处理 tab 键。使用 orientation prop 来确定使用的方向键是垂直、水平还是两者兼有。

NavigableMenu 默认具有 menu 角色,因此,为了按预期工作,该组件期望其子元素具有以下角色之一:'menuitem' | 'menuitemradio' | 'menuitemcheckbox'。

TabbableContainer

TabbableContainer 仅使用 tab 键进行导航。每个预期的选项卡停止点必须具有 tabIndex 0。

Usage

import {
    NavigableMenu,
    TabbableContainer,
    Button,
} from '@wordpress/components';

function onNavigate( index, target ) {
    console.log( `Navigates to ${ index }`, target );
}

const MyNavigableContainer = () => (
    <div>
        <span>可导航菜单:</span>
        <NavigableMenu onNavigate={ onNavigate } orientation="horizontal">
            <Button variant="secondary">Item 1</Button>
            <Button variant="secondary">Item 2</Button>
            <Button variant="secondary">Item 3</Button>
        </NavigableMenu>

        <span>可选项卡容器:</span>
        <TabbableContainer onNavigate={ onNavigate }>
            <Button variant="secondary" tabIndex="0">
                Section 1
            </Button>
            <Button variant="secondary" tabIndex="0">
                Section 2
            </Button>
            <Button variant="secondary" tabIndex="0">
                Section 3
            </Button>
            <Button variant="secondary" tabIndex="0">
                Section 4
            </Button>
        </TabbableContainer>
    </div>
);