为什么捐赠
API 浏览器
联系站长
选项卡

选项卡是一种使用较少窗口空间显示更多信息的方式。本页描述通过 QTabs、QTab 和 QRouteTab 进行的选项卡选择部分。

这个组件的一个常见用例是在布局的页眉/页脚中。请参考布局页眉和页脚获取参考。

TIP

QTabPanels配合使用效果很好,这是一个专门用于面板(选项卡内容)本身的组件。

正在加载 QTabs API...
正在加载 QTab API...
正在加载 QRouteTab API...

用法

提示

  • 当宽度超过容器宽度时,QTabs 可以水平滚动。相应调整您的浏览器以查看此效果。
  • 在桌面上,您将看到可以点击的两侧箭头。
  • 在移动设备上,您可以用手指滑动选项卡。
  • 如果您想在移动设备上强制显示箭头,请使用 mobile-arrows 属性。

WARNING

如果您不安装 Vue Router,QRouteTab 将无法与 UMD 版本一起工作。

基础

基础



外部、内部和移动设备上可见的箭头

外部、内部和移动设备上可见的箭头



垂直

垂直(与 QSplitter 示例)



紧凑

紧凑



单独颜色

单独颜色



波纹

无波纹和自定义波纹颜色



自定义指示器

在下面的示例中,请注意最后两个 QTabs:顶部指示器和无指示器。

自定义指示器



选项卡通知

有多种方式显示选项卡通知:使用 QBadge、通过警报点或警报图标(可以是任何图标)。

选项卡通知



对齐

QTabs 是响应式的,当容器宽度(不是窗口宽度)大于配置的断点时,align 属性(见下文)会激活。出于演示目的,下面的选项卡已禁用断点。

对齐



在下面示例的第二个 QTabs 中,如果窗口宽度低于 1024px,则"Movies"和"Photos"选项卡将被"More…"下拉菜单替代。

带下拉菜单

带下拉菜单



在 QToolbar 上

注意我们需要指定 shrink 属性。默认情况下,QTabs 尝试扩展到所有可用的水平空间,但在这种情况下,我们将其用作 QToolbar 的子元素,所以我们不希望这样。

QToolbar 中的选项卡



动态更新

动态选项卡



与 QTabsPanel 一起使用

TIP

QTabPanels 也可以独立使用。它们不依赖于 QTabs 的存在。此外,它们可以放置在页面内的任何位置,而不仅仅是在 QTabs 附近。

带选项卡面板的选项卡



更多信息:选项卡面板

连接到 Vue Router

您可以通过 QRouteTab 组件将选项卡与 Vue Router 一起使用。 此组件继承了 QTab 的所有内容,但它也绑定了 router-link 属性。这些允许监听当前应用路由,并在点击/触摸时触发路由。

<q-tabs>
  <q-route-tab icon="mail" to="/mails" exact />
  <q-route-tab icon="alarm" to="/alarms" exact />
</q-tabs>

WARNING

当使用带有 QRouteTab 的 QTabs 时,不建议同时使用 v-model(尽管您仍然可以),因为当前活动选项卡的真实来源由当前路由而不是 v-model 决定。每个 QRouteTab 根据您的应用路由而不是由于 v-model 变为"活动"。因此,v-model 的初始值或直接更改 v-model 不会改变您的应用路由。

匹配 QRouteTab 到当前路由
v2.9+ 更新

  • 如果设置为 exact 匹配:
    1. 它指向的路由必须被 Vue Router 视为"精确活动"(完全匹配路由,忽略哈希和查询)。
    2. 假设 Vue Router 处于历史模式,它必须匹配配置的路由哈希(如果有)
    3. 它必须匹配配置的路由查询(如果有)- 当前路由查询中的任何额外查询参数不会使选项卡处于活动状态(如果您想要这样,请不要使用 exact
  • 否则,如果未设置为 exact 匹配:
    1. 它指向的路由必须被 Vue Router 视为"活动"(松散匹配路由,忽略哈希和查询)。
    2. 假设 Vue Router 处于历史模式,它是否配置了哈希?如果是,则必须完全匹配。
    3. 它是否配置了查询?如果是,则配置的查询必须包含在当前路由查询中。
    4. 如果多个 QRouteTab 仍然匹配当前路由(例如:路由是 /cars/brands/tesla,我们有 QRouteTabs 指向非精确的 /cars,非精确的 /cars/brands,非精确的 /cars/brands/tesla),则最具体的匹配当前路由的选项卡获胜(在这种情况下是 /cars/brands/tesla)
    5. 如果仍有多个 QRouteTabs 匹配上述标准,则具有最接近当前路由查询的查询的选项卡获胜(具有配置的查询,并且当前路由查询具有最少数量的额外参数)。
    6. 如果仍有多个 QRouteTabs 匹配上述标准,则具有最长结果 href 的选项卡获胜。

配置了 exact 的 QRouteTabs 总是优先于松散匹配(非精确)的选项卡。

处理自定义导航
v2.9+ 更新

TIP

请参考页面顶部的 QRouteTab API 卡片,获取下面使用的 @click 事件的更深入描述。

<template>
  <q-tabs no-caps class="bg-orange text-white shadow-2">
    <q-route-tab :to="{ query: { tab: '1' } }" exact replace label="2秒后激活" @click="navDelay" />
    <q-route-tab
      :to="{ query: { tab: '2' } }"
      exact
      replace
      label="不做任何操作"
      @click="navCancel"
    />
    <q-route-tab
      :to="{ query: { tab: '3' } }"
      exact
      replace
      label="导航到第二个选项卡"
      @click="navRedirect"
    />
    <q-route-tab :to="{ query: { tab: '4' } }" exact replace label="立即导航" @click="navPass" />
  </q-tabs>
</template>

<script>
  export default {
    setup() {
      function navDelay(e, go) {
        e.preventDefault(); // 我们取消默认导航

        // console.log('2秒后触发导航')
        setTimeout(() => {
          // console.log('按照2秒前的承诺导航')
          go();
        }, 2000);
      }

      function navCancel(e) {
        e.preventDefault(); // 我们取消默认导航
      }

      function navRedirect(e, go) {
        e.preventDefault(); // 我们取消默认导航

        // 在您方便时调用此函数
        go({
          to: { query: { tab: "2", noScroll: true } },
          // replace: boolean; 默认是选项卡配置的内容
          // returnRouterError: boolean; 默认为false
        })
          .then((vueRouterResult) => {
            /* ... */
          })
          .catch((vueRouterError) => {
            /* ...除非 returnRouterError === true,否则不会到达这里 */
          });
      }

      function navPass() {}

      return { navDelay, navCancel, navRedirect, navPass };
    },
  };
</script>