Vue2:标签页一个页面拆分成俩个选项卡

news2024/10/1 19:36:34

概要

  在自己的项目中,标签页组件显示一般就是点击一个页面,然后标签页组件显示该页面的名称。但是如果你是一个页面文件中展示不同的内容比如( 某模块的新增页面 和 详情页面)一般内容新建页面和详情页面差别不是很大,有的内容甚至俩边都会用到,所以就没有想着创建俩文件单独展示。但是如果在一般情况下,咱们都会将定义文件的路由路径 Path作为唯一标识,这样标签页组件中 只会存在一个点击的标签,但是如果想点击新增,点击详情的时候,分别添加入,新增的标签和详情的标签呢?

在此之前如果不太清楚Tabs标签页属性可以看官网介绍:https://element.eleme.cn/#/zh-CN/component/tabs

el-tabs 中的v-model 的值,对应着 el-tab-pane中的:name属性 就会选中该标签高亮提示

实现过程

  1.路由配置文件 router.js  配置路由信息

const routes = [
{
        //首页
        path: '/index',
        name: 'index',
        component: (resolve) => {
            return require(['@/pages/index/index.vue'], resolve)
        },

        //用户登录才能访问
        meta: {
            requireAuth: true,
            keepAlive: true
        },
        children: [
{
               
                path: '/chargebacknotice',
                name: 'chargebacknotice',
                //路由懒加载
                component: (resolve) => {
                    return require(['@/pages/returnofgoods/chargebacknotice/index.vue'], resolve)
                },
                
                meta: {
                    //用户登录才能访问
                    requireAuth: true,
                    //是否开启缓存
                    keepAlive: true,
                    title:'退货通知单'
                }
            },
    
            {
                //该模块页面的 新建  和 详情 页面
                path: '/chargebacknotice/createChargebacknotice',
                name: 'chargebacknotice',
                component: (resolve) => {
                    return require(['@/pages/returnofgoods/chargebacknotice/createChargebacknotice/index.vue'], resolve)
                },
                meta: {
                    requireAuth: true,
                    title:'退货通知单',
                }
            },
]]}

   2.配置路由前置守卫(获取页面的路由信息)

 

//to:将要进入的页面的路由信息
//form:将离开的页面路由信息
// next :是否放开 进入  next()
//sotre :Vuex.commit('调用的mutations中的方法名称',传递的值)  需要引入自己定义的vuex文件
router.beforeEach((to,form,next)=>{
   store.commit('getRouterList_Path',to)
])

3.vuex文件

import Vue from 'vue'
import Vuex from 'vuex'
import router from "@/router";

Vue.use(Vuex)

