跳到主要內容

Tabs 標籤頁

選項卡切換元件,支援受控 / 非受控、卡片 / 線條兩種外觀、頁籤關閉與新增、完整鍵盤導覽。

基礎用法​

基礎用法
水墨暈染,氣韻生動。
工筆細描,毫髮畢現。
import { useState } from 'react'
import { LhTabs, LhTabPane } from '@lh-ui/react'

export default function Demo() {
const [value, setValue] = useState('ink')

return (
<LhTabs value={value} onChange={(name) => setValue(name)}>
<LhTabPane name="ink" label="水墨">
水墨晕染,气韵生动。
</LhTabPane>
<LhTabPane name="danqing" label="丹青">
丹青设色,金碧辉映。
</LhTabPane>
</LhTabs>
)
}

Tabs Props​

屬性說明型別可選值預設值
value當前啟用頁籤的 name(受控)string——
defaultValue當前啟用頁籤的 name(非受控預設值)string——
type外觀'line' | 'card'—'line'
closable頁籤是否可關閉boolean—false
addable是否顯示新增按鈕boolean—false
tabPosition頁籤位置'top' | 'bottom'—'top'
sx快速版面配置屬性SxProps——

TabPane Props​

屬性說明型別預設值
name頁籤唯一標識(作為穩定鍵,不建議動態修改)string—
label頁籤標題ReactNode—
disabled是否停用booleanfalse
children頁籤內容ReactNode—

Tabs 事件​

事件說明回呼簽名Vue 對照
onChange啟用頁籤變化時觸發(name: string) => void@change
onRemove關閉頁籤時觸發(頁籤的顯隱由業務側控制)(name: string) => void@remove
onAdd新增按鈕點選時觸發() => void@add
受控 / 非受控

傳 value 即受控,傳 defaultValue 走非受控內部態。兩種模式下 onChange 都會觸發。刪除啟用頁籤時,非受控模式自動切到相鄰可用頁籤(對齊 plus 的 getNameAfterRemove);受控模式交由業務側在 onRemove 裡處理。

子節點限制

children 必須直接是 LhTabPane(可用 .map 渲染,可用 Fragment 平鋪包裹,但不可被自訂元件包裹)—— 父元件靠 Children.forEach 下鑽收集頁籤記錄,自訂包裹層會導致收集失敗。

鍵盤互動​

遵循 APG tabs pattern:焦點在頁籤按鈕上時,ArrowRight / ArrowLeft(縱向為 ArrowDown / ArrowUp)在可用頁籤間移動並啟用,跳過停用項;Home / End 跳到首 / 末項;Delete / Backspace 關閉當前頁籤(需 closable)。僅啟用頁籤 tabindex=0,其餘為 -1(roving tabindex)。

無障礙​

頁籤欄為 role="tablist",頁籤為 role="tab" 並帶 aria-selected / aria-controls,面板為 role="tabpanel" 並帶 aria-labelledby,id 由 useId() 生成、SSR 穩定。非啟用面板以 hidden 屬性移出無障礙樹。

ref​

forwardRef<HTMLDivElement> —— 根元素。LhTabPane 轉發 HTMLDivElement。

樣式​

import '@lh-ui/react/theme.css'
import '@lh-ui/react/style/tabs'