vue怎样隐藏不需要显示的tab标签页

用户使用时每打开一个页面就会产生一个tab标签,当操作过多时,tab标签就会杂乱。为优化体验,仅主菜单项允许生成 Tab 标签,子页面将在当前标签内切换而不生成。

src/layout/components/TagsView/index.vue

<template>
  <div id="tags-view-container" class="tags-view-container container-style">
    <scroll-pane ref="scrollPane" class="tags-view-wrapper" @scroll="handleScroll">
      <router-link v-for="tag in visitedViews" ref="tag" :key="tag.path" :class="isActive(tag) ? 'active' : ''"
        :to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }" tag="span" class="tags-view-item"
        :style="activeStyle(tag)" @click.middle.native="!isAffix(tag) ? closeSelectedTag(tag) : ''"
        @contextmenu.prevent.native="openMenu(tag, $event)">
        {{ $t(tag.meta.title) }}
        <span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" />
      </router-link>
    </scroll-pane>
    <ul v-show="visible" :style="{ left: left + 'px', top: top + 'px' }" class="contextmenu">
      <li @click="refreshSelectedTag(selectedTag)">刷新页面</li>
      <li v-if="!isAffix(selectedTag)" @click="closeSelectedTag(selectedTag)">关闭当前</li>
      <li @click="closeOthersTags">关闭其他</li>
      <li @click="closeAllTags(selectedTag)">关闭所有</li>
    </ul>
  </div>
</template>

<script>

export default {
  computed: {
    visitedViews() {
      return this.$store.state.tagsView.visitedViews
    },
  },
}
</script>

src/router/index.js

在路由配置中新增 showTag 属性,用于控制是否显示 Tab 标签

{
    path: "",
    component: Layout,
    redirect: "index",
    children: [
      {
        path: "index",
        component: (resolve) =>
          require(["@/views/dashboard/index.vue"], resolve),
        name: "Index",
        meta: {
          title: "layout.home",
          icon: "dashboard",
          // noCache: true,
          affix: true,
          showTag: true, // 显示tag标签
        },
      },
    ],
  },

src/store/modules/tagsView.js

若 showTag 为 true,则将页面添加至 Tab 数组;若为 false,则不生成 Tab 标签。

const state = {
  visitedViews: [],
  cachedViews: [],
};
const mutations = {
  ADD_VISITED_VIEW: (state, view) => {
    if (state.visitedViews.some((v) => v.path === view.path)) return;
    if (!view.meta.showTag) return;    // 判断如果showTag为false则不填进数组
    state.visitedViews.push(
      Object.assign({}, view, {
        title: view.meta.title || "no-name",
      })
    );
  },
}

显示效果:在 visitedViews 中,基于 route.meta.showTag  属性,仅主菜单项生成 Tab 标签,子页面默认不生成。如子页面需显示 Tab,可在路由配置中手动设置 showTag: true。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值