elementui+vue实现菜单导航跟main区域的tabs联动效果

2023-11-09

elementui+vue实现菜单导航跟main区域的tabs联动效果

文章目录

1.前言

vue小白,做的项目用的是elementui+vue实现,在项目进行到中期时,发现对于系统还是有一些不足的,vue用的是vuex进行路由跳转,但是每次跳转都会刷新页面,重新加载,就算控制路由上写了children,也算是重新加载的,所以问题就是怎么实现菜单导航跟页面的main区域的关联,用tabs联动起来,实现可以在main区域上看到我们之前点开过的页面,提示可以回到那个页面,同时保留当前页面。

2.实现效果:

在这里插入图片描述

3.解决过程

在网上看了很多大佬写的文章,可能我太菜了,看了之后完全看不懂,代码放到项目里不是这个问题就是那个问题。。。。。
附大佬文章:
如果觉得我写的不适合,可以参考大佬写的文章:

vue+element-ui点击导航栏动态添加对应的tabs,并可删除

我是根据这篇文章,结合我自己的项目进行修改的,可能没有那么完善,但是只是满足我自己项目的需求,同时我也看得懂。

4.具体代码

  • home页面:因为全部的代码实在是太多,不仅仅是导航栏跟tabs的两栋,还有我项目的一些具体功能代码,所以我没有全部放上来,只放了这个效果的全部代码。

html部分:

<el-main>
     <el-tabs type="card" @tab-remove="removeTab" @tab-click="tabClick">
         <el-tab-pane v-for="item in tabsItem"
                     :key="item.name"
                     :label="item.title"
                     :name="item.name"
                     :closable="item.closable"
                     :ref="item.ref">
         </el-tab-pane>
     </el-tabs> 
     <!-- 路由的占位符 -->
     <transition name="fade" mode="out-in">
         <keep-alive>
             <router-view v-if="$route.meta.keepAlive"></router-view>
         </keep-alive>
     </transition>
     <router-view v-if="!$route.meta.keepAlive"></router-view>             
 </el-main>

js部分:

<script>
import Home from '../components/Home.vue'
export default {
    data() {
        return {
            // 被激活的连接地址
            activePath: '',
            // activeTab: '1', //默认显示的tab
            tabIndex: 1, //tab目前显示数
            tabsItem: [
                {
                    title: '首页',
                    name: '1',
                    closable: false,
                    ref: 'tabs',
                    content: Home
                }
            ],
            tabsPath: [
                {
                    name: "1",
                    path: '/home'
                }
            ]
        }
    },
    computed: {
      activeNav() { //当前激活的导航
        return this.$route.path
      }
    },
    methods: {
        removeTab(targetName) { //删除Tab
            let tabs = this.tabsItem; //当前显示的tab数组
            let activeName = this.activeTab; //点前活跃的tab

            //如果当前tab正活跃 被删除时执行
            if (activeName === targetName) {
            tabs.forEach((tab, index) => {
                if (tab.name === targetName) {
                let nextTab = tabs[index + 1] || tabs[index - 1];
                if (nextTab) {
                    activeName = nextTab.name;
                    this.tabClick(nextTab)
                }
                }
            });
            }
            this.activeTab = activeName;
            this.tabsItem = tabs.filter(tab => tab.name !== targetName);
            //在tabsPath中删除当前被删除tab的path
            this.tabsPath = this.tabsPath.filter(item => item.name !== targetName)
        },
        tabClick(thisTab) {
            /*
            * thisTab:当前选中的tabs的实例
            * 通过当前选中tabs的实例获得当前实例的path 重新定位路由
            * */
            let val = this.tabsPath.filter(item => thisTab.name == item.name)
            this.$router.push({
            path: val[0].path
            })
        }
    },
    watch: {
      '$route': function (to) {  //监听路由的变化,动态生成tabs
        let flag = true //判断是否需要新增页面
        const path = to.path
        if (Object.keys(to.meta).length != 0) {
          for (let i = 0; i < this.$refs.tabs.length; i++) {
            if (i != 0) { //首页不判断 如果页面已存在,则直接定位当页面,否则新增tab页面
              if (this.$refs.tabs[i].label == to.meta.name) {
                this.activeTab = this.$refs.tabs[i].name  //定位到已打开页面
                flag = false
                break
              }
            }
          }
          //新增页面
          if (flag) {
            //获得路由元数据的name和组件名
            const thisName = to.meta.name
            const thisComp = to.meta.comp
            //对tabs的当前激活下标和tabs数量进行自加
            let newActiveIndex = ++this.tabIndex + ''
            //动态双向追加tabs
            this.tabsItem.push({
              title: thisName,
              name: String(newActiveIndex),
              closable: true,
              ref: 'tabs',
              content: thisComp
            })
            this.activeTab = newActiveIndex
            /*
            * 当添加tabs的时候,把当前tabs的name作为key,path作为value存入tabsPath数组中
            * key:tabs的name
            * value:tabs的path
            * {
            *   key: name,
            *   value: path
            * }
            * ///后面需要得到当前tabs的时候可以通过当前tabs的name获得path
            * */
            if (this.tabsPath.indexOf(path) == -1) {
              this.tabsPath.push({
                name: newActiveIndex,
                path: path
              })
            }
          }
        }
      }
    }
}
</script>

