vue之tab的变化

Vue--简单实现微博发布功能和实现tab栏 1、微博发布功能 html 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> 阅读详情

state.js

 options: [],//存放tab页的容器
  activeIndex: '',////激活的tab页路由路径
  showName: 'show',//tab页的标题
  role: ""//用来区分是否是因为左侧菜单被点击造成的路由路径发生改变,是:pass;不是:nopass

getters.js

getShowName:(state) => {
  		return state.showName;
  	},
  	getOptions:(state) => {
  		return state.options;
  	},
  	getRole:(state) =>{
  		return state.role;
  	}

mutations.js

// 添加tabs(data包含了路由路径跟tab页名字)
	add_tabs(state, data) {
		this.state.options.push(data);
	},
	// 删除tabs	(route是路由路径)
	delete_tabs(state, route) {
		let index = 0;
		for (let option of state.options) {
			if (option.route === route) {
				break;
			}
			index++;
		}
		this.state.options.splice(index, 1); //删除options里面下标为Index的一个数
	},
	// 设置当前激活的tab
	set_active_index(state, index) {
		this.state.activeIndex = index;
	},
	//设置tab页显示标题
	set_showName(state, name) {
		this.state.showName = name;
	},
	set_role(state, role) {
		this.state.role = role;
	}

中心主体AppMain.vue(核心代码在此处)

<template>
	<el-container class="main-container">
		<el-aside v-bind:class="asideClass">
			<LeftNav></LeftNav>
		</el-aside>
		<el-container>
			<el-header class="main-header">
				<TopNav></TopNav>
			</el-header>
			<div class="template-tabs">
				<el-tabs v-model="activeIndex" type="border-card" closable @tab-click="tabClick" @tab-remove="tabRemove">
					<el-tab-pane :key="item.name" v-for="(item, index) in options" :label="item.name" :name="item.route">
					</el-tab-pane>
				</el-tabs>
			</div>
			<el-main class="main-center">
				<router-view></router-view>
			</el-main>
		</el-container>
	</el-container>
</template>

<script>
	// 导入组件
	import TopNav from '@/components/TopNav.vue'
	import LeftNav from '@/components/LeftNav.vue'

	// 导出模块
	export default {
		data(){
			return {
				asideClass:'main-aside'
			}
		},
		components: {
			TopNav,LeftNav
		},
		created(){//钩子函数 对值重新进行渲染
			//获取Bus里存的值
			this.$root.Bus.$on('collapsed-side-click',(v)=>{
				this.asideClass=v? 'main-aside-collapsed' : 'main-aside'
			})
		},
		methods: {
            // tab切换时,动态的切换路由
            tabClick(tab) {
							 // v-model="activeIndex"是路由路径
                let path = this.activeIndex;
                this.$router.push({ path: path });
								this.$store.commit('set_role',"nopass");
            },
            tabRemove(targetName) {
							// console.log(targetName);targetName是路由路径
								this.$store.commit('set_role',"nopass");
							  // let tabs = this.editableTabs;
                this.$store.commit('delete_tabs', targetName);
								// 如果激活tab页被关闭,那么需要激活别的tab页,最后一个tab页被关闭,那么跳转主界面
                if (this.activeIndex === targetName) {
					// 设置当前激活的路由
                    if (this.options && this.options.length >= 1) {
                        this.$store.commit('set_active_index', this.options[this.options.length - 1].route);
                        this.$router.push({ path: this.activeIndex });
                    } 
					   else {
                        this.$router.push({ path: '/AppMain' });
                    }
                }
            }
        },
		 watch: {
			'$route'(to) {
				// 只要路由发生改变,就会触发此事件(点击左侧菜单时会触发,删除右侧tab页会触发,切换右侧已存在的tab页会触发)
						let role=this.$store.state.role;
						let showName=this.$store.getters.getShowName
						let flag = false;//判断是否页面中是否已经存在该路由下的tab页
						//options记录当前页面中已存在的tab页
						for (let option of this.options) {
						//用名称匹配,如果存在即将对应的tab页设置为active显示桌面前端
							if (option.name === showName) {
								flag = true;
								this.$store.commit('set_active_index',  to.path);
								break;
							}
						}
						//如果不存在,则新增tab页,再将新增的tab页设置为active显示在桌面前端
						// if(role!='nopass'){}
						if(role=='pass'){
							if (!flag) {
								this.$store.commit('add_tabs', { route: to.path, name: showName});
								this.$store.commit('set_active_index',  to.path);
							}
						}
			}
		},
		computed: {
			options() {
				return this.$store.state.options;
			},
			//动态设置及获取当前激活的tab页
			activeIndex: {
				get() {
					return this.$store.state.activeIndex;
				},
				set(val) {
					this.$store.commit('set_active_index', val);
				}
			}
		}
	};