export default new Vuex.Store({
    state:{
        tabNavList:[] ,//标签页组件显示标签的数据
        nowRouterPath:'',//当前页面路由路径
    },
    mutations:{
       getRouterList_Path(state,data){
         let newData
         let ispush = false
      if(state.tabNavList.length == 0){
        sessionStorage.getItem('TabNavList') ? state.tabNavList = JSON.parse(sessionStorage.getItem('TabNavList'))  : ''
      }
        //1.将路由参数赋值 避免直接赋值 修改提示只读
        let {fullPath,hash,meta,name,params,query,path} = data
        //2.定义变量总和起来
         newData ={
          fullPath,hash,meta,name,params,query,path
        }
        //3.拷贝
        state.nowRouterPath = JSON.parse(JSON.stringify(newData.fullPath))
        //6.判断保存route的信息,tabNavList:tab标签页的的数据
        if(state.tabNavList.length != 0 ){
          //7.循环数据
          for (const index in state.tabNavList) {
            //8.判断本次传递过来的路由参数,是否和tab标签中的path是否不相同
            if(state.tabNavList[index].path != newData.path){
              //9.如果不相同就可以直接存入 , 表示该页面信息没有在tab标签页中
              ispush = true
            }else{
              //10.如果相同的话,相比本次路由信息的edit是否一直,如 创建页面 和 详情页面是 同一个vue文件,edit:0标识的创建,eidt:1 是便是详情
                if(state.tabNavList[index].query.edit != newData.query.edit){
                  //11.便是可以存入
                  ispush = true
                }else{
                  //12.如果edit都相同的话
                  //11.判断此路由传递的参数的对象长度不等于0
                  if(Object.keys(newData.query).length != 0){
                    //12.直接将当前的路由信息,替换掉tabNavList中的数据
                    state.tabNavList[index] = newData
                  }
                  ispush = false
                  break;
                }
            }
          }
        }else{
          //tabNavList没有数据 直接添加进去
          state.tabNavList.push(JSON.parse(JSON.stringify(newData)))   
      }
      ispush ? state.tabNavList.push(JSON.parse(JSON.stringify(newData)))    : ''
      sessionStorage.setItem('TabNavList', JSON.stringify(state.tabNavList))
      state.NavClickPath.length == 0 ? state.NavClickPath = JSON.parse(sessionStorage.getItem('NavClickPath')) : ''
      if(state.NavClickPath.length != 0 && data.query){
        state.NavClickPath.map(item=>{
          if(data.fullPath.indexOf(item.path) !== -1){
            state.Navhighlighted = item
          }
        })
      }else{
        state.Navhighlighted = data
      } 
      //判断是否本地中没有存在 NavClickPath 
      sessionStorage.getItem('NavClickPath') !== null ? '' : sessionStorage.setItem('NavClickPath',JSON.stringify(state.NavClickPath))
      
    },
//获取菜单中的所有路径,然后匹配当前路由,如果当前路由中包含菜单中的路由,就是存在关联关系,就让菜单中的path高亮
    getNavClickPath(state,path){
      state.NavClickPath = path
    },
    
})

4.Tabs标签页组件

<template>
<div class="tab-box">
    <div>
            //$store.state.nowRouterPath 当前页面的路由信息  匹配el-tab-pane 中的name属性,提示高亮
      <el-tabs class="tab-list" v-model="$store.state.nowRouterPath" type="card"  @tab-click="hanelClickTab" closable @tab-remove="removeTab">
        <el-tab-pane
          v-for="(item, index) in $store.state.tabNavList"
          :key="item.fullPath"
          :label="item.query.edit == 0 ? '新建'+item.meta.title : item.query.edit == 1 ? item.meta.title+'详情' : item.meta.title"
          :name="item.fullPath"
        >
        </el-tab-pane>
      </el-tabs>
    </div>
</div>
</template>

<script>
 export default {
    data() {
      return {
        path:{},
      }
    },
    mounted(){
    },
    methods: {
      //点击标签跳转 
      hanelClickTab(tab, event){
        let data = this.$store.state.tabNavList
        data.map(item=>{
          if(item.fullPath === tab._props.name){
            this.$router.push({
              path :item.path,
              query:item.query
            })
          }
        })
      },
    }
  }
</script>

5.公共接口文件

import axios from 'axios'
import baseURL from '../../api/axios/baseUrl'
import store from '@/store'
import router from '@/router'
import Vue from 'vue'

//登录调用的用户详情接口文件 
function getUserNav() {
  Vue.prototype.$axios
    .get("/api/system/user/detail", {
      params: {
        id: localStorage.getItem("user_id"),
        permission_tree : 1,//树状
      },
    })
    .then((res) => {
      let data = res.data.data 
    //data.permissions 存放的用户菜单信息
      if(data.permissions){
          sessionStorage.setItem('user_type',JSON.stringify(res.data.data.user_type))
          store.commit('updataUserType',res.data.data.user_type) 
           //传递用户的nav数据 
          getNavTab(res.data.data.permissions)
          let is = sessionStorage.getItem('getUserNav')
          if(is == 1){
            setTimeout(() => {
              Vue.prototype.$message.success('登录成功');
          }, 0);
            router.push('/index')
            location.reload(true)
            sessionStorage.setItem('getUserNav',0)
          }
      }else{
         store.commit('clreatStroeData')
         sessionStorage.clear()
         localStorage.clear()
         Vue.prototype.$alert('此账户没有权限','提示',{
          confirmButtonText: '确定',
          callback: action => {
            router.push('/login')
          }
         })
      }
    });
}
/** 筛选出数据中的 菜单, 菜单的子菜单
 * permission_type =  1 表示菜单
 * permission_type =  2 表示菜单的子菜单
 * 1.先遍历所有对象  先找出菜单  判断 permission_type =  1
 * 1.遍历所有对象  先找出菜单的子菜单  判断 permission_type =  2
 *  */
function getNavTab(data) {
  let NavListData = []
    for(let n in data){
        // title:菜单的名称    id 菜单的 id  name 菜单的标识  path 菜单的路径
        data[n].title = data[n].name
        data[n].xuhao = data[n].id
        data[n].name = data[n].id.toString()
        //一级菜单是点击的菜单  比如 导出下载
        if(data[n].web_path != undefined){
            data[n].path = data[n].web_path
            data[n].child = data[n].children
            delete data[n].children
            let a = {
                Plabel : data[n].title,
                path:data[n].web_path
            }
            NavListData.push(a)
            
        }
        //判断是否有子菜单
        if(data[n].children){
            //循环子菜单  更改数据
            for(let s in data[n].children){
                data[n].children[s].title = data[n].children[s].name
                data[n].children[s].xuhao = data[n].children[s].id
                data[n].children[s].name = data[n].children[s].id.toString()
                data[n].children[s].path = data[n].children[s].web_path
                let a = {
                    Plabel : data[n].title,
                    label:data[n].children[s].title,
                    path:data[n].children[s].web_path
                }
                NavListData.push(a)
            }
        }
    }
    //6.26 把所有菜单信息保存到 session中 然后每次路由发生变化的时候就去 调用store中的方法
    sessionStorage.getItem('caidanxinxi') ?  ''  : 
    Vue.prototype.bus.$emit('getNavList',data)
    sessionStorage.setItem('caidanxinxi',JSON.stringify(data))
    store.commit('getNavClickPath',NavListData)
    
}
export default {
  getUserNav
}

最后对比效果

修改之前:

修改后:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1613856.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows驱动开发-设备栈

设备栈是windows内核中非常重要的部分&#xff0c;这部分理解可以让我们在调试中节省大量的时间&#xff0c; 在windows NT体系中&#xff0c;内核所有的设备被按照连接次序加载到设备树上&#xff0c;这棵树的根节点是ROOT节点&#xff0c;每一个设备可以从当前路径一直遍历到…

查询服务器上所有SQL SERVER数据库中是否包含某个字段,且该字段是否包含某个值

公司有一堆相同类别的客户&#xff0c;每个客户都部署了相同的一套系统&#xff0c;每套系统对应一个相同结构的数据库&#xff0c;昨天老板让查一下手机号码177xxxxx248是属于哪个客户的客户。 我要查的这个号码来自于oa_member表中的phone字段&#xff0c;我需要对所有的数据…

Android 性能优化之黑科技开道(二)

3. 其它可以黑科技优化的方向 3.1 核心线程绑定大核 3.1.1 定义 核心线程绑定大核的思路也很容易理解&#xff0c;现在的 CPU 都是多核的&#xff0c;大核的频率比小核要高不少&#xff0c;如果我们的核心线程固定运行在大核上&#xff0c;那么应用性能自然会有所提升。 核…

使用Python比较两张人脸图像并获得准确度

使用 Python、OpenCV 和人脸识别模块比较两张图像并获得这些图像之间的准确度水平。 一、原理 使用Face Recognition python 模块来获取两张图像的128 个面部编码&#xff0c;并比较这些编码。比较结果返回 True 或 False。如果结果为True &#xff0c;那么两个图像将是相同的…

社交媒体内容创新:Kompas.ai如何引领潮流

在数字营销的激烈竞争中&#xff0c;社交媒体平台已成为品牌与消费者互动的主要战场。随着用户对新鲜、有趣和互动性强的内容需求不断增长&#xff0c;品牌必须不断创新&#xff0c;以维持其在社交媒体上的影响力和吸引力。本文将深入探讨社交媒体平台上内容创新的必要性及其对…

【Python】使用Python计算简单数值积分

题外话&#xff0c;Python语言命名的来源&#xff1a;&#xff08;见下图&#xff09;Monty Python巨蟒剧团 1、积分题目&#xff08;3&#xff09; 2、解析解答 3、Python计算代码 import math import scipy.integrate as integrate# 积分区间 # x_min 0.0 # 1 # x_min …

【C语言】操作符相关编程题

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目五&#xff1a; 题目六&#xff1a; 题目七&#xff1a; 题目八&#xff1a; 题目一&#xff1a; 题目&#xff1a;不创建临时变量&#xff0c;交换两个数…

第一届 _帕鲁杯_ - CTF挑战赛

Mis 签到 题目附件&#xff1a; 27880 30693 25915 21892 38450 23454 39564 23460 21457 36865 112 108 98 99 116 102 33719 21462 21069 27573 102 108 97 103 20851 27880 79 110 101 45 70 111 120 23433 20840 22242 38431 22238 22797 112 108 98 99 116 102 33719 2…

Spring Boot集成zipkin快速入门Demo

1.什么zipkin Zipkin是一款开源的分布式实时数据追踪系统&#xff08;Distributed Tracking System&#xff09;&#xff0c;基于 Google Dapper的论文设计而来&#xff0c;由 Twitter 公司开发贡献。其主要功能是聚集来自各个异构系统的实时监控数据。Zipkin默认支持Http协议&…

提取出图像的感兴趣区域

这是我们的原图像 将图像的数值统计后进行条形图展示 import matplotlib.pyplot as plt from PIL import Image import numpy as np# 图像路径 image_path r"D:\My Data\Figure\OIP.jpg"# 打开图像 image Image.open(image_path)# 将图像转换为numpy数组 image_ar…

Redis持久化策略揭秘:如何实现高可用!

【更多精彩内容,欢迎关注小米的微信公众号“软件求生”】 大家好!我是你们的小米,很高兴和大家分享Redis的持久化知识。Redis作为一款强大的内存数据库,经常被用于缓存和存储临时数据。然而,在很多场景中,我们希望Redis的数据能够持久保存,以备不时之需。那么,Redis如…

SpringBoot 操作 Redis

导入对应版本的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>修改配置文件中的信息 spring:redis:host: 127.0.0.1port: 8888注意: 我这里 xsh…

SVD奇异值分解原理及应用

-------------------------------------------------------------------------------------------------------------------------------- 首先说明&#xff1a;本文的内容来自百家号“人工智能遇见磐创”大佬的整理&#xff0c;感谢原作者&#xff08;本文在原作者的基础上按…

影响钕铁硼磁钢性能的因素及方法

钕铁硼永磁材料自问世以来&#xff0c;就以其优越的磁性能而备受关注&#xff0c;被称为“磁王“&#xff0c;在市场需求的不断地增长下&#xff0c;钕铁硼生产工艺及磁体性能也不断发展和提升。我们一般用剩磁、矫顽力和最大磁能积这几个指标来衡量磁性材料的磁性能。 剩磁 B…

三. TensorRT基础入门-TensorRT简介

目录 前言0. 简述1. 什么是TensorRT2. TensorRT的工作流介绍3. TensorRT的一些限制总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习课程第三章—TensorRT 基础入门&#xf…

2024年3月电风扇家电线上电商(京东天猫淘宝)销售数据排行榜

鲸参谋监测的线上电商&#xff08;京东天猫淘宝&#xff09;平台3月份的电风扇家电销售数据已出炉&#xff01; 根据鲸参谋数据显示&#xff0c;今年3月份&#xff0c;电风扇市场呈现出稳步增长态势。在线上电商平台上电风扇总销量累计约226万件&#xff0c;环比上个月上涨了2…

前程贷v6.5系统测试报告

1.引言部分 1&#xff0e;1 项目背景 本测试报告的具体编写目的&#xff0c;指出预期的读者范围。(3-4句) 项目描述 &#xff08;项目内容&#xff0c;用户需求&#xff09; 本测试报告为**&#xff08;系统名称&#xff09;**系统测试报告&#xff1b;本报告目的在于总结测试…

可平滑替代FTP的传输方案,需要具备哪些特质?

随着技术的发展和网络安全需求的提升&#xff0c;传统的FTP受安全性和效率方面的局限性&#xff0c;已经逐渐不能满足现代企业的需求。因此&#xff0c;许多企业和组织开始寻找替代FTP的方案&#xff0c;以提高文件传输的安全性、效率和便捷性。FTP传输存在的弊端及不足主要包括…

洛谷 A+B 问题 python

题目描述 输入两个整数 a,b&#xff0c;输出它们的和 输入格式 两个以空格分开的整数&#xff08;不是输入两个input&#xff08;&#xff09;解决&#xff09;。 输出格式 一个整数。 输入输出样例 输入 20 30 输出 50 这个问题的难点就是在于python当中进行两个输入数字…

JavaScript-3.DOM

通过HTML DOM,可以访问JavaScript HTML文档中的所有元素 DOM(Document Object Model) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。将网页内的元素封装成一个对象,并建立元素的层级关系,形似一棵树,称为DOM树。 通过可编程的对象模型,…