LayUI之选项卡组件

目录

1.完成选项卡功能

1.1二级菜单点击新增选项卡

1.2将二级菜单的名称显示到选项卡上

1.3选项卡重复问题的解决

1.4重名选项卡在被点击时选中

2.LayUI弹出层拓展


1.完成选项卡功能

1.1二级菜单点击新增选项卡

在上篇博客我们已经完成了树形菜单的基础上我们就用昨天的代码为例子。上篇博客的网址:

Kissship的博客——LayUI之树形菜单icon-default.png?t=N7T8https://blog.csdn.net/weixin_74263417/article/details/131668632?spm=1001.2014.3001.5501需求:

点击二级菜单时增加一张选项卡。

第一步:

去LayUI官网Copy一份新增add选项卡的点击事件代码,如下:

然后把触发事件用方法包裹起来放入,如下:

function openTab(){
			  element.tabAdd('demo', {
			        title: '新选项'+ (Math.random()*1000|0) //用于演示
			        ,content: '内容'+ (Math.random()*1000|0)
			        ,id: new Date().getTime() //实际使用一般是规定好的id,这里以时间戳模拟下
			      })
		}

紧接着我们把触发事件放进昨天的a标签中。如下:

加进去之后我们就能正常点击二级菜单添加选项卡了。

效果展示:

1.2将二级菜单的名称显示到选项卡上

先在PermissionDao类加上一个map集合:

Map<String, Object> map = new HashMap<String, Object>();
		map.put("self", p);
		vo.setAttributes(map);

加上了之后我们把点击二级菜单之后,二级菜单的信息传到触发事件中,先传参:

把前面的代码改成:

function openTab(title,content,id){
			  element.tabAdd('demo', {
			        title: title //用于演示
			        ,content: content
			        ,id: id //实际使用一般是规定好的id,这里以时间戳模拟下
			      })
		}

ok完成之后我们还需要在each中把之前的空位符修改,如下:

最后我们就可以尝试输出看有没有其他问题了,效果图如下:

好的我们已经将二级菜单的名称显示在了选项卡上。这时候博主的小手不安分,多点了一下"所有会议",发现我们的选项卡列表又加了一张名为"所有会议"的选项卡!

没错,它们重复了!那么这就衍生出了第三点,我们还需进一步优化我们的代码,让选项卡不能是重复的。

1.3选项卡重复问题的解决

通过浏览器的开发者模式可以看到,第一次点击二级菜单的length为0,但是第二次点击同样的二级菜单它的length值却变成了1,即length值是在变动的,所以我们需要从二级菜单的length值入手解决问题,修改后的代码如下:

function openTab(title,content,id){
	 		var $node = $('li[lay-id="'+id+'"]');
	 		console.log($node);
	 		if($node.length == 0){//如果点击的二级菜单length为0,那么就能打开一个新的选项卡
	 			element.tabAdd('demo', {
			        title: title //用于演示
			        ,content: content
			        ,id: id //实际使用一般是规定好的id,这里以时间戳模拟下
			      })
	 		}
		}

这时我们就可以看一下效果了:

但是此时又有新的问题出现了,当我们已经添加过的选项卡所对应的二级菜单后,再次点击其他已经添加的二级菜单,我们的窗口主体部分并没有跳转到我们二次操作所对应的选项卡上,所以又衍生出了下一个问题,需要重名的选项卡在被点击时选中。

1.4重名选项卡在被点击时选中

这里在我们的LayUI官网上,可以看到解决问题的办法,如下:

接着我们把它copy到我们的触击事件中,如下:

接着我们再看一下问题解决没有,效果图如下:

最终代码如下:

