Vue中tabs标签页实现 --(携带参数界面也支持)

效果图
  • 需要运行看效果的访问以下网址(切换到 tabs-router 分支, vue-userList为前端可以看效果的项目 -- 已关闭接口 -- 直接点登录即可)
    项目地址

主要代码

  • 以下代码储存路由信息时会保留路由携带的参数,点击tabs标签页跳转时会携带原本携带的参数。
  • 刷新界面后会默认添加当前页的tabs标签页,不会保留刷新前的存储tabs标签页数据,可根据需求考虑要不要进行浏览器存储以保证刷新后数据还保留。
  • 无需下包,无需引入,以下代码都在菜单配置文件里书写,标签名取值来自路由文件的title属性。
  • 以下唯一标识是由 路由+路由title名+路由参数id组成,可根据实际需求更改,但必须保持唯一性。
`路由示例`
// 信息总览
import home from '@/views/home';
export default {
  path: '/shopList',
  username: 'shopList',
  component: home,
  children: [
    {
      path: '',
      component: () => import('@/views/shop/index'),meta: { title: '信息总览', icon: 'el-icon-s-promotion' },
    },
    {
      path: '/shopList/shopDetails',
      component: () => import('@/views/shop/components/shopDetails.vue'),meta: { title: '详情-信息总览'}
    },
  ],
};
<el-main>
          <el-tabs
            v-model="editableTabsValue"
            type="card"
            closable
            @tab-click="tabCliclRouter"
            @tab-remove="tabRemoveRouter"
          >
            <el-tab-pane
              v-for="item in editableTabs"
              :key="`${item.path}-${item.meta.tagNameRouter}-${item.meta.pageId}`"
              :label="`${item.meta.tagNameRouter}`"
              :name="`${item.path}-${item.meta.tagNameRouter}-${item.meta.pageId}`"
            >
              {{ item.meta.tagNameRouter }}
            </el-tab-pane>
          </el-tabs>
          <router-view />
        </el-main>
data() {
    return {
      editableTabsValue: "",
      editableTabs: [],
    };
  },
  // 侦听器
  watch: {
    // 监听路由变化
    $route: {
      handler: function (val, oldVal) {
        // 添加tag信息
        this.addRouteTags();
      },
      // 深度观察监听
      deep: true,
    },
  },
  mounted() {
    // 页面刷新后添加当前路由tabs信息
    this.addRouteTags();
  },
// 组件方法
  methods: {

    // 添加路由信息 -- 用于渲染tabs -- 同时添加详情带参数等路由界面信息
    addRouteTags() {
      const pageId = `${this.$route.query.id ? this.$route.query.id : ""}`;
      this.editableTabsValue = `${this.$route.path}-${this.$route.meta.title}-${pageId}`;
      // 重复的不添加 -- 匹配路由-名字-id  是否相同
      if (
        this.editableTabs.find(
          (x) =>
            `${x.path}-${x.meta.tagNameRouter}-${x.meta.pageId}` ===
            `${this.$route.path}-${this.$route.meta.title}-${pageId}`
        )
      )
        return;
      // 添加tabs信息
      this.editableTabs.push({
        path: this.$route.path,
        query: this.$route.query,
        meta: {
          tagNameRouter: this.$route.meta.title,
          pageId: pageId,
        },
      });
    },

    // tabs标签页点击
    tabCliclRouter(val) {
      // 匹配正确的路由信息 -- 名字是路由多个唯一参数拼接而成 -- val.name此字段必须确保是唯一的
      const pageRouter = this.editableTabs.find(
        (x) => `${x.path}-${x.meta.tagNameRouter}-${x.meta.pageId}` === val.name
      );
      // 跳转tabs存储的对应路由信息,有参数携带参数
      this.$router.push({ path: pageRouter.path, query: pageRouter.query });
    },

    // tabs标签页移除
    tabRemoveRouter(val) {
      // 删除到第一个时禁止
      if (this.editableTabs.length === 1) return;
      // 找到对应的要删除tabs数据
      const routerFind = this.editableTabs.find(
        (x) => `${x.path}-${x.meta.tagNameRouter}-${x.meta.pageId}` === val,
      );
      // 对要删除的进行去除 -- 找到对应的位置
      const indexPath = this.editableTabs.findIndex(
        (x) =>
          `${x.path}-${x.meta.tagNameRouter}-${x.meta.pageId}` ===
          `${routerFind.path}-${routerFind.meta.tagNameRouter}-${routerFind.meta.pageId}`
      );
      // 根据找到索引进行删除操作
      this.editableTabs.splice(indexPath, 1);
      // 如果删除的是当前高亮的进行特殊处理 -- 使其高亮到前一个上,并跳转到高亮区域的界面
      if (
        `${routerFind.path}-${routerFind.meta.tagNameRouter}-${routerFind.meta.pageId}` ===
        val
      ) {
        // 改变高亮当前绑定值
        this.editableTabsValue = `${
          this.editableTabs[this.editableTabs.length - 1].path
        }-${
          this.editableTabs[this.editableTabs.length - 1].meta.tagNameRouter
        }`;
        // 跳转到当前高亮区域页面
        this.$router.push({
          path: this.editableTabs[this.editableTabs.length - 1].path,
          query: this.editableTabs[this.editableTabs.length - 1].query,
        });
      }
    },
  },
<style scoped lang="less">
::v-deep .el-tabs {
  height: 33px;
  border-bottom: 1px solid #e5e7ed;
  padding-left: 12px;
  .el-tabs__item {
    color: #000;
    height: 30px;
    line-height: 30px;
    padding: 0 12px;
    border: 1px solid #e5e7ed;
    margin-right: 8px;
  }
  .el-tabs__item.is-active {
    color: #00ab7a;
    background-color: #adebd9;
    opacity: 1;
  }
  .el-tabs__content {
    display: none;
  }
  .el-tabs__item:first-child {
    border-left: 1px solid #e5e7ed;
  }
  .el-tabs__nav {
    border: 0px;
  }
  .el-tabs__nav-scroll {
    background: #fff;
  }
  .el-tabs__nav-prev {
    line-height: 30px;
    .el-icon-arrow-left {
      font-weight: 700;
      color: #000;
    }
  }
  .el-tabs__nav-next {
    line-height: 30px;
    .el-icon-arrow-right {
      font-weight: 700;
      color: #000;
    }
  }
}
</style>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容