</script>
<style type="text/css">
	.el-tabs--border-card>.el-tabs__content {
		padding: 0px;
	}
</style>
<style scoped>
	.main-container {
		height: 100%;
		width: 100%;
		box-sizing: border-box;
	}

	.main-aside-collapsed {
		/* 在CSS中,通过对某一样式声明! important ,可以更改默认的CSS样式优先级规则,使该条样式属性声明具有最高优先级 */
		width: 64px !important;
		height: 100%;
		background-color: #334157;
		margin: 0px;
	}

	.main-aside {
		width: 240px !important;
		height: 100%;
		background-color: #334157;
		margin: 0px;
	}

	.main-header,
	.main-center {
		padding: 0px;
		border-left: 2px solid #333;
	}
</style>


左侧菜单LeftNav.vue

<template>
	<el-menu router :default-active="$route.path" default-active="2" class="el-menu-vertical-demo" background-color="#334157" text-color="#fff"
	 active-text-color="#ffd04b" :collapse="collapsed">
		<!-- <el-menu default-active="2" :collapse="collapsed" collapse-transition router :default-active="$route.path" unique-opened class="el-menu-vertical-demo" background-color="#334157" text-color="#fff" active-text-color="#ffd04b"> -->
		<div class="logobox">
			<img class="logoimg" src="../assets/img/logo.png" alt="">
		</div>
		<el-submenu :key="'id_'+m.treeNodeId" :index="'id_'+m.treeNodeId" v-for="m in menus">
			<template slot="title">
				<i :class="m.icon"></i>
				<span>{{m.treeNodeName}}</span>
			</template>
			<el-menu-item :key="'id_'+m2.treeNodeId" :index="m2.url" @click="showName(m2.treeNodeName)" v-for="m2 in m.children">
				<template slot="title">
					<i :class="m2.icon"></i>
					<span>{{m2.treeNodeName}}</span>
				</template>
			</el-menu-item>
		</el-submenu>

	</el-menu>
</template>
<script>
	export default {
		data() {
			return {
				//默认不折叠
				collapsed: false,
				menus:[]
			}
		},
		created() {
			// v就是从Vue总线Bus获取的变量值
			this.$root.Bus.$on('collapsed-side-click', (v) => {
				this.collapsed = v;
			});
			// 左侧树形菜单加载
			let url = this.axios.urls.SYSTEM_MENU_TREE;
			this.axios.post(url, this.ruleForm).then((response) => {
				console.log(response);
				this.menus = response.data.result;

			}).catch(function(error) {
				console.log(error);
			});
		},
		methods: {
			showName(name) {
				// 把菜单名称放进去,当成tab页的名称
				this.$store.commit('set_showName', name);
				this.$store.commit('set_role', "pass");
			}
		}
	}