main.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ include file="common/header.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>后台主页</title>
</head>
<body>
	<div class="layui-layout layui-layout-admin">
		<div class="layui-header">
			<div class="layui-logo layui-hide-xs layui-bg-black">狂牙大行动</div>
			<!-- 头部区域(可配合layui 已有的水平导航) -->
			<ul class="layui-nav layui-layout-left">
				<!-- 移动端显示 -->
				<li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm"
					lay-header-event="menuLeft"><i
					class="layui-icon layui-icon-spread-left"></i></li>
				<!-- Top导航栏 -->
				<li class="layui-nav-item layui-hide-xs"><a href="">导航栏1</a></li>
				<li class="layui-nav-item layui-hide-xs"><a href="">导航栏2</a></li>
				<li class="layui-nav-item layui-hide-xs"><a href="">导航栏3</a></li>
				<li class="layui-nav-item"><a href="javascript:;">更多</a>
					<dl class="layui-nav-child">
						<dd>
							<a href="">menu 11</a>
						</dd>
						<dd>
							<a href="">menu 22</a>
						</dd>
						<dd>
							<a href="">menu 33</a>
						</dd>
					</dl></li>
			</ul>
			<!-- 个人头像及账号操作 -->
			<ul class="layui-nav layui-layout-right">
				<li class="layui-nav-item layui-hide layui-show-md-inline-block">
					<a href="javascript:;"> <img
						src="//tva1.sinaimg.cn/crop.0.0.118.118.180/5db11ff4gw1e77d3nqrv8j203b03cweg.jpg"
						class="layui-nav-img">用户主页
				</a>
					<dl class="layui-nav-child">
						<dd>
							<a href="">hi</a>
						</dd>
						<dd>
							<a href="">设置</a>
						</dd>
						<dd>
							<a href="login.jsp">退出登录</a>
						</dd>
					</dl>
				</li>
				<li class="layui-nav-item" lay-header-event="menuRight" lay-unselect>
					<a href="javascript:;"> <i
						class="layui-icon layui-icon-more-vertical"></i>
				</a>
				</li>
			</ul>
		</div>

		<div class="layui-side layui-bg-black">
			<div class="layui-side-scroll">
				<!-- 左侧导航区域(可配合layui已有的垂直导航) -->
				<ul id="menu" class="layui-nav layui-nav-tree" lay-filter="menu">
				</ul>
			</div>
		</div>

		<div class="layui-body">
			<!-- 内容主体区域 -->
			<div class="layui-tab" lay-allowclose="true" lay-filter="demo">
  <ul class="layui-tab-title">
    <li class="layui-this">标签1</li>
  </ul>
  <div class="layui-tab-content">
    <div class="layui-tab-item layui-show">内容-1</div>
  </div>
</div>
		</div>

		<div class="layui-footer">
			<!-- 底部固定区域 -->
			底部固定区域
		</div>
	</div>
	<script>
		//JS 
		var element,layer,util,$;
		layui
		.use(
		[ 'element', 'layer', 'util' ],
		function() {
		element = layui.element, layer = layui.layer, util = layui.util, $ = layui.$;
							$.ajax({
								url:"${pageContext.request.contextPath }/permission.action?methodName=menus",
								dataType:'json',
								success:function(data){
									console.log(data); 	
									var htmlStr = '';
									$.each(data,function(i,n){
										 htmlStr += '<li class="layui-nav-item layui-nav-itemed">';
										 htmlStr += '<a class="" href="javascript:;">'+n.text +'</a>';
										 if(n.hasChildren){
											 htmlStr += '<dl class="layui-nav-child">';
											var children = n.children;
											$.each(children,function(idx,node){
												htmlStr += '<dd><a href="javascript:;" onclick="openTab(\''+node.text+'\',\''+node.attributes.self.url+'\',\''+node.id+'\')">'+node.text +'</a></dd>';
											})
											htmlStr += '</dl>';
										 }
										 htmlStr += '</li>';
									})
									$("#menu").html(htmlStr);
									element.render("menu");//渲染  不加的话样式可能出不来
								}
							});
						});
/**
 * 1.参考官网是否有控件/模块能够支撑完成对应功能---->静态
 * 2.将静态的选项卡转换成动态的选项卡
 * 3.将选项卡的标签名变成实际菜单名
 * 4.重名的选项卡不能打开新的
 * 5.点击重名的选项卡虽然没打开但是也没有在对应点击二级菜单的选项卡内,所以我们还需要重名的选项卡在被点击时选中
 */
		function openTab(title,content,id){
	 		var $node = $('li[lay-id="'+id+'"]');
	 		console.log($node);
	 		if($node.length == 0){//如果点击的二级菜单length为0,那么就能打开一个新的选项卡
	 			element.tabAdd('demo', {
			        title: title //用于演示
			        ,content: content
			        ,id: id //实际使用一般是规定好的id,这里以时间戳模拟下
			      })
	 		}
	 		 //切换到指定Tab项
	 	      element.tabChange('demo', id); //切换到指定选项卡
		}
	</script>