同时需要对原来的项目路由配置进行一些修改

在这里插入图片描述
改完之后就差不多了,代码写就到这里。

如果有写错或者不足的地方,还请在评论区指正!!我会及时修改!!!!!!

请尊重原创,如需转载,还请注明原作者,原文链接,谢谢啦!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

elementui+vue实现菜单导航跟main区域的tabs联动效果 的相关文章

随机推荐

  • c++类型推导

    类型推导 现代c 类型推导分为三个 一个为模板函数的形参推演 一个为auto的类型推导 一个decltype的类型推导 auto的类型推导是以模板函数的类型推导为基础的 模板函数类型推导 推导过程 模板函数的类型推导 是通过调用表达式即实参
  • openGL之API学习(七十七)glDrawElements

    通过索引方式来绘制几何图元 如果要 glDrawArrays 和 glDrawElements 正确进行绘制的话 必须在之前 调用带有相应参数的 glEnableClientState 方法 glDrawArrays使用的是顶点 而glDr
  • 查看linux centos ftp服务,Centos7开启FTP服务

    一 查看并安装vsftpd 执行以下命令进行查看 vsftpd v 如果没有安装的话就执行以下命令进行安装 yum y install vsftpd 二 配置vsftpd 2 1 取消匿名登陆 修改vsftpd conf文件 vi etc
  • huggingface ,Trainer() 函数是 Transformers 库中用于训练和评估模型的主要接口,Trainer()函数的参数如下:

    model required 待训练的模型 必须是 PyTorch 模型 args required TrainingArguments 对象 包含训练和评估过程的参数 例如训练周期数 学习率 批量大小等 train dataset opt
  • Linux用户空间和内核空间的内存互访

    Linux用户空间和内核空间的内存互访 标签 虚拟内存 安全性 Linux 用户 2012 11 13 15 55 Linux 内存 在 Linux 中 用户内存和内核内存是独立的 在各自的地址空间实现 地址空间是虚拟的 就是说地址是从物理
  • 在导入NVIDIA的apex库时报错 ImportError cannot import name ‘UnencryptedCookieSessionFactoryConfig‘ from

    在导入NVIDIA的apex库时报错 ImportError cannot import name UnencryptedCookieSessionFactoryConfig from pyramid session unknown loc
  • stm32定时器中断的配置步骤

    stm32定时器中断的配置步骤 1 TIM3 时钟使能 位于低速的APB1总线上 注意 高级定时器是在高速的APB2总线上 RCC APB1PeriphClockCmd RCC APB1Periph TIM3 ENABLE 时钟使能 2 初
  • 自签名SSL证书以及nginx配置https服务

    自签名SSL证书以及nginx配置https服务 服务器SSL的认证流程 单向认证 客户端发起建立HTTPS连接请求 将SSL协议版本的信息发送给服务端 服务器端将本机的公钥证书发送给客户端 客户端读取公钥证书 取出服务端公钥 客户端生成一
  • 如何理解数据库事务?

    目录 今日良言 保持热爱 奔赴山河 一 数据库事务 1 概念 2 使用 3 特性 今日良言 保持热爱 奔赴山河 一 数据库事务 1 概念 事务指逻辑上的一组操作 组成这组操作的各个单元 要么全部成功 要么全部失败 事务能够把多个SQL打包到
  • 【云原生之kubernetes实战】在k8s环境下部署jpress开源网站

    云原生之kubernetes实战 在k8s环境下部署jpress开源网站 一 jpress介绍 1 jpress简介 2 jpress功能 二 检查本地k8s环境 1 检查工作节点状态 2 检查系统pod状态 三 编辑jpress yaml
  • Fiddler抓包工具使用方法(二)手机抓包、设置断点

    抓取手机上的http生成https证书并发送到手机上进行安装 手机需要设置密码 设置如下 手机wifi设置代理 设置过滤抓取固定域名 手机抓取https请求 手机浏览器输入代理IP 8888 进入证书下载界面下载 下载并安装 需要设置锁屏密
  • 菊花链结构信号相关

    1 菊花链拓扑结构 菊花链一词最基本的概念指的是一种由许多菊花串接在一起形成的花环 早期也叫手牵手链接方式 一个人最多只能通过两条手臂牵着另外两个人 相当于一个芯片最多只能通过两段传输线连接到另外的两个芯片上 后来衍变到电子电器工程中菊花链
  • vue中点击按钮跳转到el-table的某个标识位置所在行

    客户需求 每点击一次按钮就跳到el table的具体位置 省的自己滚动找数据 实现思路 通过循环行和列找到标识数据所在行的id 存储到数组里 然后在按钮方法里获取 id 所在行的dom的高度 使用scrollTop方法 id 所在行的dom
  • 什么是二进制8421码?

    8421码 是BCD码的一种 意思是每一个二进制位上的数据对应一个固定的值 只需要把1位置对应的数值相加就能得出该二进制对应的十进制的值 图解如下 及相关二进制快速转换问题
  • VUE生命周期与Ajax前后端调用

    1 VUE的生命周期 VUE中有一整套完整的VUE对象创建 使用 销毁的流程 如果用户需要在某个特定的点 有特殊的需求 可以对VUE对象进行扩展 销毁需要手动销毁
  • 【华为OD机试真题 python】打印任务排序

    题目描述 某个打印机根据打印队列执行打印任务 打印任务分为九个优先级 分别用数字1 9表示 数字越大优先级越高 打印机每次从队列头部取出第一个任务A 然后检查队列余下任务中有没有比A优先级更高的任务 如果有比A优先级高的任务 则将任务A放到
  • Mybatis持久层框架入门及底层逻辑分析

    Mybatis持久层框架入门及底层逻辑分析 关于作者 作者介绍 博客主页 作者主页 简介 JAVA领域优质创作者 一名在校大三学生 在校期间参加各种省赛 国赛 斩获一系列荣誉 关注我 关注我学习资料 文档下载统统都有 每日定时更新文章 励志
  • Flutter图片上传(Dio + Image_picker)

    PS 图片上传功能在项目中属于很常见的功能 网上也有蛮多图片上传的框架 看的眼花缭乱的 最后 本着自己最熟悉的才是最好的原则选择 Flutter Dio 所以项目中用的网络框架也是Flutter Dio 直接拿来写个简单的demo 也算记录
  • 推荐系统毕业设计 协同过滤商品推荐系统设计与实现

    文章目录 1 简介 2 常见推荐算法 2 1 协同过滤 2 2 分解矩阵 2 3 聚类 2 4 深度学习 3 协同过滤原理 4 系统设计 4 1 示例代码 py 5 系统展示 5 1 系统界面 5 2 推荐效果 6 最后 1 简介 Hi 大
  • elementui+vue实现菜单导航跟main区域的tabs联动效果

    elementui vue实现菜单导航跟main区域的tabs联动效果 文章目录 1 前言 2 实现效果 3 解决过程 4 具体代码 1 前言 vue小白 做的项目用的是elementui vue实现 在项目进行到中期时 发现对于系统还是有