</script>
<style>
	.el-menu-vertical-demo:not(.el-menu--collapse) {
		width: 240px;
		min-height: 400px;
	}

	.el-menu-vertical-demo:not(.el-menu--collapse) {
		border: none;
		text-align: left;
	}

	.el-menu-item-group__title {
		padding: 0px;
	}

	.el-menu-bg {
		background-color: #1f2d3d !important;
	}

	.el-menu {
		border: none;
	}

	.logobox {
		height: 40px;
		line-height: 40px;
		color: #9d9d9d;
		font-size: 20px;
		text-align: center;
		padding: 20px 0px;
	}

	.logoimg {
		height: 40px;
	}
</style>



评论管理Comment.vue

<template>
	<div>
		<el-tabs :tab-position="tabPosition" style="height: 200px;">
			<el-tab-pane label="游客评论">游客评论管理</el-tab-pane>
			<el-tab-pane label="普通会员评论">普通会员评论管理</el-tab-pane>
			<el-tab-pane label="VIP会员评论">VIP会员评论管理</el-tab-pane>
			<el-tab-pane label="SVIP会员评论">SVIP会员评论管理</el-tab-pane>
		</el-tabs>
	</div>
</template>

<script>
	export default {
		data() {
			return {
				tabPosition: '评论管理'
			};
		}
	}
</script>

<style>

</style>

路由配置

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import AppMain from '@/components/AppMain'
import Articles from '@/views/sys/Articles'
import Login from '@/views/Login'
import VuexPage1 from '@/views/sys/VuexPage1'
import VuexPage2 from '@/views/sys/VuexPage2'
import Comment from '@/views/sys/Comment'

Vue.use(Router)

export default new Router({
	routes: [{
			path: '/',
			name: 'Login',
			component: Login
		},
		{
			path: '/Login',
			name: 'Login',
			component: Login
		},
		{
			path: '/AppMain',
			name: 'AppMain',
			component: AppMain,
			children: [{
				path:'/sys/Articles',
				name:'/Articles',
				component:Articles

			},{
				path:'/sys/VuexPage1',
				name:'/VuexPage1',
				component:VuexPage1
			},{
				path:'/sys/VuexPage2',
				name:'/VuexPage2',
				component:VuexPage2
			},{
				path:'/sys/Comment',
				name:'/Comment',
				component:Comment
			}
			]
		}
	]
})



效果展示
在这里插入图片描述

vue移动端手写tab栏切换 复制代码结构----供自己直接使用: <ul class="tabsbox"> <li> <a @click="cur=0" :class="{active:cur==0}">全部</a> **//注意a标签中的href必须去掉,否则路由出现问题** </li> <li>... 阅读详情

相关推荐

STM32与K210串口通信

这篇文章是为了填上一篇埋下的坑,k210和STM32通过串口通信,我是采用数据包的形式发送数据的,因为K210发送的数据有几种,采用数据包的形式发送比较安全。本文代码运行的平台是STM32F103C8T6和K210 Dock,只涉及到K210发送数据给STM32,stm32将接受到的数据显示到0.96寸OLED屏上。

qq_70715693的博客 3万+

vue的 el-tabs选项卡判断是否切换

el-tabs选项卡判断是否切换

qq_42740298的博客 3023

STM32H750VBT6在Keil5下载失败?5步搞定Flash Download Failed Cortex-M7错误

本文针对STM32H750VBT6在Keil5中遇到的“Flash Download Failed - Cortex-M7”错误,提供了系统性的五步排查法。从硬件连接到驱动检查,再到核心的Flash算法配置、链接脚本核对,以及芯片保护状态等深度排查,帮助开发者快速定位并解决下载失败问题,尤其适用于处理内部Flash与外部QSPI Flash的混合应用场景。

weixin_29239279的博客 481

vue3 el-tabs 点击触发事件

【代码】vue3 el-tabs 点击触发事件。

weixin_60906876的博客 3239

4. PCIe 接口时序

在上一篇中,大致介绍IPcore接口。总的来说接口如下图数据的接收和发送通过transmitTLPinterface和ReceiveTLPinterface。收发数据的时序也只是描述这几个接口的关系。从手册上截取PCIex1的接口时序。

