You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中自定义Chakra UI Tab元素覆盖aria-selected默认选中样式

Chakra UI Tab 自定义选中/未选中样式实现

你不用手动匹配aria-selected、data-selected属性写CSS覆盖,Chakra UI本身已经封装了状态获取和样式覆盖的能力,下面是几种常用的实现方式,按推荐优先级排序:


1. 用内置_selected样式简写(最推荐,无优先级问题)

Chakra UI 专门给可选组件提供了_selected样式简写,编译后会自动生成和默认样式权重完全一致的&[aria-selected=true], &[data-selected]选择器,写在sx属性或者样式props里会直接覆盖默认样式,不需要加!important。

import { Tab } from '@chakra-ui/react'

<Tab
  sx={{
    // 未选中状态的默认样式
    color: 'gray.500',
    borderBottom: '2px solid transparent',
    padding: '10px 16px',
    // 选中状态样式
    _selected: {
      color: 'red.600', // 替换默认的blue.600
      borderColor: 'currentColor',
      fontWeight: 600
    }
  }}
>
  Basics
</Tab>

2. 按判断状态传内联style的写法

如果你一定要用原生style属性、通过判断选中状态传不同样式,可以通过两种方式拿到isSelected状态:

方式A:函数式子元素直接拿状态

Tab组件支持传入函数作为子元素,参数里会暴露当前是否选中的状态:

<Tab>
  {({ isSelected }) => {
    return (
      <span
        style={{
          color: isSelected ? '#dc2626' : '#6b7280',
          fontWeight: isSelected ? 600 : 400
        }}
      >
        Basics
      </span>
    )
  }}
</Tab>

方式B:通过useTab钩子拿状态,给Tab根元素加内联样式

如果要直接给Tab的根按钮元素加内联样式,可以用官方提供的useTab钩子获取选中状态:

import { useTab } from '@chakra-ui/react'

const CustomTab = (props) => {
  const tabProps = useTab(props)
  const isSelected = !!tabProps['aria-selected']

  return (
    <button
      {...tabProps}
      style={{
        // 未选中公共样式
        color: '#6b7280',
        borderBottom: '2px solid transparent',
        padding: '10px 16px',
        // 选中时覆盖样式
        ...(isSelected && {
          color: '#dc2626',
          borderColor: 'currentColor'
        })
      }}
    >
      {props.children}
    </button>
  )
}

// 使用时直接替换原生Tab即可
<TabList>
  <CustomTab>Basics</CustomTab>
</TabList>

3. 全局统一配置选中样式

如果项目里所有Tab都要用同一套自定义选中样式,直接在主题配置里覆盖默认样式即可,不用每个Tab单独写:

import { extendTheme } from '@chakra-ui/react'

const customTheme = extendTheme({
  components: {
    Tabs: {
      baseStyle: {
        tab: {
          // 全局未选中样式
          color: 'gray.500',
          fontWeight: 400,
          // 全局选中样式
          _selected: {
            color: 'brand.500',
            borderColor: 'currentColor',
            fontWeight: 600
          }
        }
      }
    }
  }
})

注意:不要手动给Tab组件加aria-selected属性,这个属性由组件内部自动管理,手动添加容易和内部状态逻辑冲突。


内容的提问来源于stack exchange,提问作者Juel Hossain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 09:48:14