Skip to content

TabsMenu 下拉菜单

向下弹出的菜单列表。

基础用法

全屏展示(适用于移动端)

菜单栏滚动

标签数量超过 5 个时,标签栏可以在水平方向上滚动,切换时会自动将当前标签居中。

多选

向上展开

direction 属性值设置为 up,菜单即可向上展开。

禁用菜单

自定义组件

API

TabsMenu Props

参数说明类型默认值
v-model绑定当前选中标签的标识符number | string0
overlay是否显示遮罩层,下拉弹窗模式下默认为 falsebooleantrue
z-index菜单栏 z-index 层级number | string10
ellipsis是否省略过长的标题文字booleantrue
swipe-threshold滚动阈值,标签数量超过阈值且总宽度超过标签栏宽度时开始横向滚动number | string5
shrink是否开启左侧收缩布局booleanfalse
duration动画时长,单位秒,设置为 0 可以禁用动画number | string0.2
direction菜单展开方向,可选值为 upstringdown
active-color菜单标题和选项的选中态颜色string#1989fa
close-on-click-outside是否在点击遮罩层后关闭菜单booleantrue
close-on-click-outside是否在点击外部元素后关闭菜单booleantrue
trigger下拉菜单打开的触发方式,可选值为 hoverstringclick
full下拉菜单是否全屏展示booleanfalse
show-arrow下拉菜单非全屏模式下,是否显示箭头booleantrue
lock-scroll是否锁定屏幕booleanfalse
sub-select有下拉菜单时,导航菜单是否可以点击,当为 true 时,下拉菜单触发形式 trigger 使用 hoverbooleanfalse
multiple是否是多选booleanfalse
type样式风格类型,可选值为 nonestringline
line-width底部条宽度,默认单位 pxnumber | string40px
line-height底部条高度,默认单位 pxnumber | string3px

TabsMenu Events

事件名说明回调参数
select点击一级导航菜单时触发{ index: number, item: ComponentInstance }

TabsMenu 方法

通过 ref 可以获取到 TabsMenu 实例并调用实例方法,详见组件实例方法

方法名说明参数返回值
resize外层元素大小或组件显示状态变化时,可以调用此方法来触发重绘--
close关闭所有菜单的展示状态--

TabsMenu Slots

名称说明
default默认内容

TabsMenuItem Props

参数说明类型默认值
name标签名称,作为匹配的标识符number | string标签的索引值
title菜单项标题string当前选中项文字
options选项数组Option[][]
disabled是否禁用菜单booleanfalse
teleport指定挂载的节点,等同于 Teleport 组件的 to 属性string | Element-
lazyRender是否在首次展开时才渲染菜单内容booleantrue
v-model当前选中项对应的 valuenumber | string-
title-class标题额外类名string | Array | object-
content-class自定义弹窗内容额外类名string | Array | object-
offset非全屏模式下,弹窗的偏移量Array[0,8]

TabsMenuItem Slots

名称说明
default菜单内容
title自定义菜单项标题

TabsMenuItem 方法

通过 ref 可以获取到 TabsMenu 实例并调用实例方法,详见组件实例方法

方法名说明参数返回值
toggle切换菜单展示状态,传 true 为显示,false 为隐藏,不传参为取反show?: boolean-

Option 数据结构

键名说明类型
text文字string
value标识符number | string
icon左侧图标名称或图片链接string

类型定义

组件导出以下类型定义:

ts
import type {
  TabsMenuMenuProps,
  TabsMenuItemProps,
  TabsMenuItemOption,
  TabsMenuItemInstance,
  TabsMenuMenuInstance,
  TabsMenuMenuDirection
} from 'ryxon'

主题定制

样式变量

组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 ConfigProvider 组件

名称默认值描述
--r-tabs-menu-height48px-
--r-tabs-menu-backgroundvar(--r-background-2)-
--r-tabs-menu-shadow0 2px 12px rgba(100, 101, 102, 0.12)-
--r-tabs-menu-title-font-size15px-
--r-tabs-menu-title-text-colorvar(--r-gray-7)-
--r-tabs-menu-title-active-text-colorvar(--r-text-color)-
--r-tabs-menu-title-disabled-text-colorvar(--r-text-color-2)-
--r-tabs-menu-title-padding0 var(--r-padding-xs)-
--r-tabs-menu-title-line-heightvar(--r-line-height-lg)-
--r-tabs-menu-option-active-colorvar(--r-primary-color)-
--r-tabs-menu-content-max-height80%-
--r-tabs-menu-bottom-bar-width40px-
--r-tabs-menu-bottom-bar-height3px-
--r-tabs-menu-bottom-bar-colorvar(--r-primary-color)-
--r-tabs-menu-item-z-index10-
--r-tabs-menu-item-dropdown-width150px-
--r-tabs-menu-item-dropdown-arrow-size6px-
--r-tabs-menu-item-dropdown-backgroundvar(--r-background-2)-
--r-tabs-menu-item-radius8px-

常见问题

组件从隐藏状态切换到显示状态时,底部条位置错误?

Tabs 组件在挂载时,会获取自身的宽度,并计算出底部条的位置。如果组件一开始处于隐藏状态,则获取到的宽度永远为 0,因此无法展示底部条位置。

解决方法

方法一,如果是使用 v-show 来控制组件展示的,则替换为 v-if 即可解决此问题:

html
<!-- Before -->
<r-tabs v-show="show" />
<!-- After -->
<r-tabs v-if="show" />

方法二,调用组件的 resize 方法来主动触发重绘:

html
<r-tabs v-show="show" ref="tabs" />
js
this.$refs.tabs.resize()

父元素设置 transform 后,下拉菜单的位置错误?

把 TabsMenuMenu 嵌套在 Tabs 等组件内部使用时,可能会遇到下拉菜单位置错误的问题。这是因为在 Chrome 浏览器中,transform 元素内部的 fixed 布局会降级成 absolute 布局,导致下拉菜单的布局异常。

将 TabsMenuItem 的 teleport 属性设置为 body 即可避免此问题:

html
<r-tabs-menu-menu>
  <r-tabs-menu-item teleport="body" />
  <r-tabs-menu-item teleport="body" />
</r-tabs-menu-menu>

Released under the MIT License.