引言

Vue是现在前端最流行的框架之一,作为前端开发人员应该要熟练的掌握它,如果你是打算学习Vue的开发流程,那么来吧,明哥带你快速上手、带你飞!
即使你并非前端开发人员,对前端的开发流程进行一定的了解也是很有必要的,谁也不确定公司以后会不会让我做前端去,做些简单的实例既不需要花费很多时间,也可以提高自己的自信和成就感,所以跟着明哥走,没有错,来吧!

导航

✪  Vue开发实例目录总索引
上一篇【15】动态路由的实现
下一篇【17】实现用户列表

先创建一个标签

创建vue页面 Tabs.vue,内容如下:

<template><div><el-tabs v-model="editableTabsValue" type="card" closable><el-tab-pane:key="item.name"v-for="item in editableTabs":label="item.title":name="item.name"></el-tab-pane></el-tabs></div></template><script>export default {name: "Tabs.vue",data() {return {editableTabsValue: '1',editableTabs: [{title: '首页',name: '1',content: '首页'},{title: 'Tab 1',name: '2',content: 'Tab 1 content'},{title: 'Tab 2',name: '3',content: 'Tab 2 content'}],tabIndex: 1}}}
</script><style scoped></style>

在Index.vue页面的路由锚点 router-view 上方引入 此页面

页面效果

点击菜单打开新的标签页

将标签数据作为全局使用

  1. 将数据放到store.js中,作为全局
const state ={username: '明世隐',userState:0,menu_data:[],isLoadRoute:false,editableTabsValue: '1',editableTabs: [{title: '首页',name: '首页',content: '首页'},{title: 'Tab 1',name: '2',content: 'Tab 1 content'},{title: 'Tab 2',name: '3',content: 'Tab 2 content'}]
}
  1. Tabs.vue中的这两个数据editableTabsValue和editableTabs就从store中获取

注意:
如果你的在data中这样写,可能会无法正常显示,建议用computed 方式来写。

<script>export default {name: "Tabs.vue",data() {return {}},computed:{editableTabsValue:{get(){return this.$store.state.editableTabsValue;},set(val){this.$store.state.editableTabsValue=val;}},editableTabs:{get(){return this.$store.state.editableTabs;},set(val){this.$store.state.editableTabs=val;}}}}
</script>
  1. 效果是一样的

菜单点击增加标签页

  1. 在storejs中将写死的数据editableTabs 内容删除,只剩下首页的那条
editableTabs: [{title: '首页',name: '1',content: '首页'}
]
  1. 在mutations添加 editableTabs 数据变更的方法 addEditableTabs

因为我定义的菜单数据的时候,没有title属性,所以这里我都用title来代表

addEditableTabs(state,tab){state.editableTabs.push({title: tab.name,name: tab.name})state.editableTabsValue = tab.name
}
  1. 在给菜单增加点事件

在methods 加入方法,提交菜单表更消息到storejs即可。

selectMenu(item){this.$store.commit("addEditableTabs",item);
}
  1. 效果图

处理重复标签

就目前的情况,再次点击菜单页,会重复创建新的标签页

在addEditableTabs 中判断,如果数据中已经有了,则不重复添加,只需切换即可

addEditableTabs(state,tab){//根据tab.name 查询 editableTabs 是否已经存在let idx = state.editableTabs.findIndex(item=>item.name===tab.name)if(idx===-1){//不存在则可以添加state.editableTabs.push({title: tab.name,name: tab.name})}state.editableTabsValue = tab.name
}

效果:

关闭标签页

  1. 标签页添加关闭事件
  2. 编写关闭代码
removeTab(targetName) {let tabs = this.editableTabs;let activeName = this.editableTabsValue;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.editableTabsValue = activeName;this.editableTabs = tabs.filter(tab => tab.name !== targetName);
}

效果图:

点击标签页操作

点击标签页选中菜单

  1. 给el-menu 设置属性 default-active

:default-active=“this.$store.state.editableTabsValue”

  1. 将我原来代码el-menu-item的index设置为"item.name"

:index=“item.name”

  1. 加入路由跳转代码

因原来菜单点击,会根据index属性来跳转,index原来是path(路由地址),现在index属性更改为name了,则跳转不会生效,修改原来的router.js的代码,动态创建路由加入name属性(name:item.name),方便跳转(之前写代码的时候忘记加)。

let oRouters = router.options.routes;
const buildRouter = ()=>{let data = store.state.menu_data;data.forEach(item=>{let new_router = {path:item.path,name:item.name,component:() => import('./components/'+item.component+'.vue')}oRouters[0].children.push(new_router);})router.addRoutes(oRouters)
}
  1. 在刚才编写的selectMenu房子中,加入路由跳转代码(根据name跳转),仅需一行代码即可。
selectMenu(item){//点击菜单跳转路由this.$router.push({name:item.name})this.$store.commit("addEditableTabs",item);
}
  1. 这样就可以实现点击标签页,菜单跟着高亮显示了

点击标签页路由也要跳转

从上图不难发现,点击标签页,标签页下方的页面没有跟着跳转,这也不是我们希望看到的

  1. 在Tabs页面的el-tabs 添加tab-click事件

  1. 添加方法,利用路由的name来跳转
clickTab(target){this.$router.push({name:target.name})
}
  1. 效果

关闭的两个bug

  1. 关闭菜单后,菜单对应的路由没有跟着跳转

仅需在关闭标签的方法removeTab,最后加上以下代码

this.$router.push({name:activeName})
  1. 首页不允许关闭

在关闭标签的方法removeTab ,执行关闭之前,加入以下代码

if(targetName=='首页'){return ;
}
  1. 完整removeTab 代码