jjinl的专栏 6118

Neo4j Desktop新手必看:3分钟搞定CSV数据导入(附常见报错解决方案)

本文详细介绍了在Neo4j Desktop中高效导入CSV数据的三种主流方法,包括图形化界面操作、命令行批量导入和Python驱动编程导入,并提供了常见报错解决方案和性能优化技巧,帮助新手快速构建知识图谱。

lambda的博客 647

vue的tab栏切换

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Doc

deep_zhuheihei的博客 812

OpenStack [ compute_id ] 设计上的小缺陷

而 nova 代码中硬编码(或默认配置)将 compute_id 放在 site-packages 目录,属于 设计上的小缺陷—— 把 “库安装目录” 和 “运行时数据目录” 混在一起了,才导致需要临时调整这个目录的权限。# 配置项说明:node_identity_file 是 nova 用于指定节点标识文件路径的官方配置项,优先级高于代码中的默认路径。自定义 compute_id 路径,指向 /var/lib/nova/ 目录下的 compute_id 文件;

求知若渴,虚心若愚。 491

Vue中根据不同状态切换 Tabs 标签页内容

可以控制当前激活的标签页(即默认展示出来的页面)。组件用于包含多个标签页,每个标签页由。

明思齐的博客 8363

把 SM30 用顺:从表设计到权限与传输,全面掌握 SAP Table Maintenance Generator

摘要 SAP的Table Maintenance Generator(TMG)是为配置表维护需求设计的经典工具,能够生成标准化的维护对话框(SM30)。它支持单表、维护视图(多表关联)和视图簇(导航式维护)三种维护对象类型。使用TMG前需注意三个关键设置:1)表维护权限选项;2)交付类(决定数据传输行为);3)客户端字段配置。通过SE54/SE11生成维护对话框时,需选择维护类型(一步/两步)和记录例程(控制传输)。TMG生成的对象包含函数组、屏幕和处理模块,但部分标准框架不可修改。实际应用中,可通过参数事

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 176

番外篇 | 复现HIC-YOLOv5,助力小目标物体的检测

在本文中提出了一种改进的YOLOv5算法:HIC-YOLOv5,用于小目标检测,具有更好的性能和较低的计算成本。🌈

小哥谈 1129

spa项目开发之vue+elementUi实现tab页