</body>
</html>

PermissionDao:

package com.zking.dao;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.zking.entity.Permission;
import com.zking.util.BaseDao;
import com.zking.util.BuildTree;
import com.zking.util.PageBean;
import com.zking.util.TreeVo;

public class PermissionDao extends BaseDao<Permission> {
public List<Permission> list(Permission permission, PageBean pageBean) throws Exception {
	String sql = "select * from t_oa_permission";
	return super.executeQuery(sql, Permission.class, pageBean);
}

//将数据库查询出来的平级数据转换成父子数据
//把原本的平级关系对应的对象转成了能够构成父子TreeVo对象
public List<TreeVo<Permission>> menus(Permission permission, PageBean pageBean) throws Exception{
	List<TreeVo<Permission>> lst = new ArrayList<TreeVo<Permission>>();
	List<Permission> list = this.list(permission, pageBean);
	for (Permission p : list) {
		TreeVo<Permission> vo = new TreeVo<>();
		vo.setId(p.getId()+"");
		vo.setText(p.getName());
		vo.setParentId(p.getPid()+"");
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("self", p);
		vo.setAttributes(map);
		lst.add(vo);
	}
	return BuildTree.buildList(lst, "-1");
}
}

2.LayUI弹出层拓展


最后LayUI之选项卡组件就到这里,祝大家在敲代码的路上一路通畅!

感谢大家的观看 !

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用layui的`element`模块来实现选项卡切换。 首先,在HTML中添加选项卡的容器和对应的内容块,如下所示: ```html <div class="layui-tab layui-tab-card"> <ul class="layui-tab-title"> <li class="layui-this">选项卡1</li> <li>选项卡2</li> <li>选项卡3</li> </ul> <div class="layui-tab-content"> <div class="layui-tab-item layui-show">内容1</div> <div class="layui-tab-item">内容2</div> <div class="layui-tab-item">内容3</div> </div> </div> ``` 其中,`layui-tab`表示选项卡容器,`layui-tab-card`表示选项卡的样式,`layui-tab-title`表示选项卡的标题,`layui-tab-content`表示选项卡的内容。每个选项卡的标题使用`<li>`标签表示,选项卡的内容使用`<div>`标签表示,选项卡的默认显示使用`layui-this`类名表示。 然后,在JS中使用`element`模块来实现选项卡的切换,如下所示: ```javascript // 引入element模块 layui.use('element', function(){ var element = layui.element; // 监听选项卡切换事件 element.on('tab', function(data){ console.log(this); // 当前Tab标题所在的原始DOM元素 console.log(data.index); // 得到当前Tab的所在下标 console.log(data.elem); // 得到当前的Tab大容器 }); }); ``` 在`element`模块中,使用`element.on('tab', function(data){})`来监听选项卡切换事件。其中,`data.index`表示当前选项卡的下标,`data.elem`表示当前选项卡的大容器。 完整的代码如下所示: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>选项卡切换</title> <link rel="stylesheet" href="https://cdn.staticfile.org/layui/2.5.6/css/layui.min.css"> </head> <body> <div class="layui-tab layui-tab-card"> <ul class="layui-tab-title"> <li class="layui-this">选项卡1</li> <li>选项卡2</li> <li>选项卡3</li> </ul> <div class="layui-tab-content"> <div class="layui-tab-item layui-show">内容1</div> <div class="layui-tab-item">内容2</div> <div class="layui-tab-item">内容3</div> </div> </div> <script src="https://cdn.staticfile.org/layui/2.5.6/layui.min.js"></script> <script> layui.use('element', function(){ var element = layui.element; // 监听选项卡切换事件 element.on('tab', function(data){ console.log(this); // 当前Tab标题所在的原始DOM元素 console.log(data.index); // 得到当前Tab的所在下标 console.log(data.elem); // 得到当前的Tab大容器 }); }); </script> </body> </html> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kissship

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值