removeTab(targetName) {let tabs = this.editableTabs;let activeName = this.editableTabsValue;if(targetName=='首页'){return ;}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.editableTabsValue = activeName;this.editableTabs = tabs.filter(tab => tab.name !== targetName);this.$router.push({name:activeName})
}

小结

这节总结了“ 创建标签页 ”,希望能对大家有所帮助,请各位小伙伴帮忙 【点赞】+【收藏】+ 【评论区打卡】, 如果有兴趣跟小明哥一起学习Java和前端的,【关注一波】不迷路哦。
请到文章下方帮忙【一键三连】谢谢哈!

导航

✪  Vue开发实例目录总索引
上一篇【15】动态路由的实现
下一篇【17】实现用户列表

热门专栏推荐

【1】Java小游戏(俄罗斯方块、植物大战僵尸等)
【2】JavaWeb项目实战(图书管理、宿舍管理等)
【3】JavaScript精彩实例(飞机大战、验证码等)
【4】Java小白入门200例
【5】从零学Java、趣学Java
【6】IDEA从零到精通

Vue开发实例(16)之创建标签页相关推荐

  1. Vue开发实例(15)之动态路由

    引言 Vue是现在前端最流行的框架之一,作为前端开发人员应该要熟练的掌握它,如果你是打算学习Vue的开发流程,那么来吧,明哥带你快速上手.带你飞! 即使你并非前端开发人员,对前端的开发流程进行一定的了 ...

  2. Vue开发实例(17)之实现用户列表

    引言 Vue是现在前端最流行的框架之一,作为前端开发人员应该要熟练的掌握它,如果你是打算学习Vue的开发流程,那么来吧,明哥带你快速上手.带你飞! 即使你并非前端开发人员,对前端的开发流程进行一定的了 ...

  3. 3.vue开发实例演示

    个人博客:http://blog.kunpw.cn/ vue开发实例演示 1.解剖初始化模板 1.1 vue文件 如图所示,对于一个新建的vue文件而言,其中标签分为三个部分: template标签: ...

  4. Vue开发实例(11)之el-menu实现左侧菜单导航

    作者简介 作者名:编程界明世隐 简介:CSDN博客专家,从事软件开发多年,精通Java.JavaScript,博主也是从零开始一步步把学习成长.深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢 ...

  5. Vue开发实例(13)之axios和mockjs的安装与使用

    作者简介 作者名:编程界明世隐 简介:CSDN博客专家,从事软件开发多年,精通Java.JavaScript,博主也是从零开始一步步把学习成长.深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢 ...

  6. Vue开发实例(12)之实现动态左侧菜单导航

    作者简介 作者名:编程界明世隐 简介:CSDN博客专家,从事软件开发多年,精通Java.JavaScript,博主也是从零开始一步步把学习成长.深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢 ...

  7. Vue开发实例(05)之搭建项目主页面头部、导航、主体等页面布局

    作者简介 作者名:编程界明世隐 简介:CSDN博客专家,从事软件开发多年,精通Java.JavaScript,博主也是从零开始一步步把学习成长.深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢 ...

  8. Vue开发实例(09)之按钮的使用

    作者简介 作者名:编程界明世隐 简介:CSDN博客专家,从事软件开发多年,精通Java.JavaScript,博主也是从零开始一步步把学习成长.深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢 ...

  9. Vue开发实例(20)之实现登录功能

    引言 Vue是现在前端最流行的框架之一,作为前端开发人员应该要熟练的掌握它,如果你是打算学习Vue的开发流程,那么来吧,明哥带你快速上手.带你飞! 即使你并非前端开发人员,对前端的开发流程进行一定的了 ...

最新文章

  1. redis4.0.6集群部署(5.0.2版本更新补充)
  2. DllMain使用的注意事项
  3. linux 定时重启mysql_Linux下定时自动重启apache及mysql
  4. 苹果回应中情局攻击事件:许多漏洞已经得到解决
  5. 一文看懂深度学习AutoML和NAS
  6. DDoS高安全性ip服务:解决各种DDoS攻击问题
  7. C++引用作为函数参数
  8. python range从大到小排列_python 十大经典排序算法
  9. 从 Google 代码库找到的好东西【web开发方面】
  10. 做一个消息自动回复,但是回复内容可以在网页上面输入,用input接收,错了,别人有新增选项,本身就是在页面进行新增,页面维护...
  11. sublime text 2/3 快捷键汇总
  12. 2022年申请亳州市发明专利材料,专利说明书摘要写作技巧
  13. 打补丁patch 命令使用
  14. poj 1900 Game
  15. Excel中输入身份证号后三位变成0的情况处理如下
  16. 汇编语言-实验6(学习打卡Day18)
  17. 操作系统复习题最全(复习看它就够了!!!!!
  18. 企业员工全面激励训练整体解决方案 (节选)
  19. 生活随记 - 准备过苦日子咯^_^
  20. Private key 和 Secret key 的区别

热门文章

  1. (原创)Flow数据流的使用
  2. wp网站更换服务器后打不开,WordPress网站修改IP地址后打不开的解决方法
  3. scratch班级名称 电子学会图形化编程scratch等级考试四级真题和答案解析B卷2020-9
  4. 打电话蓝牙耳机什么牌子好?打电话降噪蓝牙耳机推荐
  5. 重度抑郁症患者的脑功能老化加速:来自中国大规模fMRI证据
  6. 国人九大劣根性-读书笔记
  7. myeclipse 生成html文件 调用js,MyEclipse怎么创建一个js文件
  8. c++语言const是什么意思,c++中const关键字
  9. python小游戏——骰子猜大小
  10. 电脑屏幕控制键盘鼠标网络模型