elementplus利用tabs标签页,实现自定义动态增减标签页功能

标签页一般配合菜单实现,当你点击一级菜单或者二级菜单时,可以增加对应的标签页,当你点击对应的标签页,可以触发对应的一级菜单或者二级菜单。

思路:
① 先定义好tabs的绑定值(activeTab),标签页数据(tabList)

② 利用onBeforeRouteUpdate方法,可以实现在当前组件中获取其他组件中的路由变化信息,例如你在菜单组件中点击二级菜单,那么在标签页组件中可以通过onBeforeRouteUpdate拿到对应的路由数据。定义添加标签导航addTab方法,查找tabList是否包含你点击的路由信息,如果没有则放入tabList中,并修改activeTab。

③ 页面刷新后会失去点击后的记录,因此可以使用vueuse中的cookie,初始化标签页数据(initTabList)

④ 删除标签页(removeTab ),重要的是删除当前标签页可以直接切换至下一个或上一个标签页:
1、首先就需要判断你当前点击的标签页路径是不是和activeTab路径一致(确认关闭的是否是当前标签页);
2、其次遍历tabList,拿到他每一个数据和索引,再次判断要删除的路径(currentTab)是否和tabList(tab.path)匹配,获取要删除的tabs的下一条(tabs[index + 1])或者上一条,如果存在那么赋值给activeTab;
3、最后重新赋值activeTab,过滤删除后的tabList,再设置cookie就可以了。

<template>
    <el-tabs
      v-model="activeTab"
      type="card"
      class="flex-1"
      @tab-change="tabChange"
      @tab-remove="removeTab"
      style="min-width: 100px"
    >
      <el-tab-pane
        v-for="item in tabList"
        :key="item.path"
        :label="item.title"
        :name="item.path"
        :closable="item.path != '/'"
      ></el-tab-pane>
    </el-tabs>
</template>

<script setup>
import { ref } from "vue";
import { useRouter, useRoute, onBeforeRouteUpdate } from "vue-router";
import { useCookies } from "@vueuse/integrations/useCookies";

  const route = useRoute();
  const router = useRouter();
  const cookie = useCookies();

  const activeTab = ref(route.path);
  const tabList = ref([
    {
      title: "后台首页",
      path: "/",
    },
  ]);

  //点击标签跳转指定路由
  function tabChange(path) {
    router.push(path);
    activeTab.value = path;
  }

  //添加标签导航
  function addTab(tab) {
    const notTab = tabList.value.findIndex((e) => e.path == tab.path) == -1;
    if (notTab) {
      tabList.value.push(tab);
    }
    cookie.set("tabList", tabList.value);
  }

  //初始化tabList
  function initTabList() {
    const data = cookie.get("tabList");
    if (data) {
      tabList.value = data;
    }
  }
  initTabList();

  //获取路由跳转后的tab数据
  onBeforeRouteUpdate((p) => {
    activeTab.value = p.path;
    addTab({
      title: p.meta.title,
      path: p.path,
    });
  });

  //删除tab
  const removeTab = (currentTab) => {
    let tabs = tabList.value;
    let a = activeTab.value;
    //如果当前路径和你要删除的路径一致
    if (currentTab == a) {
      tabs.forEach((tab, index) => {
        //要删除的路径和tabList的路径匹配
        if (tab.path == currentTab) {
          const nextTab = tabs[index + 1] || tabs[index - 1];
          //如果存在,获取nextTab路径
          if (nextTab) {
            a = nextTab.path;
          }
        }
      });
    }
    //重新赋值activeTab
    activeTab.value = a;
    //过滤删除后的tabList
    tabList.value = tabList.value.filter((tab) => tab.path != currentTab);
    //设置cookie
    cookie.set("tabList", tabList.value);
  };
</script>
  • 10
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
vue3动态组件实现tabs标签的步骤如下: 1. 创建tabs组件,包含tabstab两个子组件。tabs组件负责显示当前选中的tab和切换tabtab组件则负责显示tab的内容。 2. 在tabs组件中定义一个数组,用于存储所有的tab信息。每个tab信息包括tab的名称和对应的组件。 3. 在tabs组件中使用v-for指令循环渲染所有的tab,同时使用动态组件来渲染对应的组件。 4. 在tab组件中定义一个插槽,用于显示tab的内容。 5. 在tabs组件中定义一个方法,用于切换tab。该方法接受一个index参数,表示要切换到的tab的索引。该方法根据索引更新当前选中的tab,并将对应的组件渲染出来。 6. 在tabs组件中使用v-on指令绑定点击事件,调用切换tab的方法。 7. 在父组件中引入tabs组件,并传入所有的tab信息。 8. 使用tabs组件来显示tab标签。 示例代码如下: // Tabs.vue <template> <div class="tabs"> <div class="tab-list"> <div class="tab" v-for="(tab, index) in tabs" :key="tab.name" :class="{ active: isActiveTab(index) }" @click="selectTab(index)" >{{ tab.name }}</div> </div> <div class="tab-content"> <component :is="tabs[currentTab].component"></component> </div> </div> </template> <script> export default { name: "Tabs", props: ["tabs"], data() { return { currentTab: 0, }; }, methods: { isActiveTab(index) { return this.currentTab === index; }, selectTab(index) { this.currentTab = index; }, }, }; </script> // Tab.vue <template> <div class="tab-content"> <slot></slot> </div> </template> // App.vue <template> <div class="app"> <Tabs :tabs="tabs"></Tabs> </div> </template> <script> import Tabs from "./Tabs.vue"; import Tab from "./Tab.vue"; import Tab1 from "./Tab1.vue"; import Tab2 from "./Tab2.vue"; export default { name: "App", components: { Tabs, Tab, Tab1, Tab2, }, data() { return { tabs: [ { name: "Tab 1", component: "Tab1" }, { name: "Tab 2", component: "Tab2" }, ], }; }, }; </script>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值