当点击一个菜单栏时,出一个tab 具体思路: ①当点击左侧导航菜单时,获取菜单名,把它设为tab页 的名字,并且标记role为pass(这是作为新增tab页时的判断依据) methods: { showName(name) { // 把菜单名称放进去,当成tab页的名称 this.$store.commit('set_showName', name) ...

weixin_45111741的博客 3390

微信小程序 - 强力解决wx.getLocation定位不准的问题,如何修正微信小程序wx.getLocation获取用户位置信息不准确解决办法(高精度定位还是不够精准,定位不准有偏差,彻底消除误差)

如何解决getLocation定位偏差的问题?微信小程序API—wx.getLocation定位不准的问题,微信小程序wx.getLocation获取用户位置信息不准确解决办法,解决微信小程序wx.getLocation定位不准的问题,定位不准确,实际位置偏差大,相差几公里,微信小程序wx.getLocation获取用户位置信息不准确解决办法,关于微信小程序获取准确定位的方法及解决定位不准确的问题,偏差太多好几百米,wx.getLocation 返回定位精度不准问题,如何消除这个误差,开启高精度定位依旧有误

🏆 前端领域优质创作者 1万+

Vue tab切换内容变化效果

VUE中实现Tab切换方式,需要用到以下知识点: 1、动态绑定class,用于导航高亮显示 :class="{active:cur==0}"复制代码 2、click点击事件,用于改变当前cur的值 @click="cur=0" 3、使用v-show="cur==0",用于判断当前cur的值为0时,显示,也就是点击那个导航,改变cur的值,对应的内容也将显示出来。 Tab导航部分内容: <div> <ul> <li @click="cu

m0_60153106的博客 940

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

vue的底部tab切换 以及图片的变化 两种方式

<template> <div class="footbar"> <router-link to='/' tag='div'> <span> <img :src="this.$route.path=='路径'?'选中的图片':'未选中的图片'" alt=""> </...

jdBug 2970

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

spa项目开发之tab页实现

tab页实现思路及细节 实现思路及细节 1、利用前面博客所讲的Vuex的知识;定义几个变量 Options:存放tab页对象的容器(主要是路由路径以及tab页的名字) activeIndex:被激活的tab页路由路径 showName:tab页的标题 Role:用来区分是否是因为左侧菜单被点击造成的路由路径发生改变; 是:pass;不是:nopass 2、左侧导航菜单绑定点击事...

今晚几点睡的博客 345

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

echarts vue项目tab切换后 当浏览器分辨率变化后 隐藏tab的echarts无法获取高度

解决办法: 监听路由 当路由跳到隐藏页面的时候 手动获取div高度 然后调用echarts的resize方法 data () { return { myChart:null, } }, watch:{ $route:{ handler(){ let _this=this; var width = $("#collect").width(); var height = $("#collect")

lwc_pubg的博客 367

vue 双层tab切换

vue 双层tab切换实现

凡尘 2065

Vue中父子页面值的监听(具体场景:根据父页面tab的切换带动值的变动,子页面通过监听值得变化来显示不同的内容)

1.父页面的相关代码如下: <!--父页面--> <view class="check"> <!--父页面切换tab标签代码--> <van-tabs class="tabs" :class="scrollTop > 44 ? 'tabSticky' :'' " @click="onClick"> <van-...

qq_42751248的博客 2042

vue如何获取组件的动态长宽 useResizeObserver用法

逻辑是当页面初始化后,tab的ref对象监听到有数据了,就调用vue的useResizeObserver方法来绑定,如果tab大小变了,就会调用getData方法,具体操作逻辑不写了,就写了个console,可以看下打印的就是tab的宽度。

wnk1997的博客 1669

实现简单的tab切换--滚动切换,点击切换

tab切换时项目中是项目中经常用到的,把这个功能记录下来,共享 <!-- 思路: 1,右侧3个tab导航名称。注意:2种样式,未选中的样式,选中的那个改变样式 2. 左侧对应tab的内容。 注意:数据格式,循环出来的 [ title: '导航', subtitle: '线性图标', icons: [ { url: '../../a.svg', name: '张' },

qq_40055200的博客 4309

小程序封装切换栏tab组件,实现点击tab样式随着选中切换动态变化

uniapp封装小程序组件,点击切换选中的动态tab效果

qdd优快云zh的博客 601

vue $route监听

watch: { $route(to,from) { } } 在任意组件中监听路由,当路由发生变化时,可进行某些操作。 应用场景: 当点击菜单中发生路由变化时,需要新增该菜单的tab页,此时就可以在tab页相关组件中监听路由变化。...

xiao1215fei的专栏 4574

Vue-- 监听路由变化,数据无法更新?

之前写的Vue项目,有个问题困扰了好久。新闻板块有推荐、精华、最新等几个Tab,设想通过切换Tab,改变路由参数(get/news/:tab)去获取对应数据,然后渲染到页面(用的是同一套组件),问题来了:当切换Tab时,数据并没有更新,后来看了Vue-router官网,有这么一句话:提醒一下,当使用路由参数时,例如从 /user/foo 导航到 user/bar,原来的组件实例会被复用。因为两个路

likeuzi的博客 2111

elementui tab标签管理路由页面_this

vuex state:路由栈、激活状态 mutations: 添加、移除、修改激活状态watchmountedtab 切换、移除两个方法。

2401_87555332的博客 488
上一篇: 初步了解shiro
下一篇: shiro身份认证
water_java
博客等级 码龄7年 9粉丝 124原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值