ElementUI使用v-if控制tab标签显示遇到的Duplicate keys detected: 'xxx'问题
今天工作遇到一个问题:
需求背景:页面中有几个tab,需要根据登录用户的权限控制tab标签的显示与隐藏 。
<el-tabs @tab-click="handleClick" v-model="activeTabName" ref="tabs" >
<el-tab-pane label="用户管理" name="first" ref="first" >...</el-tab-pane>
<el-tab-pane label="配置管理" name="second" ref="second">...</el-tab-pane>
<el-tab-pane label="角色管理" name="third" ref="third">...</el-tab-pane>
<el-tab-pane label="定时任务补偿" name="fourth" ref="fourth" >...</el-tab-pane>
</el-tabs>
解决方案一:由于前端用的是VUE框架,看到需求,第一个想到的是使用v-show来解决,但是在实际操作中,v-show并没有达到预期效果。
v-show:是通过display:none/block来隐藏/显示<el-tab-pane>标签里边的内容的,但本身并不会隐藏该tab标签。
而且这样做还有一个弊端:如下图,我在“用户管理”添加了v-show=false,此时“用户管理”tab标签下的内容没有显示,
当我点击“配置管理”标签,然后再点“用户管理”标签,猜猜会发生什么?“用户管理”标签下的内容显示了,可是我明明用v-show隐藏了。
原因其实很简单,标签的切换实际上ElementUI是控制display:none/block来实现的,当你从“配置管理”标签切换回“用户管理”标签,
“用户管理”标签的style属性会重新刷新为display:block。与Echarts图表结合使用极为不友好。
<el-tabs @tab-click="handleClick" v-model="activeTabName" ref="tabs" >
<el-tab-pane v-show="false" label="用户管理" name="first" ref="first" >...</el-tab-pane>
<el-tab-pane label="配置管理" name="second" ref="second">...</el-tab-pane>
<el-tab-pane label="角色管理" name="third" ref="third">...</el-tab-pane>
<el-tab-pane label="定时任务补偿" name="fourth" ref="fourth" >...</el-tab-pane>
</el-tabs>
解决方案二:之后使用v-if来控制tab标签的显示与隐藏,这次达成了预期效果。
正当我要提交代码时,控制台无情的给了我一巴掌,小伙咋急个嘛呀,按F12打开控制台,看看老娘给你发的消息:
Duplicate keys detected: 'tab-xxx'. This may cause an update error.
这句话的大概意思就是告诉你:你的是<el-tab-pane>中name属性值为xxx的key重复了,如果你非要这样做,那你的任何关于这个标签的操作都不会更新里边的内容。
xxx所代表的就是<el-tab-pane>中name属性的值。比如<el-tab-pane name="first">
问题步骤重现:
定义了一个数组,刚开始里边存的都是true,也就是刚进入页面的时候下面4个标签都是显示的
this.test = [true,true,true,true];
然后在VUE mounted函数里获取登录用户的用户名及权限,来重新给数组赋值
比如用户郭靖大侠的权限是只能访问用户管理标签,那么test = [true,false,false,false];
然后刷新页面就会报错,问题是解决了,但具体原因我只知道个大概,不是很清楚,知道的小伙伴留个言吧o(^▽^)o
<el-tabs @tab-click="handleClick" v-model="activeTabName" ref="tabs" >
<el-tab-pane v-if="test[0]" label="用户管理" name="first" ref="first" >...</el-tab-pane>
<el-tab-pane v-if="test[1]" label="配置管理" name="second" ref="second">...</el-tab-pane>
<el-tab-pane v-if="test[2]" label="角色管理" name="third" ref="third">...</el-tab-pane>
<el-tab-pane v-if="test[3]" label="定时任务补偿" name="fourth" ref="fourth" >...</el-tab-pane>
</el-tabs>
打脸方案二之解决方案三:为每一个tab标签手动添加key值
<el-tabs @tab-click="handleClick" v-model="activeTabName" ref="tabs" >
<el-tab-pane :key="0" label="用户管理" name="first" ref="first" >...</el-tab-pane>
<el-tab-pane :key="1" label="配置管理" name="second" ref="second"></el-tab-pane>
<el-tab-pane :key="2" label="角色管理" name="third" ref="third"></el-tab-pane>
<el-tab-pane :key="3" label="定时任务补偿" name="fourth" ref="fourth" ></el-tab-pane>
</el-tabs>
总结:
1.如果程序报错Duplicate keys detected: 'tab-xxx'. This may cause an update error.八成是key重复了,首先检查一下v-for循环的key是否有问题
2.在<el-tab-pane>尽量不使用v-show控制标签的显示,如果和Echarts图表一起使用的话会极为不友好的,至于为什么我就不多说了,如果坑的自然明白哈。
3.在<el-tab-pane>使用v-if可能会出现key重复问题,这样会导致这个tab无法更新,如果这个问题不解决,同样Echarts图表不会更新,这个问题解决后就就可以更新里边的内容了。
我个人认为这个解决方案并不是很好,希望有人能提出更好的方法,不足之处请大家指点,如果转载请在文章开头附上原文章链接。
ElementUI使用v-if控制tab标签显示遇到的Duplicate keys detected: 'xxx'问题的更多相关文章
- NgStyle和NgIf控制HTML标签显示的区别
通常web开发者会选择将元素样式属性display设为none来隐藏目标元素.采用这种方式,这些元素虽然不可见却仍然保存在DOM中,这样带来的好处是,如果元素不久就需要再次显示,组件不需要重新被初始化 ...
- [转]Form中控制Tab画布不同标签间切换的方法
转自:http://yedward.net/?id=68 Form中一般常用的画布类型包括content.stacked.tab这三种,其实content类型的画布是每一个form都必须有的,而且只能 ...
- tab标签切换(无炫效果,简单的显示隐藏)
从最简单的效果开始写起,一个简单的JQ写出tab切换效果,很静态,没有任何的轮转特效,单纯的点击标签显示区域块. 附上代码: HTML: <div class="wrapper&quo ...
- 在Bootstrap开发中解决Tab标签页切换图表显示问题
在做响应式页面的时候,往往需要考虑更多尺寸设备的界面兼容性,一般不能写死像素,以便能够使得界面元素能够根据设备的不同进行动态调整,但往往有时候还是碰到一些问题,如Tab标签第一页面正常显示,但是切换其 ...
- Android(java)学习笔记129:Tab标签的使用
1.案例1---TabProject (1)首先是main.xml文件: <?xml version="1.0" encoding="utf-8"?> ...
- Bootstrap V3使用Tab标签
Bootstrap V3使用Tab标签 >>>>>>>>>>>>>>>>>>>> ...
- Android UI--ViewPager扩展Tab标签指示
Android UI--ViewPager扩展Tab标签指示 2013年8月30日出来冒冒泡 ViewPager这个控件已经不算是陌生的了,各种玩Android的小伙伴们都有发表相应的文章来讲它.我看 ...
- Android(java)学习笔记71:Tab标签的使用
1. 案例1---TabProject (1)首先是main.xml文件: <?xml version="1.0" encoding="utf-8"?&g ...
- TabActivity中的Tab标签详细设置
参考链接: http://www.iteye.com/topic/602737 这个写的很不错,我是跟着一步步写下来的,不过到最后也遇到了麻烦,就是不能将Tab标签的文字和图片分开,始终是重合的,而且 ...
随机推荐
- TestNG在Eclipse中运行的几种方法
目录 1 在Eclipse Outline视图中,点右键run as TestNG Test (不推荐) 2 在Eclipse类编辑界面,直接点击右键run as TestNG Test 3 通过Te ...
- 【Python-Django】浏览器同源策略
1995年,同源政策由 Netscape 公司引入浏览器.目前,所有浏览器都实行这个政策. 同源策略是浏览器的一个安全功能,不同源的客户端脚本(js文件)在没有明确授权的情况下,不能读写对方资源.只有 ...
- 消息中间件——RabbitMQ(一)Windows/Linux环境搭建(完整版)
前言 最近在学习消息中间件--RabbitMQ,打算把这个学习过程记录下来.此章主要介绍环境搭建.此次主要是单机搭建(条件有限),包括在Windows.Linux环境下的搭建,以及RabbitMQ的监 ...
- 设置Myeclipse的jvm内存参数
Myeclipse经常会遇到内存溢出和Gc开销过大的情况,这时候就需要修改Myeclipse的Jvm内存参数 修改如下:(使用Extjs做公司大项目时候,不要让项目Builders的Javascrip ...
- FTP服务端部署
FTP服务端搭建(本地用户登入:使用本地用户和密码登入)1.文件配置:vsftpd.conf: 主配置文件ftpusers: 指定哪些用户不能访问FTP服务器user_list: 指定的用户是否可以访 ...
- 信息收集框架——recon-ng
背景:在渗透测试前期做攻击面发现(信息收集)时候往往需要用到很多工具,最后再将搜集到的信息汇总到一块. 现在有这样一个现成的框架,里面集成了许多信息收集模块.信息存储数据库.以及报告 ...
- 2019牛客多校训练第三场H.Magic Line(思维)
题目传送门 大致题意: 输入测试用例个数T,输入点的个数n(n为偶数),再分别输入n个不同的点的坐标,要求输出四个整数x1,y1,x2,y2,表示有一条经过点(x1,y1),(x2,y2)的直线将该二 ...
- 对Java中HashCode方法的深入思考
前言 最近在学习 Go 语言,Go 语言中有指针对象,一个指针变量指向了一个值的内存地址.学习过 C 语言的猿友应该都知道指针的概念.Go 语言语法与 C 相近,可以说是类 C 的编程语言,所以 Go ...
- 世界十大OTA公司盘点
世界十大OTA公司盘点 文/刘照慧(执惠旅游联合创始人,首发百度百家) 全球在线旅游公司(OTA)经过多年发展,已经形成较为成熟的商业模式,各大巨头跑马圈地,格局初现, 这两篇文章就梳理出全球按市值( ...
- idea+Spring+Mybatis+jersey+jetty构建一个简单的web项目
一.先使用idea创建一个maven项目. 二.引入jar包,修改pom.xml <dependencies> <dependency> <groupId>org. ...